2017-03-28 126 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設置節信息。