Apple Watch发送的归档文件在iPhone端无法解归档问题求助
问题原因定位
1. 最常见原因:跨模块类名不匹配
Apple Watch扩展和iPhone主应用属于两个独立的模块,NSKeyedArchiver归档时会自动把类所属的模块名作为类名前缀写入归档数据。
- 你在iPhone本地归档、解档时,
CounterModel所属模块一致,因此可以正常运行 - Watch端归档的
CounterModel前缀是Watch扩展的模块名,iPhone端解档时找不到对应模块的类,就会触发格式错误。
解决方法:
在CounterModel类定义前添加@objc注解,强制全局类名不带模块前缀:
@objc(CounterModel) class CounterModel: NSObject, NSCoding { // 原有类实现 }
如果不想修改类定义,也可以在iPhone端解档前添加类映射:
// 替换为你Watch扩展实际的模块名 NSKeyedUnarchiver.setClass(CounterModel.self, forClassName: "WatchExtensionModule.CounterModel")
2. 解档参数不匹配
你归档时显式设置了requiringSecureCoding: false,iOS 14+系统版本中unarchiveTopLevelObjectWithData方法会默认开启安全编码校验,两边参数不一致也会导致解档失败。
解决方法:
显式初始化解档器并设置对应参数:
func session(_ session: WCSession, didReceive file: WCSessionFile) { do { let contents = try Data(contentsOf: file.fileURL) let unarchiver = try NSKeyedUnarchiver(forReadingFrom: contents) unarchiver.requiresSecureCoding = false guard let newValue = try unarchiver.decodeTopLevelObject(forKey: NSKeyedArchiveRootObjectKey) as? CounterModel else { print("The content could not be decoded.") return } listOfCounters.append(newValue) unarchiver.finishDecoding() } catch { print("Failed to retrieve the file with error \(error.localizedDescription).") } }
3. 可选排查:文件完整性校验
如果上面两个方案都无效,可以在发送端归档完成后计算数据哈希值放入metadata传输,接收端校验哈希一致后再解档,排除传输过程中文件损坏的极低概率问题。
内容的提问来源于stack exchange,提问作者MacUserT
相关产品推荐
相关产品推荐

