3

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

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

4

1 回答 1

3

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

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

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

于 2018-04-10T05:58:09.977 回答