2016-03-05 158 views
5

Realm Swift是否有一些方法可以安全地刪除並使用新密鑰(但文件名相同)創建新的加密Realm文件?Realm Swift iOS - 安全地刪除並重新加密加密的Realm

我的使用案例:當用戶登錄了我的應用程序,我刪除加密.realm文件,因爲加密密鑰也將被刪除:

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

(不幸的是,呼籲realm.deleteAll()是不夠的,因爲有一個新的密鑰)

但是,當另一個用戶登錄立即登錄後了,我試圖重新intialize加密的境界DB與新的密鑰,這樣的:

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

我得到這個異常:

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

看來,老configuration cache仍在使用(因爲文件名是一樣的),即使境界文件已被刪除。

sample encryption app for Realm Swift使用autoreleasepool來解決這個問題,但這似乎不適用於較大的應用程序。或者是?我是否需要圍繞領域的所有用途與autoreleasepool

回答

1

在刪除現有的Realm數據庫或在同一路徑上使用新的加密密鑰創建新數據庫之前,您需要確保關閉所有Realm訪問器。但正如你所指出的那樣,這可能很難在更大的應用程序中實現。最簡單的方法是使用新的文件路徑。出於這個原因,我建議在實際數據庫本身的刪除後進行下一次應用程序啓動。您可以通過將路徑存儲到當前使用的Realm並將所有其他.realm文件及其所有輔助文件刪除到同一目錄中來實現此目的。