これは、ストレージ クラスの init で使用したコードで、最近まで問題なく動作していました。テストしようとすると、addPersistentStoreWithType でクラッシュします (以下にマーク)。iPhone 5 に切り替えた後にこれに気付き、アプリを実行します...しかし、電話でiCloudをオフにするか、シミュレーターでテストしても問題はありません...
-(id)init
{
self = [super init];
if(self)
{
NSLog(@"%s", __FUNCTION__);
favColors = [[NSMutableArray alloc] init];
model = [NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSString *path = [self itemArchivePath];
NSURL *storeURL = [NSURL fileURLWithPath:path];
NSError *error = nil;
NSMutableDictionary *options = [NSMutableDictionary dictionary];
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
NSLog(@"iCloud access at %@", ubiq);
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(contentChange:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:nil];
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *ubcontainer = [fm URLForUbiquityContainerIdentifier:nil];
[options setObject:@"color" forKey:NSPersistentStoreUbiquitousContentNameKey];
[options setObject:ubcontainer forKey:NSPersistentStoreUbiquitousContentURLKey];
} else {
NSLog(@"No iCloud access");
}
// ************ Crash here **************
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:(ubiq?options:nil) error:&error]) {
[NSException raise:@"Open failed" format:@"Reason: %@", [error localizedDescription]];
}
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:psc];
[context setUndoManager:nil];
[self loadAllItems];
}
return self;
}
- (NSString *)itemArchivePath
{
NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [documentDirectories objectAtIndex:0];
return [documentDirectory stringByAppendingPathComponent:@"store.data"];
}
また、アプリを一度実行し、クラッシュ後にicloudをオフにしてアプリを再度実行すると、icloudからデータが取得され、アプリに表示されます。
出力ログはこれを示しています。
file://localhost/private/var/mobile/Library/Mobile%20Documents/xxx での iCloud アクセス -PFUbiquitySetupAssistant performPreStoreSetupWithError:: CoreData: Ubiquity: ベースライン ファイルは存在しますが、読み取れませんでした