【发布时间】:2015-06-08 07:40:34
【问题描述】:
我正在尝试使用openParentApplication 从服务器请求数据并在手表扩展中使用它,但是当主应用程序未在前台运行时,我没有得到任何返回。当主应用程序在前台运行时,一切正常。
【问题讨论】:
标签: ios objective-c iphone watchkit apple-watch
我正在尝试使用openParentApplication 从服务器请求数据并在手表扩展中使用它,但是当主应用程序未在前台运行时,我没有得到任何返回。当主应用程序在前台运行时,一切正常。
【问题讨论】:
标签: ios objective-c iphone watchkit apple-watch
我之前遇到过这个问题,原因是您没有注册长时间运行的后台操作并且系统将其杀死。 这就是我的排序方式,请参阅 cmets 以获得解释,这些都在 AppDelegate 文件中,并且它在 swift 中,但您可以轻松地将其移植到 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()
}
}
【讨论】:
只需添加一些等效的 Obj-c 即可,尽管我使用的是直接 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();
});
};
【讨论】: