【问题标题】:Setting a BBSectionInfo using BBSettingsGateway fails for unclear reason使用 BBSettingsGateway 设置 BBSectionInfo 失败,原因不明
【发布时间】:2017-08-21 10:02:09
【问题描述】:

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

我尝试过使用 XCUITest 套件,但它在 SpringBoard 警报方面无法按预期工作,并且一般使用不方便。

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

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

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

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

在调试器中,带上 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,而在首选项进程中,状态是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 标记以方便发现,但我正在寻找仅限模拟器的解决方案。

【问题讨论】:

    标签: ios jailbreak iphone-privateapi springboard xpc


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我做了很多次。并且忘记再次将权利链接到应用程序...
    猜你喜欢
    • 2019-01-21
    • 2022-11-27
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2020-11-03
    相关资源
    最近更新 更多