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

Posted

技术标签:

【中文标题】如何在沙盒应用程序中获取用户主目录?【英文标题】: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/

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于如何在沙盒应用程序中获取用户主目录?的主要内容,如果未能解决你的问题,请参考以下文章

在沙盒 mac 中执行拖放

Plaid - 在沙盒环境中,我如何模拟正在发生的新事务并在 Webhook 中获取它

如何在沙盒 macOS 应用程序中为 ImageEvent 类运行 AppleScript?

如何在 Windows 上获取用户主目录?

卡在沙盒帐户中

在沙盒模式下禁用小部件回退 (Fortumo)