Сбой приложения при создании словаря параметров, используемого методом 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. Приложение работает, и я не могу воспроизвести сбой, но на сайте crashlytics отображается так много сбоев.

изображение журнала аварийного сбоя

Также используйте AESCrypt для шифрования пароля, а затем сохраните его в связке ключей, используя KeychainItemWrapper.

Наблюдение:
Сбой, отображаемый crashlytics, появляется только тогда, когда мы загружаем сборку тестового запуска с использованием профиля распространения.

сбой происходит на 100% на iOS 11, как сообщает Crashlytics


comment
может ли это быть дубликатом этой известной ошибки??? stackoverflow.com/questions/39561041/   -  person Popmedic    schedule 16.05.2018
comment
@Popmedic Я тестировал на iOS 11 и более поздних версиях, и я не могу воспроизвести проблему. В Crashlytics все затронутые пользователи имеют iOS 11 и более поздние версии, какие-либо шаги для воспроизведения этой проблемы?   -  person Ali AKhtar    schedule 16.05.2018
comment
:-( Извините, я надеялся, что это он, я ненавижу, когда у меня есть ошибка, которую я не могу воспроизвести. Я не думаю, что будет больно включить общий доступ к цепочке ключей, и если сбои пройдут после выпуска, может быть, это аналогичный дефект, возможно, стоит попробовать.   -  person Popmedic    schedule 16.05.2018
comment
@AliAKhtar Большое спасибо, что разместили свой вопрос. вы действительно сэкономили мое время на миграцию БД.   -  person Suresh Durishetti    schedule 22.05.2018


Ответы (1)


Я думаю, что это известная ошибка в iOS 10, которую вы видите, есть обходной путь: включите «Общий доступ к цепочке ключей» (в вашем приложении -> вкладка «Возможности» в Xcode).

Сбой KeychainItemWrapper на iOS10

person Popmedic    schedule 16.05.2018