Cocoa/App Group通过CFMessagePort进行进程间通信



我试图传递一个字符串(虽然我的真正目标是传递一个数组)从一个macOS应用程序到另一个。接收端应用被沙盒化,而发送端应用没有被沙盒化。

我已经添加了一个应用程序组(DEV_TEAM_ID.com.if.APP_NAME.UNIQUE_NAME)到两个应用程序。


在接收端app,我已经实现了创建端口和runloop:

CFMessagePortRef localPort =
CFMessagePortCreateLocal(nil,
CFSTR("DEV_TEAM_ID.com.if.APP_NAME.UNIQUE_NAME"),
PortCallBack,
nil,
nil);
CFRunLoopSourceRef runLoopSource =
CFMessagePortCreateRunLoopSource(nil, localPort, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
runLoopSource,
kCFRunLoopCommonModes);

和回调,当然:

CFDataRef PortCallBack(CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info) {
char *message = "Thanks for saying hello!";
CFDataRef returnData = CFDataCreate(NULL, (const UInt8 *)message, strlen(message)+1);
printf("here is our received data: %sn", CFDataGetBytePtr(data));
return returnData;
}




发送者应用程序,我实现了:

CFMessagePortRef remotePort = CFMessagePortCreateRemote(nil, CFSTR("DEV_TEAM_ID.com.if.APP_NAME.UNIQUE_NAME"));
SInt32 messageIdentifier = 1;
CFDataRef messageData = (__bridge CFDataRef)[@"hello, friend." dataUsingEncoding:NSUTF8StringEncoding];
SInt32 status = CFMessagePortSendRequest(remotePort, messageIdentifier, messageData, 1000, 0, NULL, NULL);
if (status == kCFMessagePortSuccess)
{
NSLog(@"success");
} 




接收机应用程序启动正常,但是发送者应用程序在这一行崩溃:

SInt32 status = CFMessagePortSendRequest(remotePort, messageIdentifier, messageData, 1000, 0, NULL, NULL);



编辑:似乎remotePortnull,并导致崩溃出现以下错误:

线程1:EXC_BAD_ACCESS (code=1, address=0x8)

CoreFoundation的必要CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER:0x7fff20707fe0 <+0>: testq %rdi, %rdi0x7fff20707fe3 <+3>;& lt; + 13比;0x7fff20707fe5 <+5>0x7fff20707fe6 <+6>:移动%rsp, %rbp0x7fff20707fe9 <+9>: callq *0x10(%rdi)→0x7fff20707fec <+12>0x7fff20707fefe<+13>: retq
0x7fff20707fefe<+14>: nop
0x7fff20707ff0 <+16>: nop
0x7fff20707ff1 <+16>: nop
0x7fff20707ff1 <+18>: nop
0x7fff20707ff3 <+19>: nop
0x7fff20707ff4 <+21>: nop
0x7fff20707ff6 <+22>: nop
0x7fff20707ff6 <




我不知道为什么remotePort会有null值。我在两个应用程序中使用相同的端口名称。

我一直在尝试使用代码示例和其他帖子在这里Stackoverflow来解决这个问题,但我不明白我在哪里搞砸了。我将非常感谢任何建议!谢谢!

帖子我看过:
https://nshipster.com/inter-process-communication/
CFMessagePort和沙箱
Theos应用间通信使用马赫端口
https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups

在阅读了使用应用程序组用于来自同一供应商的macOS/iOS应用程序之间的通信后,我能够整理出这个

问题是,在Big Sur(或可能是Catalina)中,使用App Groups的macOS应用程序需要在开发人员门户中创建一个组容器。完成这些之后,您需要重新配置代码签名您的应用程序,以包含供应配置文件。我不太确定这是什么时候成为一项要求的,因为苹果并没有很好地记录设置App Groups。按照上面链接的文章中的步骤,一切都很好。

我可以让我的数组从一个应用程序传递到另一个应用程序:

NSData* myData = [NSKeyedArchiver archivedDataWithRootObject:self.runningProcs];

CFMessagePortRef remotePort = CFMessagePortCreateRemote(kCFAllocatorSystemDefault, CFSTR("group.DEV_TEAM_ID.com.if.APP_NAME.UNIQUE_NAME"));
SInt32 messageIdentifier = 1;
CFDataRef messageData = (__bridge CFDataRef)(myData);

SInt32 status = CFMessagePortSendRequest(remotePort, messageIdentifier, messageData, 1000, 0, NULL, NULL);
if (status == kCFMessagePortSuccess)
{
NSLog(@"success");
}

相关内容

  • 没有找到相关文章

最新更新