別のデバイスを使用して作成された 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;
}
どうもありがとう!