backgroundTask没有在iOS中完成

时间:2016-11-19 10:44:17

标签: ios objective-c background-process

我有以下代码在应用程序即将退出之前调用服务器。我的问题是,代码有时会起作用,有时候不行。绝大多数没有。这是代码:

//Set the user as in-active if app is force closed
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    NSLog(@"called");

    bgTask = [application beginBackgroundTaskWithName:@"setInActive" expirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;

    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSLog(@"disp called");

        //If the app is about to exit make the user inactive
        [[APIManager sharedInstance] setInActiveOnCompletion:^(BOOL finished){
            [application endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];

    });

}

每次都会调用第一个NSLog。然而,第二个没有。似乎应用程序甚至没有进入dispatch_async方法。

编辑所以基本上我需要做的就是告诉服务器用户已经强制退出应用程序,而该用户已登录。我怎么能这样做?

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

当您的应用程序在后台时,只允许进行非常少量的处理,因此使用dispatch_async将不会为您带来更多的额外时间。此外,Apple不希望这样。

答案 1 :(得分:0)

applicationWillTerminate是应用程序终止前调用的最后一个方法!!因此,在此之后您无法执行任何操作,如果您想在后台执行某些操作,然后在执行操作时开始执行该任务,则无法从background task开始applicationWillTerminate,因为您的应用不会在这个方法调用后进入后台!!