【发布时间】:2016-03-05 06:00:47
【问题描述】:
Realm Swift 是否有某种方法可以安全地删除并使用新密钥(但文件名相同)创建一个新的加密 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() 是不够的,因为有一个新密钥)
但是当另一个用户在注销后立即登录并且我尝试使用新密钥重新初始化加密的 Realm 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 包围领域的所有用途?
【问题讨论】: