编辑 2:这取决于您将其列入白名单的位置Foo
。它需要从正在调用的任何内容中列入白名单grabSomethingWithCompletion:
。例如,如果您有一个实现和公开的服务:
- (void)takeThese:(NSArray *)bars reply:(void (^)(NSArray *foos))completion;
然后您需要服务端Bar
将传入连接列入白名单:
// Bar and whatever Bar contains.
NSSet *incomingClasses = [NSSet setWithObjects:[Bar class], [NSString class], nil];
NSXPCInterface *exposedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(InYourFaceInterface)];
[exposedInterface setClasses:incomingClasses forSelector:@selector(takeThese:reply:) argumentIndex:0 ofReply:NO];
// The next line doesn't do anything.
[exposedInterface setClasses:incomingClasses forSelector:@selector(takeThese:reply:) argumentIndex:0 ofReply:YES];
xpcConnection.exposedInterface = exposedInterface;
第二部分必须在连接的另一端进行,无论与您的服务交谈:
NSSet *incomingClasses = [NSSet setWithObjects:[Foo class], [NSNumber class], nil];
NSXPCInterface *remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(InYourFaceInterface)];
[remoteObjectInterface setClasses:incomingClasses forSelector:@selector(takeThese:reply:) argumentIndex:0 ofReply:YES];
xpcConnection.remoteObjectInterface = remoteObjectInterface;
总之,任何接收到奇怪对象的东西都需要将奇怪对象列入白名单。不确定这是否是您的问题,但我敢肯定它会是某人的问题。
编辑:现在我已经与 XPC 合作了一段时间,我意识到我的回答在解决问题时并不能解决您的问题。我现在已经遇到了几次不同的情况,但我仍然不确定如何在实现我自己的集合类之外解决它,这不太理想。
原始答案:我知道你问这个问题已经有一段时间了,但是经过大量搜索而没有人回答这个问题,我想我会发布我的答案来说明导致它的原因(可能还有其他原因,但是这为我修好了)。
在符合 的类中NSSecureCoding
,在initWithCoder:
方法中,您需要通过传入集合中包含的所有可能类的集合来显式解码集合。前两个是解码的标准示例,最后一个是解码集合:
if (self = [super init]) {
self.bar = [aDecoder decodeInt64ForKey:@"bar"];
self.baz = [aDecoder decodeObjectOfClass:[Baz class] forKey:@"baz"];
NSSet *possibleClasses = [NSSet setWithObjects:[Collection class], [Foo class], nil];
self.foo = [aDecoder decodeObjectOfClasses:possibleClasses forKey:@"foo"];
}
因此,如果您的集合是包含 NSStrings 的集合,则可能的类将是[NSSet class]
and [NSString class]
。
我相信你已经从这个问题中走了出来,但也许其他人和我一样需要这个答案。