問題タブ [security-scoped-bookmarks]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nsurl - セキュリティ スコープのブックマークに対する現在のカーネル リソースの制限は?
状態のドキュメント-[NSURL startAccessingSecurityScopedResource]
:
startAccessingSecurityScopedResource メソッドへのすべての呼び出しと、対応する stopAccessingSecurityScopedResource メソッドへの呼び出しのバランスを取る必要があります。ファイル システム リソースが不要になったときにアクセス権を放棄しなかった場合、アプリはカーネル リソースをリークします。十分なカーネル リソースがリークされた場合、アプリは再起動されるまで、Powerbox やセキュリティ スコープのブックマークなどを介してサンドボックスにファイル システムの場所を追加する機能を失います。
カーネルリソースの実際の制限が何であるかについて、誰かが光を当てることができますか?
私は自分のアプリをこれらの正確な制限に到達させたくありません。コードが危険な/愚かなことをしていないかどうかを判断できるように、大まかな数字を知っておくと便利です.
nsurl - plist の NSURL をサンドボックス化されたアプリの NSPathControl にバインドする方法は?
私の OS X アプリには、ユーザーが選択したディレクトリへの永続的なアクセスが必要です。value
アプリ サンドボックスを有効にする前は、UIにはデータ モデルへのバインディングを備えた NSPathControl がありました。モデルのデータ型は でNSData
あり、バインディングはNSKeyedUnarchiveFromData
値トランスフォーマーを使用しました。それはうまくいきました。
アプリのサンドボックス化がオンになっていると、NSURL がセキュリティ スコープではないため、これは明らかに失敗します。これを改善するためにNSKeyedUnarchiveFromData
、以下に示すように、バインディングのトランスフォーマーを独自のトランスフォーマーに置き換えました。
残念ながら、常に正しく機能するとは限りません。私 (ユーザーとして行動) が NSPathControl からファイルを選択すると、transformedValue:
渡された NSData 引数が非 nil であっても nil を返すことがあります。つまり、NSURL はブックマーク データを解決しません。ここで何が起こっているか知っている人はいますか?失敗した場合、によって返されるエラーURLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:
は
エラー Domain=NSCocoaErrorDomain Code=259 「ファイルの形式が正しくないため、ファイルを開くことができませんでした。」
cocoa - 古い NSURL ブックマークを処理する正しい方法は何ですか?
セキュリティ スコープのブックマークから NSURL を解決するときに、ユーザーがそのファイルまたはフォルダーの名前を変更または移動した場合、ブックマークは古くなります。Apple のドキュメントには、古さについて次のように書かれています。
古い
返された場合、YES の場合、ブックマーク データは古くなっています。アプリは、返された URL を使用して新しいブックマークを作成し、保存されている既存のブックマークのコピーの代わりに使用する必要があります。
残念ながら、これがうまくいくことはめったにありません。5% の確率で機能する場合があります。返された URL を使用して新しいブックマークを作成しようとすると、コード 256 のエラーが発生し、コンソールを見ると、更新された URL でファイル読み取りデータを拒否することを示すサンドボックスからのメッセージが表示されます。
注ブックマークの再生成が機能する場合、最初に再生成されたときにのみ機能するようです。フォルダー/ファイルを再度移動/名前変更すると、機能しないようです。
ブックマークを最初に作成して保存する方法
ブックマークを解決するコード
ブックマークが古い場合、結果として解決された URL は正しい場所を指します。[url startAccessingSecurityScopedResource] が YES を返すという事実にもかかわらず、実際にはファイルにアクセスできません。
古いブックマークに関するドキュメントを誤解しているのかもしれませんが、何かばかげたことをしているだけだと思います。ブックマークされたファイル/フォルダーの名前が変更または移動されるたびに NSOpenPanel をポップすることは、この時点で私の唯一の他のオプションであり、ばかげているようです。
com.apple.security.files.bookmarks.app-scope、com.apple.security.files.user-selected.read-write、およびcom.apple.security.app-sandboxをすべて true に設定していることを追加する必要があります私の資格ファイルに。
cocoa - Yosemite の外付けドライブで NSURL ブックマークの解決に失敗する
私のココア アプリでは、次のコードを使用して、NSOpenPanel から取得した NSURL からセキュリティ スコープのブックマークを作成します。
それを解決するために、私は以下を使用します:
Mac OS X Mavericks (10.9) では、USB スティックなどの外部ドライブのブックマークを作成すると、これは正常に機能します。ただし、Yosemite (10.10) では、外部ドライブがマウントさnil
れていない場合、Mavericks のようにブックマークの解像度が戻りません。代わりに、Macintosh HD を指す URL を返します (つまり[myURL path]
、文字列 を返します@"/"
)。今回の件で気付きましたisStale==YES
。
他の誰かが同じ問題を経験しましたか? これは Yosemite の既知のバグですか、それともそのようなケースを処理するための追加の手順が不足していますか? 回避策はありますか?
macos - アプリ拡張機能のセキュリティ スコープ ブックマーク
アプリケーション ディレクトリの外部にあるユーザーが選択したフォルダーに関する情報を表示する TodayWidget アプリ拡張機能を作成しています。
私のメイン アプリケーションでは、NSOpenPanel 経由で powerbox を使用してフォルダーを選択できます。その後、セキュリティ スコープのブックマークを、TodayWidget からアクセスできるアプリ グループ コンテナーのユーザー デフォルトに保存できます。
TodayWidget はブックマーク データを読み取ることができますが、URLByResolvingBookmarkDataを呼び出すと、次のエラーが発生します。
The file couldn’t be opened because it isn’t in the correct format.
メイン アプリケーションと TodayWidget の両方に、以下の権限があります。
- com.apple.security.files.bookmarks.app-scope
- com.apple.security.files.user-selected.read-only
Apple のドキュメントによると、セキュリティ スコープのブックマークを作成したアプリケーションのみがそれを使用できます。これらは、組み込みアプリケーションが許可されていないことを意味していると思いますか?
私は XPC の使用を検討しましたが、XPC はセキュリティ スコープのブックマークも使用できず、通常のブックマークしか使用できないため、実際には問題の解決にはなりません。コンピュータが再起動されるとすぐに、XPC プロセスはディレクトリへのアクセスを失います。
本当に必要なのは、XPC プロセスがユーザー指定のディレクトリへの読み取りアクセスを取得する方法だけです。コンピューターを再起動するたびにメイン アプリケーションを再起動する必要がない方法はありますか?
macos - ドキュメント スコープのセキュリティ ブックマークを Core Data に保存するにはどうすればよいですか?
複数のターゲットを含むアプリをアプリ グループとして相互に連携させています。
サンドボックス化し始めたときに問題が発生しました。
- アプリは URL を Core Data に保存し、1 つのターゲットが保存を行い、別のターゲットが読み取りを行います
- ターゲットによって作成されたブックマークは、他のターゲットによって解決できなくなりました
ドキュメント スコープのブックマークをアプリ間で共有できることは知っています。しかし、別の「ラッパー」ドキュメントに保存する必要があるようです。
ドキュメント スコープのブックマークを Core Data に保存し、それらを異なるターゲット間で共有する良い方法はありますか?