2017-06-06 4 views
2

Ich habe ein Problem mit EncryptedStore SQLCipher wrapper, um Kerndaten zu verschlüsseln.
Ich habe hinzugefügt C-Flags für diese als:XCode9-beta: Implizite Erklärung der Funktion 'sqlite3_key'

Debug = -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC 
Release = -DSQLITE_HAS_CODEC -DNDEBUG -DSQLITE_OS_UNIX=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE -DSQLCIPHER_CRYPTO_CC 

und benutzte es als:

func encryptedCoordinator() -> NSPersistentStoreCoordinator { 
    var coordinator:NSPersistentStoreCoordinator? 
    let ops:[String : Any] = [NSMigratePersistentStoresAutomaticallyOption:(true),            NSInferMappingModelAutomaticallyOption:(true), EncryptedStorePassphraseKey:sqlCipherKey, EncryptedStoreDatabaseLocation:self.sqliteFileURL()] 

    do { 
     coordinator = try EncryptedStore.make(options: ops, managedObjectModel: self.managedObjectModel, error:()) 
    }catch { 
     fatalError("Error opening encrypted DB: \(error)") 
    } 
    return coordinator! 
    } 

Es funktioniert gut in XCode8, aber es gibt Fehler in XCode9-beta.
Fehlerzeile:

- (BOOL)changeDatabasePassphrase:(NSString *)passphrase error:(NSError *__autoreleasing*)error { 
    BOOL result; 
    int status; 
    if ([passphrase length] > 0) { 
    // Password provided, use it to key the DB 
    const char *string = [passphrase UTF8String]; 
    status = sqlite3_rekey(database, string, (int)strlen(string));//ERROR line 
    string = NULL; 
    passphrase = nil; 
    } else { 
    // No password 
    status = SQLITE_OK; 
    } 
    result = status == SQLITE_OK; 
    if (result) { 
    result = [self checkDatabaseStatusWithError:error]; 
    } 
return result && (*error == nil); 
} 

Funktion wird in EncryptedStroe/sqlite3.h als deklariert:

SQLITE_API int sqlite3_rekey(
sqlite3 *db,     /* Database to be rekeyed */ 
    const void *pKey, int nKey  /* The new key */ 
); 
SQLITE_API int sqlite3_rekey_v2(
    sqlite3 *db,     /* Database to be rekeyed */ 
    const char *zDbName,   /* Name of the database */ 
    const void *pKey, int nKey  /* The new key */ 
); 
+0

Ich habe dies durch die Aktualisierung' EncryptedStore' Klasse von GitHub fangen – D4ttatraya

Antwort

5

denke ich, das Problem der Dateiimport EncryptedStore.m ist tut: #import <sqlite3.h>

Es verwendet <> so Die System-SQLite-Bibliothek wird importiert, die diese Funktionen nicht enthält. Durch die Änderung <> mit "" alles gut kompiliert.

+0

schön gelöst! Lassen Ich überprüfe – D4ttatraya

4

Eine andere Lösung gefunden here.

Hauptsächlich die Header-Suchpfade ändern.
Probieren Sie es aus $(PROJECT_DIR)/sqlcipher/src
zu $(PROJECT_DIR)/sqlcipher
(dh entfernen Sie den /src aus dem Weg).“Hat der Trick für mich zu verändern.

+0

Dies ist hilfreich, wenn wir CocoaPods zum Importieren der Bibliothek verwenden. – D4ttatraya

Verwandte Themen