2015-09-08 1 views
9

Итак, я пытаюсь синхронизировать данные между двумя iDevices, используя Core Data & iCloud в течение нескольких недель. Apple documentation от 2012/2013 написан в Objective-C и не очень подробный.iCloud & Core Data - «Путь находится за пределами любого контейнера CloudDocs, никогда не синхронизируется»

Я попытался преобразовать его в Swift 2.0 для iOS9. Сначала я подумал, что, возможно, это выполнил, два устройства, в которых используются данные и синхронизация любых изменений. Затем все стало беспорядочно, данные, которые ранее были удалены, начали появляться, и единственный способ синхронизации - перезапустить приложение. Теперь я был поражен с этой ошибкой:

CoreData: Ubiquity: Librarian returned a serious error for starting downloads Error Domain=BRCloudDocsErrorDomain Code=6 "Path is outside of any CloudDocs container, will never sync"

Если я продолжать работать приложение через Xcode (7) он, кажется, исправить себя и изменения синхронизации, но это не является идеальным для реального мира; пользователи не должны вынуждать покидать приложение и перезапускать синхронизацию, а если данные повреждены, то переустановите.

Есть ли у кого-нибудь идеи, где я могу ошибиться и почему эта ошибка возникает?

Полное Ошибка:

2015-09-08 22:21:53.679 APPNAME[5550:407392] - [PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](874): CoreData: Ubiquity: nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B:APPNAMEStore 
Using local storage: 1 for new NSFileManager current token <766b5e5c 3c205110 52c05248 38a47bd9 aca1ee87> 
2015-09-08 22:21:57.639 APPNAME[5550:407392] storesDidChange posting notif 
2015-09-08 22:21:57.639 APPNAME[5550:407452] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](874): CoreData: Ubiquity: nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B:APPNAMEStore 
Using local storage: 0 for new NSFileManager current token <766b5e5c 3c205110 52c05248 38a47bd9 aca1ee87> 
2015-09-08 22:21:58.565 APPNAME[5550:407476] __45-[PFUbiquityFilePresenter processPendingURLs]_block_invoke(447): CoreData: Ubiquity: Librarian returned a serious error for starting downloads Error Domain=BRCloudDocsErrorDomain Code=6 "Path is outside of any CloudDocs container, will never sync" UserInfo={NSDescription=Path is outside of any CloudDocs container, will never sync, NSFilePath=/Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/38201B1B-7F78-4683-8604-D8F79D1F895B.1.cdt} with userInfo { 
NSDescription = "Path is outside of any CloudDocs container, will never sync"; 
NSFilePath = "/Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/38201B1B-7F78-4683-8604-D8F79D1F895B.1.cdt"; 
} for these urls: {(
file:///Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/38201B1B-7F78-4683-8604-D8F79D1F895B.1.cdt 
)} 
2015-09-08 22:21:58.566 APPNAME[5550:407452] __45-[PFUbiquityFilePresenter processPendingURLs]_block_invoke(447): CoreData: Ubiquity: Librarian returned a serious error for starting downloads Error Domain=BRCloudDocsErrorDomain Code=6 "Path is outside of any CloudDocs container, will never sync" UserInfo={NSDescription=Path is outside of any CloudDocs container, will never sync, NSFilePath=/Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/09F9706A-4479-47BF-B26D-DEBF92C55E48.1.cdt} with userInfo { 
NSDescription = "Path is outside of any CloudDocs container, will never sync"; 
NSFilePath = "/Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/09F9706A-4479-47BF-B26D-DEBF92C55E48.1.cdt"; 
} for these urls: {(
file:///Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/09F9706A-4479-47BF-B26D-DEBF92C55E48.1.cdt, 
file:///Users/USER/Library/Developer/CoreSimulator/Devices/19DE5FBA-9248-410D-9264-6B434B30F8CA/data/Containers/Data/Application/D00DA341-E9A5-4C65-82B4-41EFC5638ED3/Documents/CoreDataUbiquitySupport/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/DD2F75D5-FEAF-482A-A896-657936AFCFCD/container/nobody~sim73E13D94-AB95-59FB-AF18-ADC7BC05B47B/APPNAMEStore/NiGeopr_A~01pLnJTYkIei3RCNWt5FiSp0~iJS1V9eo=/8DACD654-5C84-4699-B512-078D46E51947.1.cdt 
)} 
2015-09-08 22:22:02.865 APPNAME[5550:407497] mergeChanges notif:NSConcreteNotification 0x7fc53c926e80 {name = com.apple.coredata.ubiquity.importer.didfinishimport; object = <NSPersistentStoreCoordinator: 0x7fc53ae36700>; userInfo = { 
deleted = "{(\n)}"; 
inserted = "{(\n)}"; 
updated = "{(\n)}"; 
}} 

основных данных стека для ICloud

// MARK: - Core Data stack 

// This handles the updates to the data via iCLoud updates 
func registerCoordinatorForStoreNotifications (coordinator : NSPersistentStoreCoordinator) { 
    let nc : NSNotificationCenter = NSNotificationCenter.defaultCenter(); 

    nc.addObserver(self, selector: "StoresWillChange:", 
     name: NSPersistentStoreCoordinatorStoresWillChangeNotification, 
     object: coordinator) 

    nc.addObserver(self, selector: "StoresDidChange:", 
     name: NSPersistentStoreCoordinatorStoresDidChangeNotification, 
     object: coordinator) 

    nc.addObserver(self, selector: "StoreChangedUbiquitousContent:", 
     name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, 
     object: coordinator) 
} 


// Subscribe to NSPersistentStoreCoordinatorStoresWillChangeNotification 
// most likely to be called if the user enables/disables iCloud 
// (either globally, or just for your app) or if the user changes 
// iCloud accounts. 

func StoresWillChange (notification:NSNotification) { 
    managedObjectContext.performBlock {() -> Void in 
     if self.managedObjectContext.hasChanges { 
      do { 
       try self.managedObjectContext.save() 
      } catch { 
       print("error saving Managed Object Context in AppDelegate") 
      } 

      } else{ 
       // drop any manged object refrences 
       self.managedObjectContext.reset() 
      } 

     } 
    } 

// Subscribe to NSPersistentStoreCoordinatorStoresDidChangeNotification 
func StoresDidChange(notification: NSNotification) { 
    // here is when you can refresh your UI and 
    // load new data from the new store 
    NSLog("storesDidChange posting notif"); 
    NSNotificationCenter.defaultCenter().postNotificationName("storeDidChange", object: nil) 
} 

func mergeChanges(notification: NSNotification) { 
    NSLog("mergeChanges notif:\(notification)") 
     self.managedObjectContext.performBlock { 
      self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
     } 
} 

func StoreChangedUbiquitousContent(notification: NSNotification) { 
    self.mergeChanges(notification); 
} 


lazy var applicationDocumentsDirectory: NSURL = { 
    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.USER.swift2-iCloud" in the application's documents Application Support directory. 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] 
    }() 

lazy var managedObjectModel: NSManagedObjectModel = { 

    let modelURL = NSBundle.mainBundle().URLForResource("APPNAME", withExtension: "momd")! 
    return NSManagedObjectModel(contentsOfURL: modelURL)! 

    }() 

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 

    // Create the coordinator and store 
    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("APPNAME.sqlite") 
    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    // iCloud store 
    var storeOptions = [NSPersistentStoreUbiquitousContentNameKey : "APPNAMEStore",NSMigratePersistentStoresAutomaticallyOption: true, 
     NSInferMappingModelAutomaticallyOption: true] 

    do { 
     try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: NSURL.fileURLWithPath(url.path!), options: storeOptions) 
    } catch var error1 as NSError { 
     error = error1 
     coordinator = nil 
     // Report any error we got. 
     var dict = [String: AnyObject]() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
     dict[NSUnderlyingErrorKey] = error 
     error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog("Unresolved error \(error), \(error!.userInfo)") 
     abort() 
    } catch { 
     fatalError() 
    } 

    self.registerCoordinatorForStoreNotifications (coordinator!) 

    return coordinator 
    }() 
+0

Я тоже видел эту проблему. – vichudson1

ответ

0

я до этого был такой же вопрос. Я провел половину дня, чтобы проверить код, и оказалось, что я использовал неправильное имя контейнера iCloud. У меня было приложение в среде разработки, имя которого очень похоже на одно в рабочей среде.

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