【问题标题】:Failed to send custom object using WatchConnectivity (swift)使用 WatchConnectivity (swift) 发送自定义对象失败
【发布时间】:2016-05-20 14:49:03
【问题描述】:

我试图将我的 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)")
}

我的尝试和我的问题

我已经尝试阅读iPhone应用和Watch应用的system.log,但我找不到任何线索,这是我现在遇到的最大问题。

完整代码为:here(结帐7f2a72c6004f6580e2a38a2d7fd0ed2cef8a2b2e

【问题讨论】:

    标签: ios swift watchkit nscoding watchconnectivity


    【解决方案1】:

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

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

    【讨论】:

    • 简而言之,这是否意味着我可以在 iPhone 和 Watch 应用之间传输自定义对象的唯一方法是在不使用任何现有库的情况下自行进行编码/解码?
    • 我不会说这是唯一的方法 - 但 NSArchiver 不起作用,并且进行自定义序列化是我发现发送对象的最简单方法。你当然可以手动将你的对象属性映射到一个 NSDictionary 中,尽管这取决于你的对象的大小,这可能很麻烦。
    • 非常感谢您的回复,这些正是我想要的:)
    【解决方案2】:

    我尝试使用"NSKeyedArchiver/NSKeyedUnarchiver",效果很好。 无需进行 序列化 等等。 您的字典应该具有相同类型的数据,并且 Archiver 做得很好。

    【讨论】:

    • 它与现有对象完美配合,如 NSData、UIColor 等。但对于自定义对象......正如 lehn0058 所说。如果您认为/不知道,您可以提供一个演示吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2013-03-14
    • 2019-07-28
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多