2017-03-28 90 views
5

我试图创建一个端到端测试套件的解决方案,以在模拟器上设置用户权限(联系人,照片,通知等)。这样做的原因是因为许可警报由SpringBoard显示,并且干扰了测试套件。使用BBSettingsGateway设置BBSectionInfo失败原因不明

我已经尝试过使用XCUITest套件,但它不像预期的那样对SpringBoard警报有效,而且一般使用起来不方便。

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

经过一番挖掘,我注意到当Settings app(Preferences)对通知设置进行更改时,它使用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,而在首选过程中,国家是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标签以便发现,但我正在寻找仅适用于模拟器的解决方案。

回答

1

原来是安全相关的。 BBServer实现了一个listener:shouldAcceptNewConnection:方法(在NSXPCListenerDelegate中定义),该方法拥有可接受的权利白名单。否则,连接不被接受,但不会被终止。由于这是模拟器,我将com.apple.bulletinboard.settings权利添加到我的应用程序中,并且确实解决了这些问题,并且我可以使用BBSettingsGateway设置节信息。