我試圖通過使用openParentApplication
從服務器請求數據並將其用在watch擴展中,但當主應用程序未運行時我沒有收到任何迴應在前臺。當主應用程序在前臺運行時,一切正常。openParentApplication只適用於應用程序在前臺運行時
4
A
回答
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()
}
}
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();
});
};
相關問題
- 1. 讓應用程序在前臺運行
- 2. 如何在iOS應用程序處於前臺時在後臺運行操作
- 3. 測距信標只適用於應用程序運行?
- 4. Android:應用程序在後臺或前臺運行? :S
- 5. 適用於Linux的C應用程序的運行時配置
- 6. 當應用程序未運行時在後臺運行SyncAdapter
- 7. 在前臺和後臺運行一個應用程序(時間共享)
- 8. onMessageReceived()在應用程序處於前臺時未調用
- 9. 只有當應用程序在前臺時,Toast纔會出現?
- 10. 使用Swift在應用程序在前臺運行時顯示推送通知
- 11. 在後臺運行應用程序IntentService
- 12. Android應用程序在後臺運行
- 13. Android,在後臺運行應用程序
- 14. 在後臺運行應用程序
- 15. 在後臺運行應用程序
- 16. 在後臺運行iOS應用程序
- 17. 在後臺運行的應用程序
- 18. iphone應用程序在後臺運行?
- 19. Android在後臺運行應用程序
- 20. 在後臺運行應用程序Cordova
- 21. 在後臺運行android應用程序?
- 22. 在後臺運行應用程序
- 23. 在後臺運行應用程序
- 24. 在後臺運行應用程序?
- 25. WatchOS應用程序在後臺運行
- 26. 在後臺運行應用程序android
- 27. 應用程序處於後臺時運行CLLocation
- 28. 用於在後臺運行應用程序的腳本腳本
- 29. 將應用程序置於前臺
- 30. iPhone - 在應用程序在後臺運行時更改應用程序設置
非常感謝你的通信現在工作,但是當應用程序沒有在前臺運行我得到這個錯誤:**的iPhone應用程序從來沒有所謂的回覆()** –
@mohammedalwaili確保您撥打的回覆(無),從你的比賽處理者,也如果你有其他處理失敗。您必須從應用程序handleWatchKitExtensionRequest中針對每種可能的方案調用reply(nil):成功/失敗。 – Greg
非常感謝您的幫助,現在一切正常。 –