繁体   English   中英

“ iPhone应用程序中的UIApplicationDelegate从未在-[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]中调用reply()”

[英]“The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]”

好的,所以我要制作这个Apple Watch应用程序,在我的Watch App中,我有一个按钮。 当您触摸按钮时,它将执行以下操作:

[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]);
}

但是当我按下按钮时,我得到了这个错误:

错误Domain = com.apple.watchkit.errors代码= 2“ iPhone应用程序中的UIApplicationDelegate从未在-[UIApplicationDelegate应用程序:handleWatchKitExtensionRequest:reply:]中调用Reply()”“ UserInfo = 0x7fd2b9c35ae0 {NSLocalizedDescription = iPhone应用程序中的UIApplicationDelegate从未在[[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]}中称为reply()

我正在如上所示调用reply() ,但没有看到它! 另外,它忽略了我在其中的其他代码!

谁能解释为什么会这样?

从文档中:

replyInfo:包含要返回到WatchKit应用程序的数据的字典。 字典的内容必须可序列化到属性列表文件。 该词典的内容由您自行决定,您可以指定nil。

如果您没有发送有效的词典,您将不会得到答复。

您需要在后台任务中在handleWatchKitExtensionRequest中执行所有工作。 您可以在这里找到文档: https : //developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

该博客文章也可能会有所帮助: http : //www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-trick-to-fix-openparentapplicationreply

错误“错误域= com.apple.watchkit.errors代码= 2”错误通常表示您的应用程序的handleWatchKitKitExtensionRequest发生了错误,并且/或未调用reply()或未正确调用它。

该文档位于: https : //developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/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 App中openParentApplication的行为不一致 这为我解决了最后一个问题!

希望有帮助;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM