为什么我的应用程序未显示在iCloud Drive Folder中

时间:2015-05-21 23:19:09

标签: ios icloud icloud-drive

iCloud Drive Folder不会显示我应用的文件夹。

这是我将文件发送到iCloud Drive的方式:

- (IBAction)btnStoreTapped:(id)sender {
    // Let's get the root directory for storing the file on iCloud Drive
    [self rootDirectoryForICloud:^(NSURL *ubiquityURL) {
        NSLog(@"1. ubiquityURL = %@", ubiquityURL);
        if (ubiquityURL) {

            // We also need the 'local' URL to the file we want to store
            //NSURL *localURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Photo" ofType:@"pdf"]];


            NSURL *localURL = [self localPathForResource:@"document" ofType:@"doc"];
            NSLog(@"2. localURL = %@", localURL);

            // Now, append the local filename to the ubiquityURL
            ubiquityURL = [ubiquityURL URLByAppendingPathComponent:localURL.lastPathComponent];
            NSLog(@"3. ubiquityURL = %@", ubiquityURL);

            // And finish up the 'store' action
            NSError *error;
            if (![[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:localURL destinationURL:ubiquityURL error:&error]) {
                NSLog(@"Error occurred: %@", error);
            }else{
                NSLog(@"Succeed");
            }
        }
        else {
            NSLog(@"Could not retrieve a ubiquityURL");
        }
    }];
}

- (void)rootDirectoryForICloud:(void (^)(NSURL *))completionHandler {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *rootDirectory = [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]URLByAppendingPathComponent:@"Documents"];

        if (rootDirectory) {
            if (![[NSFileManager defaultManager] fileExistsAtPath:rootDirectory.path isDirectory:nil]) {
                NSLog(@"Create directory");
                [[NSFileManager defaultManager] createDirectoryAtURL:rootDirectory withIntermediateDirectories:YES attributes:nil error:nil];
            }
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            completionHandler(rootDirectory);
        });
    });
}

- (NSURL *)localPathForResource:(NSString *)resource ofType:(NSString *)type {
    NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *resourcePath = [[documentsDirectory stringByAppendingPathComponent:resource] stringByAppendingPathExtension:type];
    return [NSURL fileURLWithPath:resourcePath];
}

实际上我做了所有解释in this post

一切看起来都很好。我可以成功上传文件,我可以通过终端在我的电脑上显示它们。

enter image description here

enter image description here

我可以看到我刚从iphone上传的文件。

但我的mac或icloud.com中的iCloud Drive文件夹中没有显示任何内容。为什么他们没有显示我的应用程序的文件夹,即使一切看起来都很好,没有错误?

5 个答案:

答案 0 :(得分:6)

我在swift中尝试了相同的代码并遇到了同样的问题。

这对我有用:

1)在info.plist源代码中找到以下行

I have fixed the problem a bit different logic.

View myView;
case R.id.btnReset:

                if (myView.mBitmap != null) {
                    myView.mBitmap.eraseColor(Color.TRANSPARENT);
                    myView.mPath.reset();
                    myView.invalidate();
                }
                break;

2)增加版本号。如果是1,则将其增加到2.无论版本号是什么,都执行相同操作。

3)如果需要,请从设备中卸载应用程序,然后按照上述两个步骤重新运行该应用程序

答案 1 :(得分:5)

在现有应用程序中唯一对我有用的东西(我有完全相同的问题)(因此我无法更改软件包ID)是在Documents下创建URLForUbiquityContainerIdentifier子文件夹文件夹并在那里写下我的所有文件。

一旦我这样做,他们就出现在Mac上的Finder中。但是,它们没有出现在iCloud Drive中应用程序文件夹的Documents子文件夹中,它们直接显示在应用程序文件夹中。

答案 2 :(得分:2)

  

但我的mac或icloud.com中的iCloud Drive文件夹中没有显示任何内容。   为什么他们没有显示我的应用程序的文件夹甚至一切看起来像   很好,没有错误?

这是一个新的应用程序还是新创建的iCloud容器? 原因是:NSUbiquitousContainerIsDocumentScopePublic = true仅在应用程序(以及授权的iCloud容器)经过审核和批准后才生效。

我不记得我在哪里读到“缺少一条信息”(至少我没有从Apple文档中得到它)。

根据我的经验的另一个例子,它似乎证明了这一点:在现有的应用程序中(使用“旧样式 - TeamIdentifierPrefix”iCloud容器),我可以在iCloud驱动器上显示该容器。但是新的容器在iCloud Drive中“不向公众”显示(甚至很难,我可以在我的Mac上使用Terminal.app看到它)。一旦应用程序(使用新容器)获得批准并在AppStore上可用,您就可以再次使用Info.plist(并使新容器可见/隐藏,......)

答案 3 :(得分:0)

  1. 在Info.plist中阻止CFBundleVersion。
  2. https://developer.apple.com/account/ios/identifier/cloudContainer
  3. 上创建新的iCound容器
  4. 在Xcode中指定自定义容器。取消旧容器并勾选新创建的容器。

答案 4 :(得分:0)

Info.plist example

对我来说,忘记在应用程序的 info.plist 中为新容器添加上述条目。