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 时的奇怪行为