概要
- macOS10.15でファイルやOSの機能にアクセスする際のセキュリティが厳しくなりました。
- 例えば、デスクトップ上のフォルダにアクセスしようとすると、下記のような許可を求めるダイアログが表示されます。
- しかしプログラムを書いている中で、許可を求めるダイアログがでないケースが2つあったので、以下で紹介します。
解決方法1. セキュリティとプライバシーの設定に情報が登録済みでないかを確認
- 一度「~フォルダ内のファイルにアクセスしようとしています」のダイアログで回答すると、下記の場所に情報が記録されます。
- ONにすればアクセスを許可できますが、「~フォルダ内のファイルにアクセスしようとしています」の表示は以後でなくなってしまいます。
- 再度出したい場合は情報をターミナルからリセットする必要があります。例えば以下の通りです。
tccutil reset <サービス名> <バンドルID>
- 詳しくは、セキュリティとプライバシーの設定値をリセットする(macOS 10.15 Catalina)を参照ください。
tccutil reset SystemPolicyDesktopFolder jp.co.hikeuchi.AccessConfirmSample
解決方法2. スクリーンセーバーレベルのウィンドウが悪さをしている場合
- WindowLevelが
kCGScreenSaverWindowLevel
のウィンドウがあるとき、アクセス許可画面は表示されないので、WindowLevelを変更してやる必要があります。
参考
GitHub
Code
- 簡単に下記を実装
- 選択したウィンドウのレベルに変える
- デスクトップファイルの読み込み
@IBAction func windowLevelChanged(_ sender: NSPopUpButton) {
switch sender.selectedTag() {
case 0:
window.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(kCGNormalWindowLevel))
case 1:
window.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(kCGModalPanelWindowLevel))
case 2:
window.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(kCGScreenSaverWindowLevel))
default:
window.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(kCGNormalWindowLevel))
}
}
@IBAction func openButtonClicked(_ sender: Any) {
let fileData: Data?
do {
let fileUrl = URL(fileURLWithPath: "/Users/ikeh/Desktop/sample.txt")
fileData = try Data(contentsOf:fileUrl)
} catch {
// ファイルデータの取得でエラーの場合
fileData = nil
}
print("\(String(describing: fileData))")
}
動作確認
- WindowLevelが
kCGScreenSaverWindowLevel
のウィンドウがあるとき、アクセス許可画面は表示されません - スクリーンセーバーのレベルのウィンドウが、アクセス許可画面の表示を妨げているような動作が見られます。
- その他のウィンドウレベルでは問題なく表示されることが確認できる