Почему мое приложение не отображается в папке диска iCloud

Папка iCloud Drive не отображает мою папку приложения.

Вот как я отправляю файл на iCloud Drive:

- (IBAction)btnStoreTapped:(id)sender {
    // Let 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];
}

На самом деле я подробно объяснил в этом сообщении

Все выглядит прекрасно. Я могу загружать файлы успешно, и я могу показать их на своем компьютере через терминал.

enter image description here

enter image description here

И я могу видеть файлы, которые я только что загрузил с моего iphone.

Но ничего не отображается в папке моего iCloud Drive на моем mac или icloud.com. Почему они не показывают мою папку приложений, даже если все выглядит нормально и нет ошибки?

Ответ 1

Единственное, что сработало для меня (у меня были точно такие же проблемы) в существующем приложении (так что я не могу изменить идентификатор пакета) было создание подпапки Documents в папке URLForUbiquityContainerIdentifier и написать все мои файлы там.

Как только я это сделал, они появились в Finder на моем Mac. Однако они не отображались в подпапке Documents моей папки приложения на iCloud Drive, они появились непосредственно в папке приложения.

Ответ 2

Я попробовал тот же код в swift и получил ту же проблему.

Это то, что сработало для меня:

1) Найдите следующие строки в исходном коде info.plist

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

2) Увеличьте номер версии. Если оно равно 1, увеличьте его до 2. Сделайте то же самое, что и номер версии.

3) При необходимости удалите приложение с устройства и запустите его после выполнения следующих двух шагов.

Ответ 3

Но ничего не отображается в папке моего iCloud Drive на моем mac или icloud.com. Почему они не показывают мою папку приложений, даже все выглядит так: штраф и нет ошибки?

Это новое приложение или недавно созданный контейнер iCloud? Тогда причина такова: NSUbiquitousContainerIsDocumentScopePublic = true действует только после того, как приложение (и названный контейнер iCloud) прошло проверку и одобрение.

Я не помню, где я читал, что "недостающая часть информации" (по крайней мере, я не получил ее из документации Apple).

Еще один пример из моего опыта, который, кажется, доказывает это: в существующем приложении (с контейнером iCloud старого стиля - TeamIdentifierPrefix) я могу сделать этот контейнер видимым на диске iCloud. Но новый контейнер не будет отображаться в iCloud Drive "публике" (даже жестко я вижу его с помощью Terminal.app на моем Mac). После того, как приложение (с новым контейнером) было одобрено и доступно в AppStore, вы можете снова играть с Info.plist(и сделать новый контейнер видимым/скрытым,...)

Ответ 4

  • Bump CFBundleVersion в Info.plist.
  • Создайте новый контейнер iCound на https://developer.apple.com/account/ios/identifier/cloudContainer
  • Укажите пользовательские контейнеры в Xcode. Разблокируйте старые контейнеры и отметьте новый созданный контейнер.