4

iCloudでアプリを作成しています。しかし、私はいくつかの問題を抱えています。NSFileWrapper を使用して iCloud にディレクトリを作成し、NSFileWrapper ディレクトリに NSData (コンテナ) ファイルを作成します。このコードを使用して、NSFileWrapper を NSMutableArray に変換しています。

NSFileWrapper *MyWrapper=[[[MyDocument data] fileWrappers] objectForKey:@"myFile.doh"];
    NSData *MyData=[NSData dataWithData:[MyWrapper regularFileContents]];
    NSMutableArray *MyList=[NSPropertyListSerialization propertyListFromData:MyData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];

そして、このコンテナを作成したデバイスでのみ正しく動作します。他のデバイスでは、このコードの結果は BAD_ACCESS になります (コードの 2 行目で、データで何かを開始します)。デバッグ中、関数「regularFileContents」は正しいデータ サイズの正しいオブジェクトを返しますが、このデータを読み込もうとすると BAD_ACEESS(code=10) が発生します。

ARCを使っているので、メモリ管理のエラーではありません。

問題はプロジェクト/コード署名の設定にあるのでしょうか? 何か案は?

ありがとう!

4

1 に答える 1

1

私もこれに遭遇し、多くの実験の結果、外側のラッパーがダウンロードされたにもかかわらず、内側のコンテンツがまだ実際にはダウンロードされておらず、regularFileContents の呼び出しが失敗することがわかりました。

MyWrapperで startDownloadingUbiquitousItemAtURL を呼び出していましたが、それが完了するとエラーはなくなりました。ファイルのダウンロード状況をチェックし (MyWrapper への URL を知っていると仮定して)、まだダウンロードされていない場合はダウンロードを開始する方法を次に示します。

-(BOOL)downloadFileIfNotAvailable:(NSURL*)fileURL
{
    NSNumber *isInCloud = nil;

    if ([fileURL getResourceValue:&isInCloud forKey:NSURLIsUbiquitousItemKey error:nil])
    {
        if ([isInCloud boolValue]) {
            NSNumber *isDownloaded = nil;
            if ([fileURL getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil])
            {
                if ([isDownloaded boolValue])
                {
                    return YES;
                }

                NSError *error = nil;
                [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:fileURL error:&error];

                if (error)
                {
                    NSLog(@"Download Failed :: %@", error);
                }

                return NO;
            }
        }
    }

    return YES;
}
于 2012-06-30T05:07:28.247 に答える