You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:09:02