18

iCloud Drive 文件夹不显示我的应用程序的文件夹。

这就是我将文件发送到 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];
}

实际上我做了这篇文章中解释的一切

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

在此处输入图像描述

在此处输入图像描述

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

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

4

5 回答 5

10

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

这对我有用:

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

<key>CFBundleVersion</key>
<string>1</string>

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

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

于 2017-09-20T07:28:42.540 回答
7

在现有应用程序(所以我无法更改捆绑 ID)中,唯一对我有用(我有完全相同的问题)是在Documents文件夹下创建一个子URLForUbiquityContainerIdentifier文件夹并将我的所有文件写入那里。

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

于 2017-04-14T21:40:39.743 回答
6

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

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

我不记得我在哪里读到了“丢失的信息”(至少我没有从 Apple 文档中得到它)。

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

于 2015-05-29T19:41:38.867 回答
1
  1. 在 Info.plist 中碰撞 CFBundleVersion。
  2. 在https://developer.apple.com/account/ios/identifier/cloudContainer上创建一个新的 iCound 容器
  3. 在 Xcode 中指定自定义容器。取消勾选旧容器并勾选新创建的容器。
于 2017-12-09T11:31:06.957 回答
0

Info.plist 示例

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

于 2021-03-19T21:02:57.233 回答