Bookmark とは
Snow Leopard から、 NSURL に bookmark という機能が加わった。 Bookmark はあるファイルシステムリソース(つまりファイルやフォルダ)を指す一種の URL であり、そのリソースのパスを表す NSURL から生成できる。 Bookmark は参照しているリソースが移動しても有効であり、 bookmark から移動先のパスを表す NSURL を取得することができる。
// NSURL からbookmark を生成
- (NSData *)bookmarkDataWithOptions:(NSURLBookmarkCreationOptions)options includingResourceValuesForKeys:(NSArray *)keys relativeToURL:(NSURL *)relativeURL error:(NSError **)error;
// Bookmark を解決して NSURL を取得
+ (id)URLByResolvingBookmarkData:(NSData *)bookmarkData options:(NSURLBookmarkResolutionOptions)options relativeToURL:(NSURL *)relativeURL bookmarkDataIsStale:(BOOL *)isStale error:(NSError **)error;
Security-scoped bookmark
Sandbox が有効な環境では、ユーザーが Open Panel などで与えた URL は Sandbox 内から読み書き可能になるが、アプリケーションを終了すると読み書きの権限は失われる。だがそのような URL から生成した bookmark はアクセス権限の情報を保持するので、これを保存しておくことで、アプリケーションを次に起動したときに読み書き可能な URL を取得できる。アクセス権限の情報を持つ bookmark を security-scoped bookmark といい、そこから生成された URL は security-scoped URL と呼ばれる。 Security-scoped URL が指すリソースに Sandbox 内からアクセスするには、アクセスする前に -startAccessingSecurityScopedResource を呼び、アクセスを終えたら必ず stopAccessingSecurityScopedResource を呼ぶ:
NSURL *URL = <#Resolve bookmark#>;
[URL startAccessingSecurityScopedResource];
NSString *contents = [NSString stringWithContentsOfURL:URL];
[URL stopAccessingSecurityScopedResource];
App-scoped bookmark と document-scoped bookmark
ある Sandbox 化アプリケーションから見てリソースが読み書き可能であるという情報を記録した bookmark は app-scoped bookmark と呼ばれる。
対して、あるドキュメントから見てリソースが読み書き可能であるという情報を記録した bookmark は document-scoped bookmark と呼ばれる。この種の bookmark は、複数の外部リソースへの参照を持つファイルを作るときに有効である。
外部の画像ファイルへの参照を埋め込んだリッチテキスト文書を考えてみよう。あるワープロソフトAは、リッチテキスト文書ファイルの中に画像ファイルへの document-scoped bookmark を記録する。別のワープロソフトBは、リッチテキスト文書ファイルを開き、画像への document-scoped bookmark を解決することで、画像ファイルの読み書き権限も得ることができる。
Document-scoped bookmark を生成するには、-bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error: の relativeToURL に基準となるドキュメントの URL を指定する。