現象
設定画面の「システムのユーザ辞書」で「読み込む」を押すと、~/Library/KeyboardServices/TextReplacements.db が実在していても次のエラーになります。
読み込みエラー: The operation couldn't be completed. (Core.SystemUserDictionaryHelper.FetchError error 1.)
error 1 は FetchError.fileNotExist です。
原因
3点あると思います。
SystemUserDictionaryHelper.fetchEntries() が最初に FileManager.default.fileExists(atPath:) で存在確認していますが、App Sandbox下ではコンテナ外の ~/Library/KeyboardServices/ は stat 自体が拒否されるため、ファイルが実在しても false になります。その結果、NSOpenPanelで権限をもらうフォールバック(isReadableFile が false の場合の分岐)に到達する前に .fileNotExist を throw して終了します
- entitlements に
com.apple.security.files.user-selected.read-only がないため、仮にパネルまで到達してもユーザーがフォルダを選択したアクセス権が付与されません
promptUserForTextReplacementDirectory() の panel.directoryURL が FileManager.default.homeDirectoryForCurrentUser 起点ですが、サンドボックス内ではこれはコンテナ側のホームを指します
修正例(0.1.4ベースの自分用ビルドで動作確認済み)
fileExists の事前guardをやめ、isReadableFile で読めない場合(サンドボックスで存在確認できない場合を含む)にNSOpenPanelを出す構成に変更
- entitlements に
com.apple.security.files.user-selected.read-only を追加
panel.directoryURL を URL(fileURLWithPath: "/Users/\(NSUserName())/Library/KeyboardServices", isDirectory: true) に変更
この修正で「読み込む」→ パネルで KeyboardServices フォルダを選択 → 読み込み成功、となることを確認しました(DB内40件が取り込まれました)。
現象
設定画面の「システムのユーザ辞書」で「読み込む」を押すと、
~/Library/KeyboardServices/TextReplacements.dbが実在していても次のエラーになります。error 1 は
FetchError.fileNotExistです。原因
3点あると思います。
SystemUserDictionaryHelper.fetchEntries()が最初にFileManager.default.fileExists(atPath:)で存在確認していますが、App Sandbox下ではコンテナ外の~/Library/KeyboardServices/は stat 自体が拒否されるため、ファイルが実在しても false になります。その結果、NSOpenPanelで権限をもらうフォールバック(isReadableFileが false の場合の分岐)に到達する前に.fileNotExistを throw して終了しますcom.apple.security.files.user-selected.read-onlyがないため、仮にパネルまで到達してもユーザーがフォルダを選択したアクセス権が付与されませんpromptUserForTextReplacementDirectory()のpanel.directoryURLがFileManager.default.homeDirectoryForCurrentUser起点ですが、サンドボックス内ではこれはコンテナ側のホームを指します修正例(0.1.4ベースの自分用ビルドで動作確認済み)
fileExistsの事前guardをやめ、isReadableFileで読めない場合(サンドボックスで存在確認できない場合を含む)にNSOpenPanelを出す構成に変更com.apple.security.files.user-selected.read-onlyを追加panel.directoryURLをURL(fileURLWithPath: "/Users/\(NSUserName())/Library/KeyboardServices", isDirectory: true)に変更この修正で「読み込む」→ パネルで KeyboardServices フォルダを選択 → 読み込み成功、となることを確認しました(DB内40件が取り込まれました)。