1

我试图将我的 swift 对象从 iOS 应用程序传递到 Watch。但是,我发现它适用于 NSString 等基本类型,但我的自定义对象类型。

我的自定义对象能够转换为 NSData

我已经让我的对象实现了 NSObject 和 NSCoding,效果很好。我可以毫无问题地执行以下操作:

let encodedChordProgression = NSKeyedArchiver.archivedDataWithRootObject(chordProgressions[1])
let decodedChordProgression = NSKeyedUnarchiver.unarchiveObjectWithData(encodedChordProgression) as! ChordProgression
NSLog("get decodedChordProgression = \(decodedChordProgression.description)")

WatchConnectivity 代码适用于 NSString

在 iPhone 中:

try WatchSessionManager.sharedManager.updateApplicationContext(["data": "mystringishere"])

带手表:

dispatch_async(dispatch_get_main_queue()) { [weak self] in
    self?.dataSourceChangedDelegates.forEach { $0.dataSourceDidUpdate(applicationContext["data"] as! NSString)}
}

作品。

我的 WatchConnectivity 自定义对象失败

但是,当我将对象切换到自己的对象时,由于没有调用dataSourceChangedDelegates回调函数而失败。那是:

在 iPhone 中:

let encodedChordProgression = NSKeyedArchiver.archivedDataWithRootObject(chordProgressions[1])
try WatchSessionManager.sharedManager.updateApplicationContext(["data": encodedChordProgression])

带手表:

dispatch_async(dispatch_get_main_queue()) { [weak self] in
    self?.dataSourceChangedDelegates.forEach { $0.dataSourceDidUpdate(applicationContext["data"] as! NSData)}
}

func dataSourceDidUpdate(encodedChordProgression: NSData) {
    let chordProgression = NSKeyedUnarchiver.unarchiveObjectWithData(encodedChordProgression) as! ChordProgression
    NSLog("get something here: \(chordProgression.description)")
}

我尝试过的和我的问题

我试图阅读system.logiPhone 应用程序和 Watch 应用程序,但我找不到任何线索,这是我现在遇到的最大问题。

完整代码是:here (checkout 7f2a72c6004f6580e2a38a2d7fd0ed2cef8a2b2e)

4

2 回答 2

3

不幸的是,NSKeyedArchiver/NSKeyedUnarchiver 不会以这种方式工作。这是因为即使您可以在 watchkit 和 iOS 目标之间共享类文件,它们对于编译器来说本质​​上是不同的类,因为它们是为不同的架构编译的。

我自己为解决这个问题所做的(因为我最初尝试做同样的事情)是将我的自定义对象序列化为 json 字典(或 json NSData,如果你愿意)并发送它。这是我制作的一个github 项目,它会自动将您的 swift 对象序列化为 json(特别是考虑到这个用例)。

于 2016-05-20T20:19:02.893 回答
1

我试过了"NSKeyedArchiver/NSKeyedUnarchiver",这很好用。无需进行序列化和所有操作。你的字典应该有相同类型的数据,而且Archiver做得很好。

于 2017-02-15T05:48:12.160 回答