如何在沙盒应用中获取用户主目录?

时间:2012-03-04 08:16:55

标签: objective-c macos cocoa appstore-sandbox

NSHomeDirectory()重新调整我的沙箱根,而不是我的主目录。 [@"~" stringByExpandingTildeInPath]正在做同样的事情。

这个/Users/username/Library/Containers/appID/Data是返回的内容。我如何获得/Users/username/

3 个答案:

答案 0 :(得分:32)

如果您想要用户真实主目录的路径,您可以使用:

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()
  • 进行比较来检测您是否在沙盒中

答案 1 :(得分:10)

来自apple documentation

  

访问用户数据

     

POSOS层上方的Mac OS X路径查找API返回路径   相对于容器而不是相对于用户的家   目录。如果您的应用程序在沙箱之前访问了位置   用户的实际主目录(〜),您正在使用Cocoa或Core   然后,在启用沙盒后,基础API将进行路径查找   代码会自动使用您应用的容器。

     

首次启动沙盒应用程序,Mac OS X会自动启动   迁移您应用的主要偏好文件。如果您的应用使用了额外的   支持文件,执行这些文件的一次性迁移   容器,如“将应用程序迁移到沙箱”中所述。

     

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

     

如果您的应用需要访问用户的主目录才能访问   功能,让Apple通过Apple bug reporting system了解您的需求。

答案 2 :(得分:2)

使用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/