【发布时间】:2018-05-16 17:58:04
【问题描述】:
我正在使用encrypted-core-data 加密所有持久化的数据,之前简单的CoreData 正在使用。 persistentStoreCoordinator创建代码如下。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *oldStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJetApp.sqlite"];
NSURL *newStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"VistaJet.sqlite"];
NSError *error = nil;
NSString *currentPassword = [[VJAesCryptoWrapper getInstance] getCurrentPassword];
NSDictionary *options = [self getEncryptedStoreOptionsWithPassword:currentPassword andDatabaseStore:newStoreURL];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
//if old store not exists , it means fresh installation
if([[NSFileManager defaultManager] fileExistsAtPath:oldStoreURL.path] == NO) {
if (![_persistentStoreCoordinator addPersistentStoreWithType:EncryptedStoreType configuration:nil URL:newStoreURL options:options error: &error]) {
}
} else {
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:oldStoreURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error: &error]) {
}
NSPersistentStore *oldUnsecureStore = [_persistentStoreCoordinator persistentStoreForURL:oldStoreURL];
[ConsoleLogger logText:[NSString stringWithFormat:@"Migration started"]];
//start migration
if(![_persistentStoreCoordinator migratePersistentStore:oldUnsecureStore toURL:newStoreURL options:options withType:EncryptedStoreType error:&error]) {
} else {
[[NSFileManager defaultManager] removeItemAtURL:oldStoreURL error:nil];
}
}
return _persistentStoreCoordinator;
}
创建选项字典
- (NSDictionary*)getEncryptedStoreOptionsWithPassword:(NSString*)password andDatabaseStore:(NSURL*)storeUrl {
return @{ EncryptedStorePassphraseKey: password,
EncryptedStoreDatabaseLocation: storeUrl,
NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES
};
}
我正在使用KeychainItemWrapper 将密码保存在钥匙串中,而我的代码完全在getEncryptedStoreOptionsWithPassword:currentPassword 方法上崩溃。应用程序已上线,我无法重现崩溃,但在 crashlytics 上显示了如此多的崩溃
还使用AESCrypt 加密密码,然后使用KeychainItemWrapper 将其保存到钥匙串。
观察:
crashlytics 显示的崩溃仅在我们使用分发配置文件上传测试飞行的构建时才会出现。
根据 crashlytics 的报告,iOS 11 发生 100% 崩溃
【问题讨论】:
-
这可能是这个已知错误的副本吗? stackoverflow.com/questions/39561041/…
-
@Popmedic 我在 iOS 11 及更高版本上进行了测试,但我无法重现该问题,在 crashlytics 中,所有受影响的用户都有 iOS 11 及更高版本,有什么步骤可以重现此问题?
-
:-( 抱歉,希望就是这样,当我遇到无法重现的错误时,我讨厌。我认为打开钥匙串共享不会有任何伤害,如果崩溃发布后就宕机了,可能是类似的缺陷,可能值得一试。
-
@AliAKhtar 非常感谢您发布您的问题。你真的节省了我的数据库迁移活动时间。
标签: app-store core-data-migration nspersistentstore keychainitemwrapper encrypted-core-data-sql