Подтвердить что ты не робот

PurgeIdleCellConnections

О "дублированном" состоянии этого вопроса:
Этот вопрос здесь был задан в ноябре 2012 года, он содержит подробное описание проблемы и имеет 3 ответа.
Вопрос, упомянутый как "оригинал", был задан в феврале 2013 года (через 3 месяца после этого "дубликата" ), не имеет подробного описания и только 2 ответа. Лучший из двух ответов - это всего лишь ответ только для ссылок.


Почему я получаю это сообщение в консоли?:

purgeIdleCellConnections: found one to purge conn = (some object-ID)

Когда мое приложение запускается, я отправляю сообщение на свой сервер. Я делаю это с помощью этих строк кода:

@implementation AppStatus {
    NSMutableData*   activeDownload;
    NSURLConnection* Connection;
}

- (id) init {
    self = [super init];
    if (self) {
        activeDownload = nil;
        Connection     = nil;
    }
    return self;
}

- (void)sendStatus:(NSString*)url {
    NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
    Connection = conn;
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}

В том же файле у меня есть эти методы-делегаты:

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
    NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
    [activeDownload appendData:data];
}

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {
    NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
    activeDownload = nil;
    Connection = nil;
    //do nothing else; just ignore the error
}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
    NSString* answer = [[NSString alloc] initWithData:activeDownload encoding:NSUTF8StringEncoding];
    //do something usefull with the server answer
    activeDownload = nil;
    Connection = nil;
}

Когда я запускаю это приложение на реальном устройстве (не на симуляторе), я получаю это сообщение в консоли:

2012-11-22 20:41:51.309 BookMan[376:907] -[AppStatus sendStatus:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.929 BookMan[376:907] -[AppStatus connection:didReceiveData:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.935 BookMan[376:907] -[AppStatus connectionDidFinishLoading:] Connection=<NSURLConnection: 0x1dd7ff40>
purgeIdleCellConnections: found one to purge conn = 0x1dd8ff60

Сообщение purgeIdleCellConnections появляется примерно через 4 или 5 секунд после сообщения connectionDidFinishLoading.

Как вы можете видеть, номер объекта сообщения purgeIdleCellConnections не совпадает с номером соединения, которое я создал и использовал в своем приложении.

Возможно ВАЖНО: я получаю это сообщение только при запуске приложения на реальном устройстве (iPhone 4 с iOS 6.0.1). Это устройство использует 3G-соединение, а не WIFI-соединение. На данный момент у меня нет WIFI-сети, чтобы проверить, действительно ли это происходит на WIFI-подключении.
Я не получаю это сообщение, когда запускаю приложение на симуляторе.

Когда я меняю метод sendStatus: на это:

- (void)sendStatus:(NSString*)url {
    NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
    //Connection = conn;
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}

Я получаю этот вывод в консоли:

2012-11-22 20:45:11.927 BookMan[391:907] -[AppStatus sendStatus:] Connection=(null)

Я не получаю сообщение purgeIdleCellConnections, когда не создаю соединение.


Итак, что означает это сообщение и почему я его получаю?

purgeIdleCellConnections: found one to purge conn = (some object-ID)
4b9b3361

Ответ 1

Это означает, что соединение, которое слишком долгое время простаивало, закрыло TCP-соединение. Это основной механизм, и он не должен беспокоить вас, поскольку Apple заявляет о Technical QA1774, это сообщение об ошибке, которое было ошибочно, разрешено.

Этот журнал действительно отображается только при удалении WWAN-соединений.

Ответ 2

Да, это ОС, закрывающая активные соединения по сотовым данным, только 3G. Вы не должны видеть это с помощью Wi-Fi-соединения. Похоже, что очистка соединений с ОС добавляет немного времени для отправки запроса данных на сервер.

Ответ 3

Когда на устройстве, подключенном к сотовой сети, я заметил это отладочное сообщение, выходящее из SDK iOS 6.0. С учетом времени я считаю, что это коррелирует с "активными" вызовами AJAX, которые заканчиваются в моем приложении. Однако это очень сложно доказать, так как это происходит только при рендеринге веб-страницы в UIWebView. Я просто говорю, что я не думаю, что сообщения являются доброкачественными. Я думаю, что они могут указывать на ошибку в структуре Apple, которая чрезмерно агрессивна при завершении соединений. Трудно получить инструментарий на javascript, запущенном внутри UIWebView, который вызывает вызовы AJAX, поэтому в это время все они очень спекулятивны.