当我尝试从 iCloud 打开使用另一台设备创建的 UIDocument 时,我遇到了奇怪的行为。当我调用openWithCompletionHandler时,它永远不会完成。
这是我重现该行为的方式:
- 我在 iPad 上创建了一个新的 UIDocument 并将其存储在 iCloud 中
- 然后我删除了同一个应用程序,但从 iPhone
- 我在 iPhone 上从 XCode 运行应用程序
- 到目前为止,iPhone 是干净的,因为该应用程序已被删除
- 当应用程序第一次在 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;
}
非常感谢!