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