创建 addPersistentStoreWithType 方法使用的选项字典时应用程序崩溃

Posted

技术标签:

【中文标题】创建 addPersistentStoreWithType 方法使用的选项字典时应用程序崩溃【英文标题】:Application is crashing when creating a options Dictionary used by addPersistentStoreWithType method 【发布时间】: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 上显示了如此多的崩溃

crashlytics crash logs image

还使用AESCrypt 加密密码,然后使用KeychainItemWrapper 将其保存到钥匙串。

观察: crashlytics 显示的崩溃仅在我们使用分发配置文件上传测试飞行的构建时才会出现。

根据 crashlytics 的报告,ios 11 发生 100% 崩溃

【问题讨论】:

这可能是这个已知错误的副本吗? ***.com/questions/39561041/… @Popmedic 我在 iOS 11 及更高版本上进行了测试,但我无法重现该问题,在 crashlytics 中,所有受影响的用户都有 iOS 11 及更高版本,有什么步骤可以重现此问题? :-( 抱歉,希望就是这样,当我遇到无法重现的错误时,我讨厌。我认为打开钥匙串共享不会有任何伤害,如果崩溃发布后就宕机了,可能是类似的缺陷,可能值得一试。 @AliAKhtar 非常感谢您发布您的问题。你真的节省了我的数据库迁移活动时间。 【参考方案1】:

我认为这是您看到的 iOS 10 中的一个已知错误,有一个解决方法:启用“钥匙串共享”(在您的应用程序 -> Xcode 中的功能选项卡下)。

KeychainItemWrapper crash on iOS10

【讨论】:

以上是关于创建 addPersistentStoreWithType 方法使用的选项字典时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

要用MFC创建一个窗口,如何创建?

oracle 安装完了,怎么创建用户和数据库???

oracle 安装完了,怎么创建用户和数据库???

mysql在创建表的时候可以创建字段那么创建新数据库的时候可以顺便创建表吗

Pod 的创建

桌面快捷方式如何创建 如何创建桌面快捷方式