我有一個適用於OSX和iOS的應用程序,它們都使用iCloud在它們之間共享核心數據。當我在iPhone上進行更改時,我可以在OSX應用程序中看到它們,並且在兩個應用程序都調用NSPersistentStoreDidImportUbiquitousContentChangesNotification
,所以iOS - > Mac運行良好。但是,當我在Mac應用程序中進行一些更改時,我無法在iPhone中看到它們。 iPhone從不會呼叫NSPersistentStoreDidImportUbiquitousContentChangesNotification
。我可以改變Mac的唯一方法是在iPhone上做一些改變。然後我可以看到所有的變化。iCloud Core OSX和iOS之間的數據共享
兩個項目中的iCloud集成是一樣的。核心數據數據模型是相同的。權利也是相同的。
爲什麼沒有得到蘋果的變化,直到我在做一些iPhone改變iPhone?有任何想法嗎?
另一個問題
在我的應用程序,當用戶啓用iCloud的我檢查,如果已經在iCloud中的文件。如果存在文件,用戶可以選擇從iCloud文件恢復核心數據或從本地存儲中啓動新的副本。 要開始一個新的副本我使用此代碼:
- (void)startNewCopy
{
[self removeICloudStore];
[self moveStoreToIcloud];
}
- (void)removeICloudStore
{
BOOL result;
NSError *error;
// Now delete the iCloud content and file
result = [NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:[self icloudStoreURL]
options:[self icloudStoreOptions]
error:&error];
if (!result)
{
NSLog(@"Error removing store");
}
else
{
NSLog(@"Core Data store removed.");
// Now delete the local file
[self deleteLocalCopyOfiCloudStore];
}
}
- (void)deleteLocalCopyOfiCloudStore {
// We need to get the URL to the store
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtURL:[self localUbiquitySupportURL] error:&error];
}
- (void)moveStoreToIcloud
{
// Open the store
NSPersistentStore *sourceStore = [[_persistentStoreCoordinator persistentStores] firstObject];
if (!sourceStore)
{
NSLog(@" failed to add old store");
}
else
{
NSLog(@" Successfully added store to migrate");
NSError *error;
id migrationSuccess = [_persistentStoreCoordinator migratePersistentStore:sourceStore toURL:[self icloudStoreURL] options:[self icloudStoreOptions] withType:NSSQLiteStoreType error:&error];
if (migrationSuccess)
{
NSLog(@"Store migrated to iCloud");
_persistentStoreCoordinator = nil;
_managedObjectContext = nil;
// Now delete the local file
[self deleteLocalStore];
}
else
{
NSLog(@"Failed to migrate store: %@, %@", error, error.userInfo);
}
}
}
- (void)deleteLocalStore
{
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtURL:[self localStoreURL] error:&error];
}
從一個單一的設備中的所有似乎運作良好這樣做,但當我嘗試這個連接多個設備,我得到了一些錯誤。
例如:
我有兩個設備。第一個連接到iCloud,第二個連接到iCloud。 在第一個設備時啓用iCloud的我選擇startNewCopy
,然後在第二設備我得到這個錯誤:
CoreData: Ubiquity: Librarian returned a serious error for starting downloads Error Domain=BRCloudDocsErrorDomain Code=5 "The operation couldn’t be completed. (BRCloudDocsErrorDomain error 5 - No document at URL)"
的NSPersistentStoreCoordinatorStoresDidChangeNotification
錯誤之前不會被調用。
這是我的通知代碼:
- (void)processStoresDidChange:(NSNotification *)notification
{
NSLog(@"processStoresDidChange");
// Post notification to trigger UI updates
// Check type of transition
NSNumber *type = [notification.userInfo objectForKey:NSPersistentStoreUbiquitousTransitionTypeKey];
//NSLog(@" userInfo is %@", notification.userInfo);
//NSLog(@" transition type is %@", type);
if (type.intValue == NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted) {
NSLog(@" transition type is NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted");
} else if (type.intValue == NSPersistentStoreUbiquitousTransitionTypeAccountAdded) {
NSLog(@" transition type is NSPersistentStoreUbiquitousTransitionTypeAccountAdded");
} else if (type.intValue == NSPersistentStoreUbiquitousTransitionTypeAccountRemoved) {
NSLog(@" transition type is NSPersistentStoreUbiquitousTransitionTypeAccountRemoved");
} else if (type.intValue == NSPersistentStoreUbiquitousTransitionTypeContentRemoved) {
NSLog(@" transition type is NSPersistentStoreUbiquitousTransitionTypeContentRemoved");
}
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
if (type.intValue == NSPersistentStoreUbiquitousTransitionTypeContentRemoved) {
[self deleteLocalStore];
_persistentStoreCoordinator = nil;
_managedObjectContext = nil;
NSLog(@" iCloud store was removed! Wait for empty store");
}
// Refresh user Interface
[[NSNotificationCenter defaultCenter] postNotificationName:@"notiIcloud" object:@"storeChanged"];
}];
}
我怎樣才能檢測到iCloud的內容已被刪除,避免收到上述錯誤?
這並不能真正回答你的問題,但是我很久以前就放棄了在iCloud支持上使用Core Data。然後我寫了我自己的同步,但它有點有限。然後我發現了Ensembles(http://www.ensembles.io)並且一直使用它。這對我來說真棒。有一個免費的開源版本。 –
Thx爲答案,但我更喜歡使用蘋果的標準iCloud支持。 – user3065901
祝你好運! –