Сбой приложения при создании словаря параметров, используемого методом addPersistentStoreWithType
Я использую 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
метод. Приложение работает, и я не могу воспроизвести сбой, но при сбое он показывает очень много сбоев
Также используя AESCrypt
зашифровать пароль и сохранить его в связке ключей, используя KeychainItemWrapper
,
Наблюдение:
Отказ, который отображает crashlytics, появляется только тогда, когда мы загружаем сборку в тестовом полете, используя профиль распространения.
По словам crashlytics, сбой на iOS 11 происходит на 100%
1 ответ
Я думаю, что это известная ошибка в iOS 10, которую вы видите, есть обходной путь: включите "Общий доступ к цепочке ключей" (в вашем приложении -> вкладка "Возможности" в XCode).