好吧,我正在制作这个Apple Watch应用程序,在我的手表应用程序中,我有一个按钮。当你触摸按钮时,它会这样做:
[WKInterfaceController openParentApplication:[NSDictionary dictionary] reply:^(NSDictionary *replyInfo, NSError *error) {
if(error) {
NSLog(@"%@",error);
}
}];
在我的应用程序代理文件中,我这样做:
-(void) application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
//Code that is not importent and is confidential
reply([NSDictionary dictionary]);
}
然而,当我按下按钮时,我得到了这个错误:
错误域=com.apple.watchkit.errors代码=2"iPhone应用程序中的UIApplicationDelegate从未在-[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]中调用过reply()"UserInfo=0x7fd2b9c35ae0{NSLocalizedDescription=iPhone应用程序的UIApplicationDelegate从未在-[IApplicationDelegateapplication:handle WatchKitExtensionsRequest:reply:]}中调用过reply()
如上所示,我正在调用reply()
,但它看不到!而且,它忽略了我在里面的其他代码!
有人能解释为什么会发生这种事吗?
来自文档:
replyInfo:包含要返回到WatchKit应用程序的数据的字典。字典的内容必须可序列化为属性列表文件这本字典的内容由你自己决定可以指定nil。
如果你不发送有效的词典,你将得不到回复。
您需要在后台任务中执行handleWatchKitExtensionRequest
中的所有工作。您可以在这里找到文档:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/IPhoneOSProgramingGuide/BackgroundExecution/BackgroundExecution.html
这篇博客文章可能也很有帮助:http://www.fiveminutewatchkit.com/blog/2015/3/11-one-bergy-trick-to-fix-openparentapplicationreply
错误"error Domain=com.apple.watchkit.errors Code=2"iPhone应用程序中的UIApplicationDelegate从未在-[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]中调用过reply()"通常意味着您的应用程序的handleWatchKitExtensionsRequest有错误和/或没有正确调用reply(()或调用它。
文件如下:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationdelete/application:handleWatchKitExtensionRequest:reply:
下面是一个使用NSDictionary响应的简单示例代码。
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply{
NSLog(@"containing app received message from watch");
NSDictionary *response = @{@"response" : @"MyResponse"};
reply(response);
}
如果字典中包含自定义类,您可能会遇到问题。试着先发送简单的字符串,看看这是否有什么不同。
检查您的"重要且机密"代码是否不会引发异常,或者在不调用回复的情况下完成(例如,带有错误负载)。
你的"重要和机密"代码必须非常快。如果不是这样,则必须使用后台任务(参见此处的示例)。
最后,如果您的代码需要时间,请考虑使用后台任务进行网络访问。如果您使用异步网络任务(推荐),请在收到答案时回复,并在该时间完成后台任务。
最后但同样重要的是,在某些iOS版本上,对parentApplication的第一次调用失败:我的WatchKit应用程序中openParentApplication的行为不一致。这为我解决了最后一个问题!
希望能有所帮助;-)