获取有关iCloud中文件更改的通知

时间:2015-12-22 19:28:42

标签: ios icloud icloud-documents

我在两个不同的设备上创建一个名为File - 1.jpg的文件,并将其放在iCloud容器中。

我没有使用UIDocument,即使我尝试使用它,也不会产生冲突。相反,我看到的是iCloud会自动重命名和移动文档。

上传后,一个或另一个文件变为File - 2.jpg。所有这一切都很好,但现在我没有文件的参考,所以我不知道哪个是...

有没有办法在应用程序端通知iCloud中文件已重命名/移动/删除?

2 个答案:

答案 0 :(得分:1)

使用 CKSubscription

初始化CKSubscription后,您可以指定通知选项:

  • CKSubscriptionOptionsFiresOnRecord 创作
  • CKSubscriptionOptionsFiresOnRecord 删除
  • CKSubscriptionOptionsFiresOnRecord 更新
  • CKSubscriptionOptionsFires 一旦

iCloud Subscriptions

这些看起来也很有用:

https://www.bignerdranch.com/blog/cloudkit-the-fastest-route-to-implementing-the-auto-synchronizing-app-youve-been-working-on/

http://www.raywenderlich.com/83116/beginning-cloudkit-tutorial

答案 1 :(得分:1)

最终,我必须创建一个实现NSFilePresenter的类并将其指向iCloud容器文件夹。

iCloud的实时更新可能会很晚,只有在iCloud提取元数据时才会发生。

此外,我必须将每个创建的文件与每个设备和iCloud帐户相关联,并在CoreData中保留此数据。这是ubiquityIdentityToken变得有用的地方。

iCloud容器中的所有文件操作都应该使用NSFileCoordinator

对于添加/删除事件,最好使用NSMetadataQueryNSFileCoordinator根本不报告这些事件,但仍可用于检测文件何时被移动,这就是元数据查询报告为更新。

这是一个非常基本的样板,可以作为起点:

@interface iCloudFileCoordinator () <NSFilePresenter>

@property (nonatomic) NSString *containerID;
@property (nonatomic) NSURL *containerURL;

@property (nonatomic) NSOperationQueue *operationQueue;

@end

@implementation iCloudFileCoordinator

- (instancetype)initWithContainerID:(NSString *)containerID {
    self = [super init];
    if(!self) {
        return nil;
    }

    self.containerID = containerID;
    self.operationQueue = [[NSOperationQueue alloc] init];
    self.operationQueue.qualityOfService = NSQualityOfServiceBackground;

    [self addFilePresenter];

    return self;
}

- (void)dealloc {
    [self removeFilePresenter];
}

- (void)addFilePresenter {
    [NSFileCoordinator addFilePresenter:self];
}

- (void)removeFilePresenter {
    [NSFileCoordinator removeFilePresenter:self];
}

#pragma mark - NSFilePresenter
#pragma mark - 

- (NSURL *)presentedItemURL {
    NSURL *containerURL = self.containerURL;

    if(containerURL) {
        return containerURL;
    }

    NSFileManager *fileManager = [[NSFileManager alloc] init];

    containerURL = [fileManager URLForUbiquityContainerIdentifier:self.containerID];

    self.containerURL = containerURL;

    return containerURL;
}

- (NSOperationQueue *)presentedItemOperationQueue {
    return self.operationQueue;
}

- (void)presentedSubitemAtURL:(NSURL *)oldURL didMoveToURL:(NSURL *)newURL {
    NSLog(@"Moved file from %@ to %@", oldURL, newURL);
}

/*
 ... and other bunch of methods that report on sub item changes ...
 */

@end
相关问题