2012-04-06 12 views
10

私は、私のLionアプリケーションをApp Sandboxを使用するように変換しています。私は、フォルダに永続的にアクセスできるように10.7.3で導入されたsecurity-scoped bookmarks機能を利用しようとしています。私が下のコードは、無しのブックマークを返し、次のログメッセージを生成します:XPC couldn't look up the Mach service for scoped bookmarks agentセキュリティスコープのブックマークを作成する際に問題が発生する

User Selected File Accessの資格をRead/Write Accessに設定し、周囲に電話をかけた場合と電話しなかった場合で試してみました(..AccessingSecurityScopedResource)。

私はドキュメンテーションに従ってすべてをやっていると思いますので、何か参考にしてください。このコードは、アプリをサンドボックス化する前にプレーンURLを取得するために働いていました。

NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 
[openPanel setCanChooseFiles:NO]; 
[openPanel setCanChooseDirectories:YES]; 
[openPanel setAllowsMultipleSelection:NO]; 

NSInteger result = [openPanel runModal]; 

if(result == NSFileHandlingPanelCancelButton) { 
    return; 
} 

NSArray *urls = [openPanel URLs]; 

if(urls != nil && [urls count] == 1) { 
    NSURL *url = [urls objectAtIndex:0]; 

    NSData *bookmark = nil; 
    NSError *error = nil; 
    bookmark = [url bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
      includingResourceValuesForKeys:nil 
           relativeToURL:nil // Make it app-scoped 
             error:&error]; 
    if (error) { 
     NSLog(@"Error creating bookmark for URL (%@): %@", url, error); 
     [NSApp presentError:error]; 
    } 

    NSLog(@"bookmark: %@", bookmark); 
} 

アップデート(×3)

今、私はそれが働いてしまったことを、私はPOWERBOXは、リソースへのアクセスを許可するので-startAccessingSecurityScopedResource-stopAccessingSecurityScopedResourceへの呼び出しは、上記のコードでは必要でないことを確認することができますユーザがNSOpenPanelでそれを選択した後。

別のアプリケーションセッションで作成されたアプリスコープのブックマークからドキュメントスコープのブックマークを作成するなど、別のセキュリティスコープのURLからブックマークを作成する場合、最初にファイルにアクセスする必要があります。

+2

ブックマークを作成する際に、スタート/ストップ・コールが必要になることはありません。すでにNSOpenPanelからアクセスしています。ブックマークは将来の実行のためにそのアクセスを保存しています。そして、将来の実行では、startAccessingSecurityScopedResourceを呼び出す必要があります(ブックマークの解決から戻ってくるURLで)。 – abarnert

+0

@abarnert私はあなたが正しいと信じています。なぜなら私はNSOpenPanelを使ってコードを投稿しましたが、NSOpenPanelやNSSavePanel以外のソースからブックマークを作成する必要があります。既存のブックマークから新しいブックマークを作成してスコープを変更するなど)。私は自分の投稿を更新しました。 – Dov

+0

「security-scoped bookmarks」が見つかるまで私の目が疲れました。これは本当に参考になるサンプルコードです。タグを作成する権限がありません。タグ「セキュリティスコープのブックマーク」を追加することをおすすめしますか? – Mark

答えて

8

これは、UIに表示されていない、私は重要な資格がありませんでしたが判明したが、the documentationに記載されている:

com.apple.security.files.bookmarks.app-scope 
+2

ありがとう、私はこの仕事をするために必要なものでした。ただ、-startAccessingSecurityScopedResourceが必要でないというあなたのアップデートに同意しないと付け加えたい。コードからこれをコメントすれば、もはやリソースにアクセスできなくなります。 – escrafford

+0

このソリューションをご利用いただき、ありがとうございます。私は自分のコードをデバッグするだけで、この資格がライオンで必要であることを発見しました(Mountain Lionではそうではありません)。 – Nickkk