2016-08-09 28 views
2

我依赖加密的领域来将某些数据存储在用Swift编写的应用程序中。有时我会面临一种情况,我删除一个给定的领域并创建一个新的领域,以确保在某些状态之间不会有数据持续存在。无法捕捉到`RealmFileException:领域文件解密失败'异常

我跟踪加密密钥的自己,所以,我无意试图解密境界了错误的加密密钥,这引起了以下异常风险:

的libC++ abi.dylib:以realm类型的未捕获异常终止:: RealmFileException:无法在'/path/to/private.realm'路径中打开领域:领域文件解密失败。

因为这意味着我已经失去了原来的加密密钥,基本上让这个特定的领域没用,我希望能够删除领域文件并重新开始而不是崩溃。

我创作的境界作为建议的文档:

do { 
    var configuration = Realm.Configuration.defaultConfiguration 
    configuration.encryptionKey = ... 
    try Realm(configuration: configuration) 
} 
catch let error { 

} 

我试过this和类似的方法来捕捉NSException并将它返回到斯威夫特的代码来处理,但似乎并不做到这一点是一种直接的方式。这是不可能的,还是我不正确地接近?

回答

1

事实证明,问题是由Realm中的一个错误引起的,其中使用加密的deleteRealmIfMigrationNeeded = true导致抛出异常,但无法捕捉。

从我的(非常有用)对应于岸川胜:

是无法赶上错误是由于deleteRealmIfMigrationNeeded是真正的问题。它无意中改变了代码流。这似乎是Realm的错误。我们很快就会解决。

现在,我唯一要做的就是设置deleteRealmIfMigrationNeeded = false并手动处理这种情况。我已向Realm提交this issue

更新:该问题应该用this commit来解决。

1

你的代码应该工作。如果加密密钥错误,则输入catch块。然后您可以删除现有文件并重新创建Realm。像下面这样:

var configuration = Realm.Configuration.defaultConfiguration 
configuration.encryptionKey = getKey() 
do { 
    let realm = try Realm(configuration: configuration) 
    ... 
} 
catch { 
    try! NSFileManager().removeItemAtURL(configuration.fileURL!) 
    let realm = try! Realm(configuration: configuration) 
    ... 
} 

如果您不能赶上了错误的密码错误,则可能是使用旧的Realm.framework。请更新最新版本的Realm。

+0

谢谢你答复kishikawa。我刚刚证实我们正在使用Realm 1.0.2和Realm Swift 1.0.2,这是根据您的文档的最新版本。我用来创建领域的确切代码可以在这里查看(https://gist.github.com/kaspermunck/9b1dcbf07773b22e109eefd552200e00)(或多或少从文档复制)。 –

+0

@Muncken我测试了你的要点代码,并确认进入catch子句。如果问题是可重现的,您能否将该项目发送至[email protected]进行调查?我曾在Realm工作过。 –

+0

我在一个单独的项目中隔离了范围内的代码并重现了问题。我会转发给你。暂时打开此线程。 –