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



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

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

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

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

来自苹果文档:

访问用户数据

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

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

如果使用诸如getpwuid之类的POSIX命令来获取路径到用户的实际主目录,可以考虑使用Cocoa或核心基础符号,如NSHomeDirectory函数通过使用Cocoa或Core Foundation,您支持应用程序沙盒限制防止直接访问用户的主目录。

如果您的应用程序需要访问用户的主目录以便功能,使用Apple bug让Apple了解您的需求报告系统

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

最新更新