4

この質問を Apple のデベロッパー フォーラムに投稿しましたが、1 週間たっても返信がありませんでした。

標準のドキュメント ベースのアプリケーション (NSDocument を使用し、単純な XML ファイルを保存) を作成しました。これを拡張して、ドキュメント スコープのブックマークをユーザーが選択した外部ファイルにも保存する必要があります。

ドキュメント スコープのブックマークがファイルから読み取った後に解決されないという事実を除けば、すべてが機能しています。これは、NSDocument がファイルをアトミックに書き込むためです。

バックグラウンド

報告されたエラーに関する情報を Apple の開発者フォーラムや Web 検索で見つけるのは非常に困難であることがわかったので、同じボートに乗っている他の誰かを助けることができるように、見つけたことをすぐに文書化します。

失敗した試行によって返されるエラーは次のとおりです。

エラー Domain=NSCocoaErrorDomain Code=256 「ファイル “somefile.xml” を開けませんでした。」

ここで、紛らわしいことに、somefile.xml (のファイル名コンポーネント) は、以下のコード ブロックで「relativeToURL:」として渡される絶対 URL です。

アプリ サンドボックス: ドキュメント スコープのブックマークが解決しないなどのレポートがあります。アトミック ファイルの保存が有効になっている場合、サンドボックス/ブックマークの問題を示唆するエラーは返されません。

この問題の以前のレポートでは、同じエラーは発生しません (通常、エラー メッセージのない失敗を指します)。ファイルの書き込み時に次のコードを使用すると、上記と同じエラー メッセージが表示されます。

// HACK: Save a temporary value to the file so that the file exists when creating the bookmark
NSString *temp = @"Temp";
[temp writeToURL:saveURL atomically:NO encoding:NSUTF8StringEncoding error:&error];
// Create bookmark to imageURL relative to the save location
NSData *bookmarkData = [imageURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:[saveURL absoluteURL] error:&error];
if(bookmarkData == nil) return;
// Convert NSData to a string format.
NSString *bookmarkString = [bookmarkData base64EncodedString];
// Write the file.
[bookmarkString writeToURL:saveURL atomically:YES encoding:NSUTF8StringEncoding error:&error];

最終行を「atomically:NO」に変更すると、ブックマークが正しく解決され、すべてが期待どおりに機能します。

NSDocument とアトミック書き込み

NSDocument のデフォルトおよび推奨セットアップはアトミック書き込みを使用し、これはサンドボックスのコア機能の 1 つでは機能しないため、ドキュメント スコープのブックマークと NSDocument を連携させる方法を探しています。 NSDocument に、原子的にではなく直接ファイルを書き込むようにします。

Apple のフレームワークの失敗を回避する有効な解決策 (これらのフォーラムまたはより広い検索で) をまだ見つけていません。

私はの1つをオーバーライドすることができました

  • writeSafelyToURL:ofType:forSaveOperation:エラー:
  • writeToURL:ofType:forSaveOperation:エラー:
  • saveToURL:ofType:forSaveOperation:completionHandler:

ただし、いずれの場合も、ドキュメントには「このメソッドをオーバーライドする場合は、必ずスーパークラスの実装を呼び出すようにしてください」と記載されており、おそらくファイルをアトミックに保存し続けます。

私の目標は、Apple が (良くも悪くも) 開発者に押し付けている他のユーザー エクスペリエンスの期待を引き続きサポートできるような方法でそれを行うことです。autosavesInPlace、バージョンなど。しかし、AppStore にリリースできるサンドボックス化されたアプリケーションを機能させるために、これらの機能を喜んで犠牲にします。

4

0 に答える 0