iOS 9:在timout

时间:2017-02-16 06:12:38

标签: ios objective-c uilocalnotification uibackgroundtask

我正在进行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秒,即我不知道为什么这不起作用?

3 个答案:

答案 0 :(得分:1)

我建议您在此结构中放置代码并使用此代码

-(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
    });
});
}

答案 1 :(得分:1)

在构建VOIP应用程序时,您可以在info.plist中将-pg 541设置为UIBackgroundModes,将voip设置为UIApplicationExitsOnSuspend以允许后台任务。< / p>

查看this apple help page on&#34;声明应用程序支持的后台任务&#34;了解更多信息。

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

另见SO上的this answer

答案 2 :(得分:1)

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

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