Неочаквана промяна на местоположението на ubiquity store след актуализация на приложението

Някои предварителни условия: Едно от нашите приложения е налично в 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/E 5FBA065- 8794-4C75-AEB5-C63004E1AAC6/7811DD75-3EEB-41A5-A748-C3206FBF9E31/store/E5FBA065-8794-4C75-AEB5-C63004E1AAC6.sqlite

А сега към проблема: Разработихме нова версия на нашето приложение: 2.0.0. Когато нашият iPad има инсталирана версия 1.2.0 на App Store и стартираме версия 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-9663B02F505 E/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 или когато инсталирате приложение на устройство, използващо ad-hoc разпространение.“

Това няма да се случи, когато инсталирате актуализация от App Store.

person Norbert    schedule 28.08.2014