如何删除iPhone上的iCloud ubiquity容器?

时间:2014-01-11 04:37:53

标签: ios core-data icloud

我遇到与this question相同的问题,我删除应用时没有清理iCloud ubiquity容器。

但是当我尝试删除ubiquity容器时,我收到一条错误消息(操作无法完成。(Cocoa error 513.))。我该如何删除它? 这就是我正在使用的:

NSString *path = @"/private/var/mobile/Library/Mobile Documents/XXXXXX";
[[NSFileManager defaultManager] removeItemAtPath:path error:&error];

编辑:即使我删除设备上的应用程序和所有iCloud数据(设置应用程序 - > iCloud->存储和备份 - >管理存储 - >应用程序名称),仍有一些数据遗留下来iCloud ubiquity容器。这是我第一次启动应用程序时要删除的数据(如果用户重新安装应用程序)。

1 个答案:

答案 0 :(得分:3)

您应该能够通过转到设置应用程序 - > iCloud->存储&存储&备份 - >管理存储 - >应用程序名称,然后删除所有文件。我想你可能只看到iCloud / Documents目录中的文件,所以你可能需要代码来清除其他内容。

或者使用Mac并转到〜/ Library / Mobile Documents并删除那里的文件。

要获取iCloud容器,请使用:

NSURL *iCloudURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:ubiquityID];

其中ubiquityID是您的应用iCloud容器ID。

要列出iCloud容器中的所有文件,请使用iCloudURL

这样的内容
/*! Recursively lists all files

 @param dir The directory to list
 @param padding A string padding to indent the output depending on the level of recursion
 */
- (void)listAllFilesInDirectory:(NSURL*)dir padding:(NSString*)padding {

    NSArray *docs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:dir includingPropertiesForKeys:nil options:0 error:nil];

    for (NSURL* document in docs) {

        FLOG(@" %@ %@", padding, [document lastPathComponent]);

        BOOL isDir;
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:document.path isDirectory:&isDir];

        if (fileExists && isDir) {
            [self listAllFilesInDirectory:document padding:[NSString stringWithFormat:@"  %@", padding]];
        }

    }
}

要从ubiquity容器中删除内容,您需要使用这样的文件坐标:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];

    [fileCoordinator coordinateWritingItemAtURL:fileURL options:NSFileCoordinatorWritingForDeleting
                                              error:nil byAccessor:^(NSURL* writingURL) {
                                                  NSFileManager* fileManager = [[NSFileManager alloc] init];
                                                  NSError *er;
                                                  //FLOG(@" deleting %@", writingURL);
                                                  bool res = [fileManager removeItemAtURL:writingURL error:&er];
                                                  if (res) {
                                                      LOG(@"   iCloud files removed");
                                                  }
                                                  else {
                                                      LOG(@"   document NOT removed");
                                                      FLOG(@"   error %@, %@", er, er.userInfo);
                                                  }
                                              }];
 }