3

当我尝试从 iCloud 打开使用另一台设备创建的 UIDocument 时,我遇到了奇怪的行为。当我调用openWithCompletionHandler时,它永远不会完成。

这是我重现该行为的方式:

  1. 我在 iPad 上创建了一个新的 UIDocument 并将其存储在 iCloud 中
  2. 然后我删除了同一个应用程序,但从 iPhone
  3. 我在 iPhone 上从 XCode 运行应用程序
  4. 到目前为止,iPhone 是干净的,因为该应用程序已被删除
  5. 当应用程序第一次在 iPhone 上运行时,它调用了 openWithCompletionHandler方法,该方法挂起并且没有任何反应。在openWithCompletionHandler操作结束后,它没有到达要执行的代码块。

它仅在我创建一个新的 UIDocument 并将其从 iPhone 存储在 iCloud 中时才有效。然后,如果我执行相同的步骤(1-5),但在 iPad 上我会遇到类似的行为。

这是我拥有的源代码:

if ([query resultCount] == 1)
{
    NSMetadataItem *item = [query resultAtIndex:0];
    NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];

    _progressDoc = [[ProgressDocument alloc] initWithFileURL:url];

    [_progressDoc openWithCompletionHandler:^(BOOL success) {
        if (success)
        {
            [[NSNotificationCenter defaultCenter] 
             addObserver:self 
             selector:@selector(progressDocumentHasChanged:) 
             name:UIDocumentStateChangedNotification 
             object:nil];

            NSLog(@"Progress Document opened from iCloud");
        }
        else {
            NSLog(@"failed to open Progress Document from iCloud");
        }
    }];
}

有没有人遇到过类似的问题?

我也尝试使用下面的方法手动下载文件,但仍然是相同的行为......

- (BOOL)downloadFileIfNotAvailable:(NSURL*)file {
    NSNumber*  isIniCloud = nil;

    if ([file getResourceValue:&isIniCloud forKey:NSURLIsUbiquitousItemKey error:nil]) {
        // If the item is in iCloud, see if it is downloaded.
        if ([isIniCloud boolValue]) {
            NSNumber*  isDownloaded = nil;
            if ([file getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil]) {
                if ([isDownloaded boolValue])
                    return YES;

                // Download the file.
                NSError *error;
                NSFileManager*  fm = [NSFileManager defaultManager];
                BOOL success = [fm startDownloadingUbiquitousItemAtURL:file error:&error];
                if (success) {
                    NSLog(@"Started download at URL: %@", file);
                } else {
                    NSLog(@"Failed to start download at URL: %@: %@", file, error.localizedDescription); 
                }                 
                return NO;
            }
        }
    }

    // Return YES as long as an explicit download was not started.
    return YES;
}

非常感谢!

4

0 回答 0