28

NSHomeDirectory()ホームディレクトリではなく、サンドボックスのルートを戻しています。[@"~" stringByExpandingTildeInPath]同じことをしています。

これ/Users/username/Library/Containers/appID/Dataが返ってきたものです。どうすれば入手でき/Users/username/ますか?

4

3 に答える 3

38

ユーザーの実際のホーム ディレクトリへのパスが必要な場合は、次を使用できます。

char *realHome = getpwuid(getuid())->pw_dir;

完全な例:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <assert.h>

NSString *RealHomeDirectory() {
    struct passwd *pw = getpwuid(getuid());
    assert(pw);
    return [NSString stringWithUTF8String:pw->pw_dir];
}

これにより、ユーザーのホームへのパスが提供されますが、そのフォルダーへのアクセスが自動的に提供されるわけではありません。コメントに記載されているように、このパスは次の目的で使用できます。

  • 開く/保存するダイアログに適切なデフォルト フォルダを提供する
  • 結果を比較して、サンドボックスにいるかどうかを検出するNSHomeDirectory()
于 2012-03-04T08:39:53.493 に答える
12

アップルのドキュメントから:

ユーザーデータへのアクセス

Mac OS X のパス検索 API は、POSIX レイヤーの上にあり、ユーザーのホーム ディレクトリに対してではなく、コンテナーに対して相対的なパスを返します。アプリをサンドボックス化する前に、ユーザーの実際のホーム ディレクトリ (~) 内の場所にアクセスし、Cocoa または Core Foundation API を使用している場合、サンドボックス化を有効にした後、パス検索コードは代わりにアプリのコンテナーを自動的に使用します。

サンドボックス化されたアプリの初回起動時に、Mac OS X はアプリのメインの設定ファイルを自動的に移行します。アプリで追加のサポート ファイルを使用する場合は、「サンドボックスへのアプリの移行」で説明されているように、それらのファイルをコンテナーに一度だけ移行します。</p>

getpwuid などの POSIX コマンドを使用してユーザーの実際のホーム ディレクトリへのパスを取得している場合は、代わりに NSHomeDirectory 関数などの Cocoa または Core Foundation シンボルを使用することを検討してください。Cocoa または Core Foundation を使用することで、ユーザーのホーム ディレクトリへの直接アクセスに対するアプリ サンドボックスの制限をサポートします。

アプリが機能するためにユーザーのホーム ディレクトリへのアクセスが必要な場合は、Apple のバグ報告システムを使用して、その必要性を Apple に知らせてください。

于 2012-03-04T08:35:33.450 に答える