如何在沙盒应用程序中获取用户主目录?
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/
【讨论】:
以上是关于如何在沙盒应用程序中获取用户主目录?的主要内容,如果未能解决你的问题,请参考以下文章
Plaid - 在沙盒环境中,我如何模拟正在发生的新事务并在 Webhook 中获取它