ios – Watchkit新会话不起作用

ios – Watchkit新会话不起作用,第1张

概述我的手表扩展中有两个视图控制器.每当我打电话时 [[WCSession defaultSession] sendMessage:applicationData replyHandler:^(NSDictionary *reply) {} 我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误 Error Domain=WCErrorDomain Code=7011 "M 我的手表扩展中有两个视图控制器.每当我打电话时
[[WCSession defaultSession] sendMessage:applicationData replyHandler:^(NSDictionary *reply)  {}

我只得到第一个视图控制器的响应,并在第二个vIEwcontroller中得到错误

Error Domain=WCErrorDomain Code=7011 "Message reply Failed." UserInfo={NSUnderlyingError=0x79f1f100 {Error Domain=WCErrorDomain Code=7010 "Payload contains unsupported type."UserInfo={NSLocalizedRecoverySuggestion=Only pass valID types.,NSLocalizedDescription=Payload contains unsupported type.}},NSLocalizedDescription=Message reply Failed.}

WCSession在app和watch扩展中启动.任何建议?

解决方法 在 WCSessionDelegate’s - session:didReceiveMessage:replyHandler:方法中,replyHandler参数定义为[String:AnyObject]. AnyObject部分具有误导性.它只能包含 property list数据类型: NSData,NSString,NSArray,NSDictionary,NSDate,and NSNumber.(在这种情况下,为什么选择AnyObject是有道理的,因为除了NSObject之外,这6种数据类型不会从公共子类继承.)

通常有人提到NSCoding and NSKeyedArchiver可以解决这个问题,但除此之外我还没有看到更多的例子/解释.

需要注意的是,replyHandler字典并不关心序列化.您可以使用NSKeyedArchiver,JsON,您自己的自定义编码等.只要字典只包含那6种数据类型,replyHandler就会很高兴.否则,您将看到Payload包含不受支持的类型.错误.

因此,您永远不能像这样调用回复处理程序:replyHandler([“response”:myCustomObject),即使myCustomObject完美地实现了NSCoding协议.

编码选择摘要:

> NSCoding:主要优点是当你取消归档时,它会自动找到正确的类并为你实例化它,包括其子图中的任何对象.
> JsON
>自定义编码:一个优点是您的对象不会被强制从NSObject继承,这在Swift中有时很有帮助.

如果您使用NSCoding,这就是它的样子:

iPhone App:

func session(session: WCSession,dIDReceiveMessage message: [String : AnyObject],replyHandler: ([String : AnyObject]) -> VoID) {    let data = NSKeyedArchiver.archivedDataWithRootObject(myCustomObject)    replyHandler(["response": data])}

观看应用:

WCSession.defaultSession().sendMessage([],replyHandler: {        response -> VoID in        let myCustomObject = NSKeyedUnarchiver.unarchiveObjectWithData(response["response"])    },errorHandler: nil)

请注意,如果要在取消归档对象时从崩溃中恢复,则需要使用新的iOS 9 API,unarchiveTopLevelObjectWithData,如果出现问题则会抛出错误.

注意:您的自定义对象必须从NSObject继承,否则归档时会出现以下错误:

*** NSForwarding: warning: object … of class ‘Foo’ does not implement methodSignatureForSelector: — trouble ahead Unrecognized selector -[Foo replacementObjectForKeyedArchiver:]

总结

以上是内存溢出为你收集整理的ios – Watchkit新会话不起作用全部内容,希望文章能够帮你解决ios – Watchkit新会话不起作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1098517.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存