NSHomeDirectory()
重新调整我的沙箱根,而不是我的主目录。 [@"~" stringByExpandingTildeInPath]
正在做同样的事情。
这个/Users/username/Library/Containers/appID/Data
是返回的内容。我如何获得/Users/username/
?
答案 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/