渋谷の隅から

東京都に住んでるわけではないです

App Sandboxの中のmacOSアプリから本当のホームディレクトリを知る

開発 ≫ macOS

公開日: / タグ: Cocoa, Swift

⚠️ この記事は公開されてから6年以上経過しており、現在では内容が古く・正しくなくなっている可能性があります。別途最新の情報を参照することを推奨します。

NSOpenPanelとかcom.apple.security.temporary-exception.files.home-relative-path系を使うときに(Sandbox内のものではなく)本当のホームディレクトリが欲しくなることがありますが、

  • NSHomeDirectory()
  • ProcessInfo.processInfo.environment["HOME"]
  • ("~/hoge/fuga" as NSString).expandingTildeInPath

ではいずれもApp Sandbox内のホームディレクトリ(/Users/xxxxx/Library/Containers/...)が返されてしまったため、本当のホームディレクトリを返すAPIを探しました。

結論

getpwuid(getuid())で帰ってくるCのstructを見る

guard let pw = getpwuid(getuid()) else {
    // fatalErrorでもよいのでは
    let alert = NSAlert()
    alert.messageText = "エラー"
    alert.informativeText = "getpwuid(getuid())に失敗しました"
    alert.alertStyle = .critical
    alert.runModal()
    return
}
let homeDirPath = String(cString: pw.pointee.pw_dir)
print(homeDirPath) // "/Users/xxxxx"

もうちょっといい方法がありそうなものですが、私の力では見つけられませんでした。 もしもっと良い方法を知っていたらコメント欄で教えてくれると助かります。


共有

Twitterでツイート (Xでポスト)はてなブックマークBluesky (bsky.app) でシェア・コピー用テキスト

この記事を書いた人の活動を GitHub Sponsors もしくは pixiv FANBOX で支援できます!! GitHub Sponsors なら一回のみの支援もできます。ぜひご検討ください。