2015-06-08 32 views

回答

10

我之前有过这个问题,原因是您还没有注册长时间运行的后台操作,系统将其杀死。 这是我整理这一点,请参阅解释的意见,这是所有的AppDelegate文件并将其迅速,但你可以很容易地移植到Objective-C的:

private var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid 

func registerBackgroundTask() { 
     backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { 
      [unowned self] in 
      self.endBackgroundTask() 
     } 
     assert(backgroundTask != UIBackgroundTaskInvalid) 
    } 

func endBackgroundTask() { 
    UIApplication.sharedApplication().endBackgroundTask(backgroundTask) 
    backgroundTask = UIBackgroundTaskInvalid 
} 

// MARK: - Watch Kit 
func application(application: UIApplication, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)!) { 

    registerBackgroundTask() 

    // Fetch the data from the network here 
    // In the competition handler you need to call: 
    // the nil can be replaced with something else you want to pass back to the watch kit 
    reply(nil) 
    if self.backgroundTask != UIBackgroundTaskInvalid { 
     self.endBackgroundTask() 
    } 
} 
+0

非常感谢你的通信现在工作,但是当应用程序没有在前台运行我得到这个错误:**的iPhone应用程序从来没有所谓的回复()** –

+1

@mohammedalwaili确保您拨打的回复(无),从你的比赛处理者,也如果你有其他处理失败。您必须从应用程序handleWatchKitExtensionRequest中针对每种可能的方案调用reply(nil):成功/失败。 – Greg

+0

非常感谢您的帮助,现在一切正常。 –

2

只是增加了一些对象 - 相当于该做到这一点,虽然我的直接使用GCD,所以它是一个稍微不同的方法。

__block UIBackgroundTaskIdentifier identifier = UIBackgroundTaskInvalid; 
dispatch_block_t endBlock =^{ 
    if (identifier != UIBackgroundTaskInvalid) { 
     [application endBackgroundTask:identifier]; 
    } 
    identifier = UIBackgroundTaskInvalid; 
}; 
identifier = [application beginBackgroundTaskWithExpirationHandler:endBlock]; 

reply = ^(NSDictionary *replyInfo) { 
    reply(replyInfo); 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{ 
     endBlock(); 
    }); 
};