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

Application is crashing when creating a options Dictionary used by addPersistentStoreWithType method

我正在使用 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% 的崩溃

我认为这是您看到的 iOS 10 中的一个已知错误,有一个解决方法:启用 "Keychain Sharing"(在您的应用程序下 -> [=17= 中的功能选项卡) ]).

KeychainItemWrapper crash on iOS10