Сбой AsyncSocket в спящем режиме для iPad

введите описание изображения здесьЯ использую robbiehanson/CocoaAsyncSocket для асинхронного сокета, когда мой iPad переходит в фоновое состояние, я отключаюсь и закройте все порты, но иногда, когда iPad выходит из спящего режима, происходит сбой, то же самое происходит с симулятором, когда Mac переходит в спящий режим. Как только я получил журнал сбоев, поскольку [AsyncSocket close] нераспознанный экземпляр отправляется в селектор.

Я не могу найти решение для этого, может ли кто-нибудь помочь мне в этом. Ниже мой код для отключения.

- (void) enterBackground
{

  if (self.discoveryUdpSocket!=nil)
 {
    self.discoveryUdpSocket.delegate = nil;
    [self.discoveryUdpSocket close];
 }

  self.discoveryUdpSocket.delegate = nil;
  self.discoveryUdpSocket = nil;

}

Отчет об ошибке 1

Отчет о сбое 2


person Prerna chavan    schedule 24.01.2014    source источник


Ответы (1)


Вы пытались увеличить время при входе в фоновый режим, чтобы позволить платформе сокетов завершить свою работу?

Я имею в виду добавить в приложение делегат метода:

-(void)applicationDidEnterBackground:(UIApplication *)application {
        UIApplication *app = [UIApplication sharedApplication];
        __block UIBackgroundTaskIdentifier bgTask = 0;
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"Times up!");
            [application endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];
        // Let the async socket to complete its job and finally close the connection
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"Finishing job and closing async socket, time remaining=%f", [app backgroundTimeRemaining]);
            // Calling your background routine
            [self enterBackground];
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
}

Это хороший способ завершить важную работу непосредственно перед тем, как приложение будет приостановлено. У вас есть максимум 180 секунд.

person Artur Kucaj    schedule 24.01.2014
comment
Должен ли я добавить это до или после метода закрытия сокета? - person Prerna chavan; 27.01.2014
comment
Добавлен код, который вызывает ваш метод enterBackground. Надежда должна работать. - person Artur Kucaj; 28.01.2014
comment
Показать вывод журнала при сбое приложения - person Artur Kucaj; 31.01.2014
comment
Я добавил отчет о сбое к вопросу - person Prerna chavan; 31.01.2014
comment
@Prernachavan, спасибо за отчет, но, к сожалению, он бесполезен, пожалуйста, обозначьте его символом, посмотрите, например, здесь Символизация журнала сбоев iOS или Обзор отчетов о сбоях iOS - person Artur Kucaj; 31.01.2014
comment
Хм, вы сказали, что это происходит и на симуляторе, поэтому попробуйте добавить точку останова в objc_exception_throw, чтобы узнать, где и почему именно возникает исключение. Кроме того, вы можете использовать оператор try/catch. Как добавить точку останова в objc_exception_throw? - person Artur Kucaj; 03.02.2014