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

标签 ios jailbreak iphone-privateapi springboard xpc

我正在尝试为端到端测试套件创建一个解决方案,以在模拟器上设置用户权限(联系人、照片、通知等)。这样做的原因是权限警报由 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 模拟器的命令行实用程序集合。

关于ios - 使用 BBSettingsGateway 设置 BBSectionInfo 失败,原因不明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43067710/

相关文章:

iphone - Xcode 4 在目标设备上显示 "finished running <my app>"——没有任何反应

ios - Twitter iOS API 是否提供任何方法来确定推文是否成功?

iphone - iPad 与 Mac 或 PC 之间的 USB 通信

iphone - 在 iPhone OS (iOS) 中关闭显示

用于生产的 iOS 推送通知

ios - 将 UIView 从底部移动到顶部

ios - 这是 iOS 私有(private) API 实现吗?

iphone - 使用私有(private) iOS BluetoothManager 框架进行设备配对

ios - 如何在 iPhone 上安装未签名的 iOS 版本?

ios - Hello world 命令行 LLDB iOS 无法解析 'main' 中的断点