2014-02-05 3 views
2

Я пытаюсь синхронизировать данные ядра между IOS и OSX. В обоих приложениях я иметь такую ​​же конфигурацию:iCloud: синхронизировать основные данные между IOS и OSX

enter image description here

И те же права:

enter image description here

Я также использую тот же код для координатора магазина в пределах того же имени для SQLite файла и url:

NSManagedObjectModel* managedModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 
NSPersistentStoreCoordinator* storeCooordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedModel]; 

//-> start iCloud 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 


     NSURL* applicationFilesDirectory = [JHDCoreDataDAO applicationFilesDirectory]; 
     NSURL* storeURL = [applicationFilesDirectory URLByAppendingPathComponent:DATABASE_NAME]; 

     if(!storeURL) { NSLog(@"Error reading applicationFilesDirectory for given sqlite resouce"); } 

     NSString* containerIdentifier = [NSString stringWithFormat:@"%@.%@",TEAM_IDENTIFIER,APP_IDENTIFIER]; 
     NSURL* iCloud = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:containerIdentifier]; 

     NSString *iCloudEnabledAppID = @"TEAMID~com~sample~sample"; 
     NSError* persistentStoreError; 

     if (iCloud) { 

      NSLog(@"iCloud is working"); 
      NSLog(@"iCloudEnabledAppID = %@",iCloudEnabledAppID); 
      NSLog(@"iCloud URL: %@",iCloud); 

      NSString* cloudPath = [[iCloud path] stringByAppendingPathComponent:@"data"]; 
      NSURL* transactionsLogUrl = [NSURL fileURLWithPath:cloudPath]; 

      NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: 
            iCloudEnabledAppID, NSPersistentStoreUbiquitousContentNameKey, 
            transactionsLogUrl, NSPersistentStoreUbiquitousContentURLKey, 
            [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
           [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
           nil]; 

     [storeCooordinator lock]; 
     if(![storeCooordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&persistentStoreError]) 
     { 
      NSLog(@"Fehler: %@, %@", persistentStoreError.localizedDescription, persistentStoreError.userInfo); 
      abort(); 
     } 
     [storeCooordinator unlock]; 

    } else { 
    //Handle local psc 
    } 
}); 

Каждое приложение, версия IOS и версия OSX, все еще работают отлично в iCloud. Каждое приложение обрабатывает собственную базу данных из-за отсутствия синхронизации между этими двумя приложениями. Есть что-то, что я забыл?

+0

Почему вы используете AppID для NSPersistentStoreUbiquitousContentNameKey? Предположительно приложение App приложения iOS и App App приложения OS X не совпадают или это действительно жестко закодировано в реальных приложениях? В любом случае, NSPersistentStoreUbiquitousContentNameKey и iCloud containerID должны быть одинаковыми для всех приложений, которые хотят синхронизировать одно и то же хранилище Core Data. Ваш контейнер ubiquity в Xcode является 'sample.sample.sample', а в вашем коде его' com.sample.sample ' –

+0

У меня есть аналогичная проблема. Когда я пытаюсь синхронизировать с iCloud в моем приложении os x, я получаю эту ошибку: __60- [PFUbiquitySetupAssistant canReadFromUbiquityRootLocation:] _ block_invoke690 (1489): CoreData: Ubiquity: попытка скачать Peers ударила серьезную ошибку для сверстников для загрузки Error Domain = BRCloudDocsErrorDomain Code = 5 "(BRCloudDocsErrorDomain 5: Нет документа по URL-адресу)" – user3065901

ответ

3

Вы должны быть очень осторожны, чтобы идентификаторы, используемые вами в разрешениях, соответствовали тому, что вы используете в исходном коде для доступа к контейнеру ubiquity.

Одним из осложнений при синхронизации нескольких приложений (например, приложения Mac и приложения iOS) является то, что вам нужно будет проверить, что каждый из них имеет один и тот же идентификатор команды. Если нет, вам нужно будет явно указать идентификатор команды для прав iCloud, а не использовать переменную TeamIdentifierPrefix. Выберите один из идентификаторов команды и используйте их для обоих приложений.

В вашем конкретном примере, похоже, у вас есть настройка прав на идентификатор контейнера, который заканчивается на sample.sample.sample. Предполагая, что идентификатор команды одинаковый для каждого приложения, ваш идентификатор контейнера должен быть XXXXXXXXXX.sample.sample.sample, где первая часть - это идентификатор вашей команды. Я не знаю, что такое APP_IDENTIFIER, но он должен быть проверен, чтобы убедиться, что это sample.sample.sample. (Я предполагаю, что это не так.)

Установка NSPersistentStoreUbiquitousContentNameKey может быть в основном любой ярлык, который вам нравится в вашем магазине. Он не должен использовать ~ или даже иметь обратную DNS-форму. Например, вы можете назвать это «Store1».

Я нахожу самый простой способ узнать, все ли настроено OK, чтобы перейти в папку ~/Library/Mobile Documents на вашем Mac и найти контейнер приложения. Вы можете просто просматривать содержимое непосредственно в Finder.

К сожалению, это, вероятно, самая простая часть получения данных Core Data с iCloud. Будет еще много препятствий, и они, как правило, более сложны. Появляются новые решения для синхронизации данных Core Data все время, включая фреймворк TICDS и Core Data Ensembles, оба из которых работают с iCloud. (Раскрытие информации: я внес вклад в оба проекта и основал проект Ensembles.)

+0

Спасибо за ваш ответ. Я просмотрел папку мобильных документов в osx, и папка уже создана.Из-за того, что каждый раз, когда я запускаю приложение в osx, [PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:] показывает «Использование локального хранилища: 1» и никогда не переключается на «Использование локального хранилища: 0». На ios он работает нормально, а не на osx. Есть ли что-то в моем постоянном координаторе магазина (см. Код выше)? – user3152121

+0

Вот ссылка на примеры приложений - посмотрите, выполняются ли они в вашей среде, а затем проверьте различия кода. http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/ –

 Смежные вопросы

  • Нет связанных вопросов^_^