使用 BBSettingsGateway 设置 BBSectionInfo 失败,原因不明

Setting a BBSectionInfo using BBSettingsGateway fails for unclear reason

我正在尝试为端到端测试套件创建一个解决方案,以在模拟器 上设置用户权限(联系人、照片、通知等)。这样做的原因是 SpringBoard 显示权限警报,它们会干扰测试套件。

我试过使用 XCUITest 套件,但它在 SpringBoard 警报方面没有按预期工作,而且通常使用起来不方便。

所以我的想法是修改系统文件,以便按需设置权限。我找到了 TCC 数据库,它似乎很简单。然后我注意到通知权限保存在另一个文件 /Library/BulletinBoard/SectionInfo.plist 下。该文件由 SpringBoard 进程中的 BBServer 对象缓存。我设法更改了此文件,如果 SpringBoard 终止,则接受对该文件的更改。但我希望在测试应用程序的进程运行时发生此更改。

经过一些挖掘,我注意到当“设置”应用(首选项)对通知设置进行更改时,它会使用 XPC 连接来通知它已进行更改。

我正在尝试在测试过程中完成同样的事情。我创建了一个包含所有通知设置的 BBSectionInfo 对象,并尝试使用内部使用 XPC 连接的 BBSettingsGateway 将此更改通知 BulletinBoard 服务器。这行不通,我不确定为什么不行,因为我没有收到任何错误。

也许这是一个权利问题?令我烦恼的是系统没有给出任何错误,只是什么都没有发生。

在调试器中,引入 XPC 连接,我得到这个:

 (lldb) po [inv.target valueForKey:@“connection”]
 <NSXPCConnection: 0x60000011bcf0> connection to service named com.apple.bulletinboard.settingsconnection

内部连接也没有透露任何问题:

 (lldb) po [[inv.target valueForKey:@"connection"] valueForKey:@"xpcConnection"]
 <OS_xpc_connection: connection[0x6000001a6200]: { refcnt = 2, xrefcnt = 1, name = com.apple.bulletinboard.settingsconnection, type =  named, state = init-done, error = 0x0 mach = true, privileged = false, bssend = 0x6f07, recv = 0x6d0b, send = 0x7003, pid = 0, euid = 4294967295, egid = 4294967295, asid = 4294967295 } <connection: 0x6000001a6200> { name = com.apple.bulletinboard.settingsconnection, listener = false, pid = 0, euid = 4294967295, egid = 4294967295, asid = 4294967295 }>

看来一切都很好。我能找到的连接之间的唯一区别是,在我的进程中,状态是 init-done,而在 Preferences 进程中,状态是 checked in:

(lldb) po [[[QuietHoursStateController sharedController] bbGateway] valueForKey:@"connection"]
<NSXPCConnection: 0x6180001160b0> connection to service named com.apple.bulletinboard.settingsconnection

(lldb) po [[[[QuietHoursStateController sharedController] bbGateway] valueForKey:@"connection"] valueForKey:@"xpcConnection"]
<OS_xpc_connection: connection[0x6180001a3fe0]: { refcnt = 2, xrefcnt = 1, name = com.apple.bulletinboard.settingsconnection, type = named, state = checked in, error = 0x0 mach = true, privileged = false, bssend = 0x9d03, recv = 0x9817, send = 0x9e03, pid = 17877, euid = 26053515, egid = 20, asid = 100046 } <connection: 0x6180001a3fe0> { name = com.apple.bulletinboard.settingsconnection, listener = false, pid = 17877, euid = 26053515, egid = 20, asid = 100046 }>

我对 XPC 连接没有足够的经验,所以我可能遗漏了什么? BBSettingsGateway 似乎管理它自己的连接,它没有公开任何管理连接的方法。

我不介意其他创意方案,因为这个方案只针对模拟器。我添加了 jailbreak 标签以提高可发现性,但我正在寻找仅限模拟器的解决方案。

原来是安全相关的。 BBServer 实现了一个 listener:shouldAcceptNewConnection: 方法(在 NSXPCListenerDelegate 中定义),它有一个被接受的权利白名单。否则,连接不被接受,但也不终止。由于这是针对模拟器的,我向我的应用程序添加了 com.apple.bulletinboard.settings 权利,这确实解决了问题,并且我能够使用 BBSettingsGateway.

设置部分信息

我最终直接为指定的模拟器编辑了 plist。此功能在 AppleSimulatorUtils 中实现,Apple 模拟器的命令行实用程序集合。