2014-06-30 11 views
6

Ist es möglich, Zugriff auf das systemeigene Adressbuch (NAB) auf iOS 7.0 Simulator programmgesteuert zu gewähren? Ich schreibe xctest Komponententests, die benötigen, schreiben Sie auf NAB. Die Komponententests werden unter iOS 7.0 Simulator ausgeführt und sind Teil des kontinuierlichen Integrationsprozesses und beinhalten keine Benutzerinteraktion.Zugriff auf NAB programmatisch auf iOS 7.0 Simulator gewähren

Derzeit, es sei denn, der Benutzer gewährt Zugriff explizit über die "TestApp" möchte Zugriff auf Ihre Kontakte Warnung, Zugriff auf NAB verweigert.

+0

iOS 8-Version dieser Frage: http://stackoverflow.com/q/30106320/476716 – OrangeDog

Antwort

7

Im Geiste des Teilens werde ich meine eigene Frage beantworten. Unter anderem Berechtigungen Adressbuch Zugriffsberechtigung ist in TCC.db-Datenbank gespeichert, die in /Library/TCC/ im Ordner iPhone Simulator befindet.

e.g. /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Applications/[appGUID]/Library/TCC/TCC.db 

Berechtigungen sind in der Tabelle access in TCC.db Datenbank gespeichert. access Tabellenschema: TCC.db schema

Die Felder, die wir interessiert sind, sind:

  1. service - die Erlaubnis Typ
  2. client     - die App-ID
  3. allowed - die Erlaubnis erteilt?

Um Zugang Reservieren Erlaubnis und entsprechender Datensatz zu gewähren, sollten (falls bereits vorhanden ist oder aktualisiert) in die access Tabelle eingefügt werden. Nachdem der Datensatz entweder eingefügt oder aktualisiert wurde, sollte die Tabelle so aussehen: access table after update

Ich habe die folgende Methode geschrieben, um die TCC.db-Datenbank zu aktualisieren.

#import <sqlite3.h> 

- (void)grantAccessBookAccess { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    // tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Applications/FB8DF5E9-94B8-4CA9-A167-43AFE794B94E/Document 

    NSString *tccDbPath = nil; 
    tccDbPath = [[[[paths objectAtIndex:0] 
        stringByDeletingLastPathComponent] // remove Document 
        stringByDeletingLastPathComponent] // remove [appGUID] 
        stringByDeletingLastPathComponent]; // remove Applications 

    // tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/ 

    tccDbPath = [[[tccDbPath stringByAppendingPathComponent:@"Library"] 
       stringByAppendingPathComponent:@"TCC"] 
       stringByAppendingPathComponent:@"TCC.db"]; 

    // tccDbPath: /Users/useriko/Library/Application Support/iPhone Simulator/7.1-64/Library/TCC/TCC.db 

    sqlite3 *database; 
    if(sqlite3_open([tccDbPath UTF8String], &database) != SQLITE_OK) { 
    NSLog(@"Error while opening database. %s", sqlite3_errmsg(database)); 
    return; 
    } 

    NSString *updateSql = @"INSERT OR REPLACE INTO access (service, client, client_type, allowed, prompt_count) VALUES (\"kTCCServiceAddressBook\",\"com.your.app.id\",0,1,1);"; 

    int rc; 
    char* errmsg; 
    const char *sql = [updateSql UTF8String]; 
    rc = sqlite3_exec(database, sql, NULL, NULL, &errmsg); 
    if (rc != SQLITE_OK) { 
    NSLog(@"Error updating access table. %s", errmsg); 
    sqlite3_free(errmsg); 
    } 

    sqlite3_close(database); 
} 

Aufgrund der offensichtlichen Gründen sollte das Ziel mit libsqlite3.dylib verknüpft werden.

NICHT vergessen, die App-ID zu ändern (com.your.app.id) in den updateSql auf Ihre App-ID.

+1

irgendwelche Ideen, wie es in swift3 zu tun? –

+0

@Async Entschuldigung. Keine Ahnung. – mrvincenzo

Verwandte Themen