在后台10分钟后,UILocalNotification不会触发
我有一个VoIP应用程序。 哪个工作正常。 呼叫在前台和后台工作。
以下步骤完成:
-
UIBackgroundModes =>在Info.plist中的VoIP
-
为VoIP使用configuration了其中一个应用套接字。
-
在移动到后台之前,setKeepAliveTimeout:handler:被调用
-
configurationaudio会话来处理转入和转出活动使用。
-
为了确保在iPhone上获得更好的用户体验,使用核心电话框架来调整与基于蜂窝的电话呼叫相关的行为;
-
为确保VoIP应用的良好性能,使用“系统configuration”框架来检测networking更改,并尽可能让应用hibernate。
现在的情况是,当应用程序在后台,一个电话来,然后UILocalNotification触发以下。 用户可以通过两个buttonCANCEL和RECEIVE看到通知
- (void)applicationDidEnterBackground:(UIApplication *)application { bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ [application endBackgroundTask: bgTask]; bgTask = UIBackgroundTaskInvalid; }]; dispatch_async(dispatch_get_main_queue(), ^{ while ([application backgroundTimeRemaining] > 1.0) { NSString *friend = [self checkForIncomingChat]; if ([friend length]>0) { [[UIApplication sharedApplication] cancelAllLocalNotifications]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; if (localNotif) { localNotif.alertBody = [NSString stringWithFormat: NSLocalizedString(@"%@", nil), friend]; localNotif.alertAction = NSLocalizedString(@"Receive", nil); localNotif.soundName = @"alarmsound.caf"; localNotif.applicationIconBadgeNumber = 1; [application presentLocalNotificationNow:localNotif]; friend = nil; } } sleep(1); } [application endBackgroundTask:self->bgTask]; self->bgTask = UIBackgroundTaskInvalid; }); } - (NSString *) checkForIncomingChat { NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *incall = [prefs objectForKey:@"incall"]; if ([incall length]>0) { [prefs setObject:@"" forKey:@"incall"]; return incall; } return @""; };
现在的问题是:
如果任何通话在10分钟内到达,则通过按主页button应用程序进入背景后触发UILocalNotification。
如果有任何来电10分钟,它将在后台运行。 UILocalNotification不会触发,所以用户不知道任何东西。
这是因为后台任务在10分钟后停止。
我如何pipe理它或延长后台任务长时间运行或重新启动后台任务。
search后发现越来越多的答案,但长期运行的后台任务没有任何作用。
请有人帮助我。 我正在尝试,因为2周。
这听起来像你有一个VoIP套接字,你正在接受的呼叫,所以,而不是循环和轮询的通话状态,你可以只提出本地通知的地方,你读的数据从套接字。
如果VoIP控制套接字是TCP,并用相应的...NetworkServiceTypeVoIP
键标记,则您的应用程序将自动从暂停状态唤醒10秒钟,此时您可以显示本地通知。
有关更多信息,请参阅configuration套接字以使用VoIP 。
一旦完成,上面共享的所有代码都可以被删除。