0

我正在处理 VOIP 呼叫并添加对 iOS < 10 的支持。对于当应用程序处于后台时传入的 VOIP 呼叫,我正在使用 UILocalNotification(在 iOS 10 中已弃用)。

要在 60 秒(或 1 分钟)内拨打电话,我正在使用此代码

    count = 0;
                    apnTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                                                target:self
                                                              selector:@selector(showIncomingCall:)
                                                              userInfo:userInfo
                                                               repeats:YES];
    self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
                        NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING.");
                        [application endBackgroundTask:self.backgroundTask]; 
                        self.backgroundTask = UIBackgroundTaskInvalid;
                    }];


    -(void)showIncomingCall:(NSTimer *)timer
{
    if (count < 60)
    {

            UIApplication *application = [UIApplication sharedApplication];
            [application presentLocalNotificationNow:localNotification];
            NSLog(@"Time Remaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);

        count = count + 3;
        return;
    }

    // TIMEOUT : STOP TIMER AND LOCAL NOTIFICATION BACKGROUND TASK
    [self invalidateCallNotifying];
}

-(void)invalidateCallNotifying
{
    [apnTimer invalidate];
    if (self.backgroundTask != UIBackgroundTaskInvalid)
    {
        [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }
}

将后台进程时间延长到 1 分钟,它在 iOS 10.1.1 (iPhone) 中工作,但在 iOS 9.3.5 (iPad) 中不工作。不知何故,处理程序正在调用 30-33 秒?

更新:

我试图评论这段代码:

self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
                        NSLog(@"ALVOIP : BACKGROUND_HANDLER_NO_MORE_TASK_RUNNING.");
                        [application endBackgroundTask:self.backgroundTask]; 
                        self.backgroundTask = UIBackgroundTaskInvalid;
                    }];

我仍然可以做 30-33 秒,即我不知道为什么这不起作用?

4

3 回答 3

0

我建议您将代码放入此结构并使用此代码

-(void)yourMethod
{
 __block UIBackgroundTaskIdentifier background_task;
background_task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){
    [[UIApplication sharedApplication] endBackgroundTask: background_task];
    background_task = UIBackgroundTaskInvalid;
}];

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//Some Methods Calls

    dispatch_async(dispatch_get_main_queue(), ^{
        //View Controller Change
    });
});
}
于 2017-02-16T06:47:33.247 回答
0

在构建 VOIP 应用程序时,您应该能够在 info.plist 中设置UIBackgroundModes并允许后台任务。voipUIApplicationExitsOnSuspendNO

查看有关“声明您的应用程序支持的后台任务”的苹果帮助页面以获取更多信息。

当我上次构建在后台运行的应用程序时(尽管它是用于后台定位服务,而不是用于 voip 应用程序),我不得不在应用程序商店列表中放置关于该应用程序使用过长电池寿命的免责声明。不过,我不确定这是否相关。

另请参阅SO 上的此答案

于 2017-02-16T12:53:57.763 回答
0

我建议你安排几个 UILocalNotification,而不是使用 NSTimer,每个都有一个增加的 fireDate,然后将你的 UILocalNotification 声音设置为最后一个增加的间隔。例如,假设您的声音可以持续 20 秒,那么您将 3 UILocalNotification 与 fireDate 安排在从现在开始的 0、+20、+40 秒。

当然,如果用户接听您的电话,您需要取消剩余的 UILocalNotification。

于 2017-02-20T07:38:20.517 回答