Неожиданное изменение местоположения универсального магазина после обновления приложения

Некоторые предварительные условия. Одно из наших приложений доступно в App Store версии 1.2.0. Мы используем Core Data и iCloud. Параметры, которые мы даем NSPersistentStoreCoordinator, следующие:

NSString *cloudContentName = [self cloudContentNameForStoreURL:cloudStoreURL];
NSURL *cloudStoreContentURL = [self URLForCloudContentForStoreURL:cloudStoreURL];
NSDictionary *cloudStoreOptions = @{
        NSPersistentStoreUbiquitousContentNameKey    : cloudContentName,
        NSPersistentStoreUbiquitousContentURLKey     : cloudStoreContentURL,
        NSMigratePersistentStoresAutomaticallyOption : @YES,
        NSInferMappingModelAutomaticallyOption       : @YES
    };

URL-адрес магазина, который мы выбираем:

file:///private/var/mobile/Applications/F6819D1D-1935-487B-AA46-9FEE34275C02/Library/Application%20Support/CloudStore/F74FC85F-D3F6-4719-8ADC-B72570C9E7FE.sqlite

Приложение, загруженное из App Store, затем преобразует этот URL-адрес и параметры в следующее вездесущее место и создаст там новый магазин:

file:///private/var/mobile/Applications/FAF62A03-2394-4133-9E84-DCB0BBEA1C22/Library/Application%20Support/CloudStore/CoreDataUbiquitySupport/mobile~36A5A006-FF08-4D16-B81B-DEAEE6D532F9/E5FBA065- 8794-4C75-AEB5-C63004E1AAC6/7811DD75-3EEB-41A5-A748-C3206FBF9E31/store/E5FBA065-8794-4C75-AEB5-C63004E1AAC6.sqlite

Теперь к проблеме: мы разработали новую версию нашего приложения: 2.0.0. Когда на нашем iPad установлена ​​версия App Store 1.2.0, и мы запускаем версию 2.0.0 непосредственно из Xcode, мы видим, что платформа Core Data переводит параметры и URL-адрес нашего магазина не в тот же, а в совершенно другой URL-адрес. :

file:///private/var/mobile/Applications/FAF62A03-2394-4133-9E84-DCB0BBEA1C22/Library/Application%20Support/CloudStore/CoreDataUbiquitySupport/mobile~3431F9C3-00D2-42D1-A888-9663B02F505E/E5FBA065- 8794-4C75-AEB5-C63004E1AAC6/7811DD75-3EEB-41A5-A748-C3206FBF9E31/store/E5FBA065-8794-4C75-AEB5-C63004E1AAC6.sqlite

Здесь вы можете видеть, что часть вездесущего URL-адреса, относящаяся к устройству, изменилась. Это может быть воспроизведено нами. Это всегда одинаково для версии App Store (/mobile~36A5A006-.../) и всегда одинаково для отладочной версии (/mobile~3431F9C3-.../). Мы заметили, что она остается той же самой папкой, если мы берем версию 1.2.0 не из App Store, а напрямую из дистрибутива Xcode/AdHoc (даже в конфигурации Release).

Так что нам интересно, что там происходит. Почему фреймворк пытается загрузить магазин из другой папки (которой не существует)? Это дает нам приложение без каких-либо существующих данных. Мы потеряем данные клиента.


person Norbert    schedule 27.08.2014    source источник


Ответы (1)


Я выпустил TSI и получил этот ответ:

То, что вы видели (версия Ad Hoc использует другой путь, чем версия App Store), является ожидаемым поведением. Причина в том, что Core Data в сочетании с iCloud использует identifierForVendor приложения для создания URL-адреса магазина, а идентификатор в версии App Store и версии Ad Hoc может отличаться. Если вы посмотрите на спецификацию identifierForVendor в справочнике по классу UIDevice, вы увидите следующее: «… Значение также может измениться при установке тестовых сборок с использованием Xcode или при установке приложения на устройство с помощью специального распространения».

Этого не произойдет при установке обновления из App Store.

person Norbert    schedule 28.08.2014