首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UILocalNotification在后台10分钟后不会开火

UILocalNotification在后台10分钟后不会开火
EN

Stack Overflow用户
提问于 2013-10-09 13:10:59
回答 1查看 779关注 0票数 1

我有一个VoIP应用程序。效果很好。呼叫在前台和后台工作。

完成了以下步骤:

  1. UIBackgroundModes => voip在Info.plist中的应用
  2. 为VoIP的使用配置了应用程序的一个套接字。
  3. 在移到后台之前,setKeepAliveTimeout:handler:被调用
  4. 配置音频会话以处理往返活动使用的转换。
  5. 为了确保在iPhone上有更好的用户体验,使用核心电话框架来调整与基于手机的电话通话相关的行为;
  6. 为了确保VoIP应用程序的良好性能,使用系统配置框架来检测网络变化,并允许应用程序尽可能多地睡眠。

现在的问题是,当应用程序处于后台,然后调用时,UILocalNotification会触发以下内容。用户可以看到一个带有两个按钮的通知,“取消”和“接收”。

代码语言:javascript
复制
- (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 @"";
};

现在的问题是:

通过按home按钮进入后台后,应用程序会在10分钟内触发UILocalNotification。

10分钟后,如果有任何呼叫出现,它将在后台运行。UILocalNotification不触发,所以用户什么都不知道。

发生这种情况是因为后台任务在10分钟后停止。

如何管理它或扩展后台任务以便长期运行或重新启动后台任务。

我在搜索后找到了越来越多的答案,但是对于长期运行的背景任务来说,没有什么是有效的。

请大家帮帮我。我已经试了两周了。

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 02:33:33

听起来您有一个正在接收调用的VoIP套接字,所以您可以只在从套接字上读取数据时显示本地通知,而不是循环和轮询调用状态。

如果VoIP控件套接字是TCP,并使用适当的...NetworkServiceTypeVoIP键标记,您的应用程序将自动从挂起唤醒10秒,此时您可以显示本地通知。

有关详细信息,请参阅为VoIP使用配置套接字

一旦完成,您上面共享的所有代码都可以删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19273039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档