Как сохранить соединение с веб-сокетами iphone ios в фоновом режиме?

#ios #iphone #objective-c #ipad #socket.io

#iOS #iPhone #objective-c #iPad #socket.io

Вопрос:

Я создал приложение для чата с помощью SocketRocket, когда я выхожу из приложения (войдите в фоновый режим) Я хочу получить сообщение чата! итак, я мог бы сделать это, назвав это VoIP-приложением, но некоторые люди говорят, что Apple отклонит его из App Store, если он также действительно не использует VoIP. Итак, как я могу это сделать, и если единственный способ сделать это — вызвать приложение VoIP, как WhatsApp справляется с этой ситуацией??

Вот что я сделал, чтобы приложение работало в фоновом режиме:

 - (void)applicationDidEnterBackground:(UIApplication *)application
{


 NSLog(@"Application entered background state.");
    NSAssert(self.backgroundTask == UIBackgroundTaskInvalid, nil);
    self.didShowDisconnectionWarning = NO;

self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Background task expired");
        if (self.backgroundTimer)
        {
            [self.backgroundTimer invalidate];
            self.backgroundTimer = nil;
        }
        [application endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    });
}];

dispatch_async(dispatch_get_main_queue(), ^{
    self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerUpdate:) userInfo:nil repeats:YES];
});

}


- (void) timerUpdate:(NSTimer*)timer {
    UIApplication *application = [UIApplication sharedApplication];

    NSLog(@"Timer update, background time left: %f", application.backgroundTimeRemaining);

    if ([application backgroundTimeRemaining] < 60 amp;amp; !self.didShowDisconnectionWarning)
    {
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];
        if (localNotif) {
            localNotif.alertBody = @"Background session will expire in one minute.";
            localNotif.alertAction = @"OK";
            localNotif.soundName = UILocalNotificationDefaultSoundName;
            [application presentLocalNotificationNow:localNotif];
        }
        self.didShowDisconnectionWarning = YES;
    }
    if ([application backgroundTimeRemaining] < 10)
    {
        // Clean up here
        [self.backgroundTimer invalidate];
        self.backgroundTimer = nil;

        [application endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }

}
  

Ответ №1:

Я считаю, что ваш единственный вариант — использовать удаленные уведомления. Вам нужно, чтобы ваше приложение регистрировалось для них, а ваш сервер определял, когда ваше приложение не запущено (т. Е. Подключено через сокет), а Затем отправлял уведомление вместо этого.

Комментарии:

1. спасибо, но я не думаю, что другие приложения используют APNS для этого, я отследил много приложений для чатов, и, похоже, они используют удаленные уведомления, когда приложение работает в фоновом режиме!!

2. @MKAlatrash, ты говоришь, что они работают или нет?

Ответ №2:

Вы не можете поддерживать свой TCP-сокет в фоновом режиме, как я добился этой функции всякий раз, когда applicationDidEnterBackground вызывал отключение сокета, а applicationDidBecomeActive Подключал сокет, чтобы сервер знал, что клиентский сокет отключен, а затем сохранял сообщение в автономной таблице. На веб-сервере было расписание, которое периодически запускается для отправки push-уведомлений. всякий раз, когда пользователь получает push-уведомление и пользователь нажимает на него, вам необходимо создать поток для запуска правильного диалога на основе параметра, который вы получаете в словаре удаленных уведомлений.