【问题标题】:How do I get the users home directory in a sandboxed app?如何在沙盒应用程序中获取用户主目录?
【发布时间】:2012-03-04 08:16:54
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c macos cocoa appstore-sandbox


    【解决方案1】:

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

    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];
    }
    

    这将为您提供用户家的路径,但不会自动为您提供对该文件夹的访问权。如 cmets 中所述,您可以将此路径用于:

    • 为打开/保存对话框提供一个健全的默认文件夹
    • 通过将结果与NSHomeDirectory() 进行比较来检测您是否在沙盒中

    【讨论】:

    • 唯一真正有用的是为文件打开/保存对话框设置一个合理的默认值。现在,如果我将它设置为 NSHomeDirectory() 它不是很用户友好。大多数人甚至不知道 Library 文件夹是什么。
    • 这是一个很好的用途,另一个是通过将其与NSHomeDirectory() 返回的内容进行比较来测试您是否在沙箱中,我相信还有其他的......
    • 还有一个是通过com.apple.security.temporary-exception.files.home-relative-path.* 临时权限访问文件
    • 我真的需要那个,谢谢。我们应用程序中的 powerbox nsopenpanel 习惯于为几种不同的用途选择位置,我们希望将其加热到用户的良好起点。对所有应用程序路径命令的意义的全面改变是一种讽刺。
    • 因为 NSUserName() 应该总是返回正确的值。不是很好用吗? NSString *realHomeDir = [NSString stringWithFormat@"/Users/%@",NSUserName()];
    【解决方案2】:

    来自苹果documentation

    访问用户数据

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

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

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

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

    【讨论】:

      【解决方案3】:

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


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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多