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

时间:2013-10-09 13:11:00

标签: iphone ios objective-c voip uilocalnotification

我有一个VoIP应用程序。哪个工作正常。呼叫正在前台和后台工作。

完成以下步骤:

  1. UIBackgroundModes =>在Info.plist中的voip

  2. 为VoIP使用配置了应用程序的一个套接字。

  3. 在移至后台之前,调用setKeepAliveTimeout:handler:

  4. 配置音频会话以处理与活动使用之间的转换。

  5. 为了确保在iPhone上获得更好的用户体验,使用核心电话框架调整与基于手机的电话相关的行为;

  6. 为了确保VoIP应用程序的良好性能,使用系统配置框架来检测网络更改并允许应用程序尽可能地休眠。

  7. 现在的问题是,当应用程序处于后台并且来电时,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个星期开始尝试。

1 个答案:

答案 0 :(得分:0)

听起来您有一个接收呼叫的VoIP套接字,因此您可以在从套接字读取数据时提供本地通知,而不是循环和轮询呼叫状态。

如果VoIP控制套接字是TCP,并标有相应的...NetworkServiceTypeVoIP密钥,您的应用程序将自动从暂停状态唤醒10秒钟,此时您可以显示本地通知。

有关详细信息,请参阅Configuring Sockets for VoIP Usage

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