blog.rinsuki.net

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

投稿: 2019/09/30 12:00:00

タグ: CocoaSwift

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"

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