2016-03-05 8 views
5

Realm Swift ha un modo per eliminare e creare un nuovo file di Reame crittografato con una nuova chiave (ma con lo stesso nome file)?Realm Swift iOS - cancellazione e reinserimento sicuro di un dominio crittografato

mio caso d'uso: quando un utente accede dalla mia app, ho eliminare il file crittografato .realm, dal momento che la chiave di cifratura verrà eliminato anche:

static func deleteRealm() { 
    let configuration = Realm.Configuration()  
    let path = NSURL.fileURLWithPath(configuration.path!)  
        .URLByDeletingLastPathComponent? 
        .URLByAppendingPathComponent("encrypted.realm") 
        .path! 
    if NSFileManager.defaultManager().fileExistsAtPath(path) { 
     // Delete realm 
     try! NSFileManager.defaultManager().removeItemAtPath(path) 
    } 
    } 
} 

(Purtroppo, chiamando realm.deleteAll() non sarà sufficiente, dal momento che c'è una nuova chiave)

Ma quando un altro utente si collega subito dopo il log out e ho tentano di ri-inizializzare un regno crittografato DB con una nuova chiave, in questo modo:

static func intializeRealm() -> Realm! { 
    let realmKey = generateSecureRealmKey() 
    var configuration = Realm.Configuration() 
    configuration.path = RealmDB.getRealmPath() 
    configuration.encryptionKey = NSData(bytes: realmKey, length: realmKey.count) 
    return try! Realm(configuration: configuration) 
    } 

ottengo questa eccezione:

*** Terminating app due to uncaught exception 'RLMException', 
     reason: 'Realm at path '****/encrypted.realm' already opened 
     with different encryption key' 

Sembra che il vecchio configuration cache è ancora in uso (dal momento che il nome del file è lo stesso), anche se il file regno è stato eliminato.

Il sample encryption app for Realm Swift utilizza autoreleasepool per aggirare questo problema, ma ciò non sembra fattibile per un'app più grande. O è? Dovrei circondare tutti gli usi del regno con autoreleasepool?

risposta

1

Prima di poter eliminare un database di Realm esistente o crearne uno nuovo con una nuova chiave di crittografia sullo stesso percorso, è necessario assicurarsi che tutti gli accessor di Realm siano chiusi. Ma come fai notare, potrebbe essere difficile da ottenere in un'app più grande. Il modo più semplice è probabilmente usare anche un nuovo percorso di file. Per questo motivo, consiglierei di postare la cancellazione del database vero e proprio al successivo avvio dell'applicazione. Potresti essere in grado di farlo memorizzando il percorso del Realm attualmente utilizzato e cancellando tutti gli altri file .realm e tutti i loro file ausiliari nella stessa directory.