2015-10-06 94 views
4

我有我的手表extension.Whenever我打电话Watchkit新的会话不起作用

[[WCSession defaultSession] sendMessage:applicationData replyHandler:^(NSDictionary *reply) {} 

双视角控制器我只得到了第一个视图控制器响应和错误在我的第二个视图 - 控制

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是在应用程序和手表扩展中启动的。任何建议?

回答

1

我通过在字典格式直接发送JSON字符串从iPhone应用程序的appDelegate

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler { 

回调方法而不是JSON字典转换为正常字典解决它。 并转换这个JSON字典正常辞典表视图 - 控制回调方法

[[WCSession defaultSession] sendMessage:applicationData 
          replyHandler:^(NSDictionary *reply) {} 

由于我打电话从表两种不同viewcontrollers这种方法,从iPhone应用程序发送正常字典观看正常工作的第一次但由于某些原因,我得到了这个问题的错误,如果我从iPhone应用程序发送词典来监视手表的第二个视图控制器。

7

“有效载荷包含不受支持的类型”可能意味着您要在消息字典中发送自定义对象。您需要序列化此数据以仅包含受支持的类型(NSNumber,NSDate,NSString,NSData,NSArray和NSDictionary)。

我有一个github项目,可以自动将您的自定义对象序列化为安全的用于watchkit转移。你可以看看here

+0

是的,这是问题。顺便说一下,如果我发送字符串,但它会抛出一个错误,如果我做NSString * str1 = [response valueForKey:@“d”]; NSData * data1 = [str1 dataUsingEncoding:NSUTF8StringEncoding]; NSMutableDictionary * mainDict1 = [NSJSONSerialization JSONObjectWithData:data1 options:NSJSONReadingMutableContainers error:nil]; – YaBoiSandeep

+0

你有你的github项目的客观c – YaBoiSandeep

+0

不,第二次没有工作,我打电话给同样的方法2次。 – YaBoiSandeep

0

我意外地将超过400个数据对象传输到手表时看到此错误。限制为20个对象修复了错误。

2

使用NSKeyedArchiver/NSKeyedUnarchiver可以序列化任何实现NSCoding的对象。

要存档:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: entries]; 

如果条目是实现NSCoding对象的数组。

要解除封存:

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSCoding是你要实现这样的两个方法的协议。

-(id) initWithCoder: (NSCoder *)decoder { 
    if(self = [super init]){ 
    self.yourpoperty = [decoder decodeObjectForKey:@"PROPERTY_KEY"]; 
    } 
    return self; 
} 

- (void) encodeWithCoder: (NSCoder *)encoder { 
    [encoder encodeObject:self.yourpoperty forKey:@"PROPERTY_KEY"]; 
} 
11

WCSessionDelegate's- session:didReceiveMessage:replyHandler:方法中,replyHandler参数被定义为[String : AnyObject]AnyObject部分具有误导性。它只能包含一个property list数据类型:NSData, NSString, NSArray, NSDictionary, NSDate, and NSNumber。 (在这种情况下,它使为什么AnyObject选择,因为这6种数据类型不从一个共同的子类继承除了NSObject感。)

通常人们提到NSCoding and NSKeyedArchiver可以解决问题,但我还没有看到更多除此之外的例子/解释。请注意,replyHandler字典不关心序列化。你可以使用NSKeyedArchiver,JSON,你自己的自定义编码等等。只要字典只包含那6种数据类型,replyHandler就会很开心。否则,您将看到Payload contains unsupported type.错误。

由于这个原因,你永远不会像这样调用回复处理程序:replyHandler(["response": myCustomObject),即使myCustomObject完全实现了NSCoding协议。

的编码选择摘要:

  • NSCoding:主要的好处是,当你解除存档,它会自动找到正确的类和实例为您包括其子的任何对象。
  • JSON
  • 自定义编码:一个好处是你的对象不会被强制从NSObject继承,这在Swift中有时会有帮助。

如果你使用NSCoding,这是它会是什么样子:

iPhone应用程序:

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:]

+0

感谢您的见解,将检查并更新 – YaBoiSandeep

0

在我的情况iOS的10和8.0的XCode前发生的事情,在我的watchkit应用程序代码中,我使用:

let infoDictionary = ["request" : "word_detail", "word": self.word, "type": self.type] 

和它的作品grest。 当我在XCode 8.0中测试WatchKit app 2.0模拟器中的相同代码时,发现watchkit连接错误显示不支持的格式消息。

经过大量的调试我找到了解决方案,这:

let infoDictionary:NSDictionary = ["request" : "word_detail", "word": self.word, "type": self.type] 

我只好把刚才的NSDictionary的类型转换,整个事情的作品没有问题。