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>

如果您使用 POSIX 命令(例如 getpwuid)来获取用户实际主目录的路径,请考虑使用 Cocoa 或 Core Foundation 符号(例如 NSHomeDirectory 函数)。通过使用 Cocoa 或 Core Foundation,您支持 App Sandbox 限制直接访问用户的主目录。

如果您的应用程序需要访问用户的主目录才能运行,请使用Apple 错误报告系统让 Apple 了解您的需求。

于 2012-03-04T08:35:33.450 回答
5

使用 Swift,您可以从沙盒应用程序访问用户主目录路径,如下所示:

var userHomeDirectoryPath : String {
    let pw = getpwuid(getuid())
    let home = pw?.pointee.pw_dir
    let homePath = FileManager.default.string(withFileSystemRepresentation: home!, length: Int(strlen(home)))

    return homePath
}


我根据这篇博文中的一个片段创建了这个解决方案:http: //zpasternack.org/accessing-the-real-home-folder-from-a-sandboxed-app/

于 2017-10-17T11:52:31.767 回答