2015-06-08 73 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(); 
    }); 
};