【发布时间】:2015-07-03 15:23:14
【问题描述】:
我正在开发一个 Apple Watch 应用程序,它使用 openParentApplication:reply: 方法与其父应用程序进行通信。
父应用与 Web 服务通信,并通过调用 reply 方法和包含数据的 NSDictionary 将其获取的数据发送回手表扩展。
当父应用在前台或后台打开时,该应用可以完美运行。但是如果我打开父应用程序然后使用任务切换器终止它,手表扩展程序第一次调用openParentApplication:replyInfo:,它会收到以下错误并且参数replyInfo 为nil。
UIApplicationDelegate in the iPhone App never called reply()
但是在此之后,扩展程序发出的每个openParentApplication:replyInfo: 呼叫都会得到正确的响应。
我检查并发现手表扩展第一次拨打电话时,handleWatchKitExtensionRequest:reply: 永远不会在父应用上被调用。
这可能是什么原因?
按照文档中的建议,我正在后台任务中执行 handleWatchKitExtensionRequest:reply: 中的所有操作。这是我的一些代码:
我的扩展代码:
NSDictionary *params = @{@"requestCode": @(RequestGetLoggedIn)};
[WKInterfaceController openParentApplication:params reply:^(NSDictionary *replyInfo, NSError *error) {
// Do something with the result
}];
来自父应用的代码:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply
{
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
}];
NSNumber* requestCode = userInfo[@"requestCode"];
// Perform some request and then call reply()
// End the background task
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
});
}
编辑 1:问题出现在模拟器和真正的 Apple Watch 上。
【问题讨论】:
-
或许my answer here可以帮到你
-
我认为情况并非如此,因为在第一次通话后一切正常。如果
application:didFinishLaunchingWithOptions:出现问题,则应用程序永远不会在后台打开,因此调用将永远不会得到任何响应。 -
回应编辑#2:为什么在方法结束时启动后台任务会有帮助?您需要立即启动后台任务并在其中执行您的工作。我认为这不是 iOS 中的错误。听起来您的应用在有机会回复之前就被杀死了(由于缺少后台任务)。
-
Edit 2 是对以下答案的回应,是的,正如预期的那样,它没有改变任何东西,所以我刚刚删除了它。关于您的评论,在我上面的代码中,我已经立即开始任务,然后再执行其他任何操作。此外,如果问题在后台被杀死,那么我的电话总是会失败,不仅仅是第一次。我在下面的答案中的日志强烈表明这是由于操作系统的不稳定行为造成的。如果仅在扩展程序出现错误后启动父应用程序,则无法发回响应。
标签: ios watchkit apple-watch