我有一个 VoIP 应用程序。哪个工作正常。呼叫在前台和后台工作。
完成以下步骤:
UIBackgroundModes => Info.plist 中的 voip
为 VoIP 使用配置了应用程序的一个套接字。
在移动到后台之前,调用了 setKeepAliveTimeout:handler:
配置音频会话以处理与活动使用之间的转换。
为了确保在 iPhone 上获得更好的用户体验,使用 Core Telephony 框架来调整与手机通话相关的行为;
为了确保 VoIP 应用程序的良好性能,使用系统配置框架来检测网络变化并让应用程序尽可能地休眠。
现在的事情是,当应用程序处于后台并且调用时 UILocalNotification 会触发以下内容。用户可以通过两个按钮 CANCEL 和 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 分钟内有任何呼叫,应用程序会触发 UILocalNotification。
10 分钟后,如果有任何来电,它就会在后台运行。UILocalNotification 不会触发,所以用户什么都不知道。
这是因为后台任务在 10 分钟后停止。
如何管理它或扩展后台任务以长期运行或重新启动后台任务。
我在搜索后找到了越来越多的答案,但对于长时间运行的后台任务没有任何作用。
请任何人帮助我。我从 2 周开始就在尝试。