CFMessagePort和沙盒

时间:2012-03-27 12:03:59

标签: macos sandbox appstore-sandbox

我正在调整MacOS应用程序以使用沙盒。当我在控制台中尝试使用'deny mach-lookup'消息调用CFMessagePortCreateRemote时,它使用了一个帮助应用程序(同一个包中的exe)失败。

我可以看到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 个答案:

答案 0 :(得分:4)

对于目标app和帮助程序exe:

  • 启用沙盒
  • 添加以teamid为前缀的公共组
      

    Z123456789.com.example.app基

使用您的teamID ex:

命名您的马赫端口
  

Z123456789.com.example.app-group.Port_of_Kobe

Apple documentation link

答案 1 :(得分:0)

CFMessagePortCreateRunLoopSource中使用错误的CFStringRef name参数时,我对CFMessagePortCreateLocal的呼叫失败。

我使用的是我的应用组的名称XXXYYYZZZZ.MyAppGroupName

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

  

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

     

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

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

编辑:

第二天早上,我正在尝试运行相同的代码。这次,我得到的崩溃 with 与昨晚使用的附件".someOtherString"相同。如果我更改为其他 other 字符串,则效果很好。这令人沮丧,因为我不知道该字符串何时/如何变为无效。

  

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

     

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

编辑2:

我再次使用新字符串击中崩溃。该问题可能与运行/Applications/文件夹中的应用程序版本以及Xcode构建文件夹中的版本有关。

  

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

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