CFMessagePort和沙盒化

5

我正在将一款MacOS应用程序适配为使用沙盒技术。它使用一个帮助程序(同一捆绑包中的exe),当我尝试使用CFMessagePortCreateRemote调用时失败,并在控制台中显示'deny mach-lookup'消息。

我可以看到com.apple.security.temporary-exception.mach-lookup.global-name授权密钥可以解决此问题,但只是临时的。

有没有办法在沙盒应用程序中通过mach端口实现两个应用程序之间的通信?

错误信息:

let port = CFMessagePortCreateLocal(nil, "XXXYYYZZZZ.MyAppGroupName" as CFString, Callback, nil, nil)
let runLoopSource = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, port, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes)

*** CFMessagePort: bootstrap_register(): 失败 1100 (0x44c) '权限被拒绝',端口号 = 0x14807,名称为 'XXXYYYZZZZ.MyAppGroupName'

2个回答

5

对于两个目标应用和辅助exe:

  • 启用沙箱
  • 添加一个以您的团队ID为前缀的公共组

    Z123456789.com.example.app-group

使用您的团队ID命名您的mach端口,例如:

Z123456789.com.example.app-group.Port_of_Kobe

苹果文档链接


1
创建 Mach Port 字符串时,在 App Group ID 的末尾添加额外的 .Port_of_Kobe 字符串!非常重要。您不能仅使用您的 App Group ID。 - pkamb

0

当我在CFMessagePortCreateLocal中使用错误的CFStringRef name参数时,我的调用CFMessagePortCreateRunLoopSource崩溃了。

我使用了我的应用程序组名称XXXYYYZZZZ.MyAppGroupName

阅读了苹果文档后,我将其更改为XXXYYYZZZZ.MyAppGroupName.someOtherString,然后崩溃消失了。

机器端口名称必须以应用程序组标识符开头,后跟一个句点(.),然后是您选择的名称。

例如,如果您的应用程序组名称为Z123456789.com.example.app-group,则可以创建名为Z123456789.com.example.app-group.Port_of_Kobe的机器端口。

https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW24

编辑:

第二天早上,我试图运行相同的代码。这一次,我得到了崩溃,并且使用了昨晚相同的附加字符串".someOtherString"。如果我更改为其他字符串,它可以正常工作。这很令人沮丧,因为我不知道何时/如何使该字符串无效。

线程1:EXC_BAD_ACCESS(代码=1,地址=0x8)

*** CFMessagePort:bootstrap_register():失败1100(0x44c)'Permission denied',端口= 0xcd07,名称= 'XXXYYYZZZZ.MyAppGroupName.someOtherString'

编辑2:

我再次遇到了崩溃,这次是使用新字符串。问题可能与从/Applications/文件夹中运行应用程序的版本以及来自我的Xcode构建文件夹的版本有关。

端口名称通常应在当前用户上下文中唯一;否则,您可能会遇到冲突。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接