NSFileWrapper ドキュメントを iCloud と同期する際に問題があります。ラッパーを作成して、どこにでもあるコンテナに保存できます。
それを作成したデバイスから読み取ろうとすると、機能します。iCloud から取得した別のデバイスから読み取ろうとすると、クラッシュします。
いくつかのコード:
NSString を使用してラッパー コンテナーを追加するこの関数
- (void) addNSString:(NSString*)_string toFileWrapper:(NSFileWrapper*)_wrapper forKey:(NSString*)_key {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_string];
if(data) {
[_wrapper addRegularFileWithContents:data preferredFilename:_key];
}
}
そして、これをデコードする方法は次のとおりです。
- (id) unarchiveObjectFromWrappers:(NSDictionary*)_wrappers withKey:(NSString*)_key {
id value = nil;
NSFileWrapper *wrapper = [_wrappers valueForKey:_key];
if(wrapper) {
NSData *data = [wrapper regularFileContents];
if(data) {
value = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
}
return value;
}
デコード部分は 1 つのデバイスで動作し、他のデバイスでは動作しません (NSKeyedUnarchiver が NSData からアーカイブを解除しようとすると EXC_BAD_ACCESS になります。NSData は適切な長さとすべてを備えているようですが、データをログに記録しようとするとクラッシュします)。
私の推測では、NSFileWrapper はコンテンツ全体をダウンロードするのではなく、構造のみをダウンロードし、それを利用できるようにするために何かをしなければならないと思います。しかし、私は何を知りません。
何か案は?
========
編集:
NSURLUbiquitousItemIsDownloadedKey は、ファイルがダウンロードされたと言いますが、サンドボックスにコピーしようとすると、「操作を完了できませんでした。ファイル記述子が正しくありません」というエラーで失敗します。
そのため、ファイルがiCloudに正しくアップロードされていないか、正しくダウンロードされていません...