UILocalNotification 在后台 10 分钟后不会触发

Posted

技术标签:

【中文标题】UILocalNotification 在后台 10 分钟后不会触发【英文标题】:UILocalNotification does not fire after 10 minutes in background 【发布时间】:2013-10-09 13:10:59 【问题描述】:

我有一个 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 周开始就在尝试。

【问题讨论】:

我遇到了类似的问题......我发现我的应用在设置/后台应用刷新中禁用了“后台......”(ios7) 您在以前的版本中是如何解决的?我正在使用 iPhone-3gsiPhone-4iPhone-5 【参考方案1】:

听起来您有一个正在接收呼叫的 VoIP 套接字,因此无需循环和轮询呼叫状态,您只需在从套接字读取数据时显示本地通知即可。

如果 VoIP 控制套接字是 TCP,并标有适当的 ...NetworkServiceTypeVoIP 键,您的应用将自动从挂起状态唤醒 10 秒,此时您可以呈现本地通知。

更多信息请参见Configuring Sockets for VoIP Usage。

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

【讨论】:

以上是关于UILocalNotification 在后台 10 分钟后不会触发的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification 在后台 10 分钟后不会触发

UILocalNotification 可以用来唤醒后台的任务吗

如果应用程序在后台,UILocalNotification 如何调用某些方法

在后台应用程序中触发计时器并显示 UILocalNotification

从后台杀死应用程序后 UILocalnotification 不起作用

UILocalNotification 触发时自动将应用程序从后台带到前台?