NSSecureCoding 实现类必须在共享框架中才能与 XPC 一起使用吗?

Posted

技术标签:

【中文标题】NSSecureCoding 实现类必须在共享框架中才能与 XPC 一起使用吗?【英文标题】:Must NSSecureCoding-implementing classes be in shared framework to work with XPC? 【发布时间】:2018-04-05 05:16:57 【问题描述】:

在 Swift 中关注 Creating XPC Services guide 并尝试传递自定义 Foo 类时,我发现为了使其工作,它必须位于动态库中。当它嵌入到两个目标中时,与服务的连接将失败并出现4097 代码。如果Foo 在静态库中,也会发生同样的情况。

我似乎无法引用此要求,并猜测这是因为安全性在解码时将它们识别为不同的对象。这是真的?有什么更具体的信息吗?

【问题讨论】:

它们(应用程序和 XPC 服务)都必须知道您的 Foo 类是的,这并不意味着 Foo 必须存在于共享库中。在构建它们时,您可以简单地包含 Foo 。为什么你认为错误4097 与此有关? 因为我消除了所有其他选项。也没有提到这是斯威夫特,这最终证明是原因。感谢您对此进行调查! 【参考方案1】:

问题在于 Swift 名称修改,这会导致不同目标中的类名不同,因此当 XPC 解码器尝试安全地解码接收到的对象时,它会看到与指定不同的类名并失败。

在应用程序和服务目标中使用obj.io XPC example 编译的Swift @objc class Foo: NSObject, NSSecureCoding 类分别具有@class Foo : NSObject<NSSecureCoding>@class _TtC15ImageDownloader3Foo : NSObject<NSSecureCoding> 签名。

为避免这种情况,只需在 @objc(Foo) 标记中添加明确的 Objective-C 名称,这将在两个目标中产生相同的 @class Foo : NSObject<NSSecureCoding> 类签名。

【讨论】:

以上是关于NSSecureCoding 实现类必须在共享框架中才能与 XPC 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过 NSSecureCoding 解码 NSArray 时的奇怪行为

如何在 Swift 3 中使用 NSSecureCoding 解码字符串?

这个解码器只会解码采用 NSSecureCoding 的类

使用 Share 扩展共享类和数据库

DPDK QoS 框架 - 3. 分级调度模块的实现

如何在 KMM(kotlin 本机)共享模块中读取 Swift 框架库中生成的对象数组