#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-уведомление и пользователь нажимает на него, вам необходимо создать поток для запуска правильного диалога на основе параметра, который вы получаете в словаре удаленных уведомлений.