2017-03-28 2 views
5

Ich versuche, eine Lösung für eine End-to-End-Testing-Suite zu erstellen, um Benutzerberechtigungen (Kontakte, Fotos, Benachrichtigungen usw.) auf dem Simulator festzulegen. Der Grund hierfür ist, dass Berechtigungswarnungen von SpringBoard angezeigt werden und die Testsuite beeinträchtigen.Einstellung eines BBSectionInfo mit BBSettingsGateway schlägt aus unklaren Gründen fehl

Ich habe versucht, die XCUITest-Suite zu verwenden, aber es funktioniert nicht wie erwartet in Bezug auf SpringBoard-Warnungen und ist im Allgemeinen unbequem zu verwenden.

Also war meine Idee, Systemdateien zu ändern, um Berechtigungen auf Abruf zu setzen. Ich habe die TCC-Datenbank gefunden, und sie scheint ziemlich einfach zu sein. Ich habe dann festgestellt, dass Benachrichtigungsberechtigungen unter einer anderen Datei gespeichert werden: /Library/BulletinBoard/SectionInfo.plist. Diese Datei wird von einem BBServer-Objekt im SpringBoard-Prozess zwischengespeichert. Ich habe es geschafft, diese Datei zu ändern, und wenn SpringBoard beendet wird, werden Änderungen an der Datei akzeptiert. Aber ich möchte, dass diese Änderung während der Laufzeit der getesteten App auftritt.

Nach einigen Ausgrabungen bemerkte ich, dass wenn die App Einstellungen (Einstellungen) eine Änderung der Benachrichtigungseinstellungen vornimmt, eine XPC-Verbindung verwendet, um zu benachrichtigen, dass es eine Änderung vorgenommen hat.

Ich versuche das gleiche im getesteten Prozess zu erreichen. Ich erstelle ein BBSectionInfo-Objekt, das alle Einstellungen für die Benachrichtigungen enthält, und versuche, den BulletinBoard-Server über diese Änderung zu informieren, indem ich eine BBSettingsGateway verwende, die intern eine XPC-Verbindung verwendet. Das funktioniert nicht, und ich bin mir nicht sicher, warum nicht, weil ich keinen Fehler bekomme.

Vielleicht ist es ein Berechtigungsproblem? Was mich nervt ist, dass kein Fehler durch das System gegeben wird, nur nichts geschieht.

In Debugger, die XPC Verbindung zu bringen, habe ich dies:

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

Die interne Verbindung auch offenbart keine Probleme:

(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 }> 

Also alles gut zu sein scheint. Der einzige Unterschied, den ich zwischen den Anschlüssen finden kann, ist, dass in meinem Prozess, der Staat init-done ist, während in den Einstellungen Prozess, der Staat ist 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 }> 

ich nicht genug Erfahrung mit XPC-Verbindungen habe so Vielleicht fehlt mir etwas? BBSettingsGateway scheint seine eigene Verbindung zu verwalten, und es werden keine Methoden zum Verwalten der Verbindung verfügbar gemacht.

Ich störe andere kreative Lösungen nicht, da diese Lösung nur für den Simulator ist. Ich habe das jailbreak Tag für Auffindbarkeit hinzugefügt, aber ich suche nach Simulator-only Lösungen.

Antwort

1

Es stellt sich heraus, dass es sicherheitsbezogen ist. BBServer implementiert eine Methode listener:shouldAcceptNewConnection: (die in NSXPCListenerDelegate definiert ist), die eine Whitelist der Berechtigungen hat, die akzeptiert werden. Ansonsten wird die Verbindung nicht akzeptiert, aber auch nicht beendet. Da dies für den Simulator gilt, habe ich die Berechtigung com.apple.bulletinboard.settings zu meiner App hinzugefügt, und das löste tatsächlich die Probleme, und ich konnte die Abschnittsinformationen mithilfe von BBSettingsGateway festlegen.

Verwandte Themen