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

Jus*_*808 24 macos cocoa objective-c appstore-sandbox

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

/Users/username/Library/Containers/appID/Data就是归还的.我怎么得到/Users/username/

CRD*_*CRD 34

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

char *realHome = getpwuid(getuid())->pw_dir;
Run Code Online (Sandbox Code Playgroud)

完整示例:

#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];
}
Run Code Online (Sandbox Code Playgroud)

这为您提供了用户主页的路径,但不会自动授予您访问该文件夹的权限.如评论中所述,您可以使用此路径:

  • 为打开/保存对话框提供合理的默认文件夹
  • 通过比较结果来检测您是否在沙盒中 NSHomeDirectory()


Par*_*fna 11

从苹果文档:

访问用户数据

POSIX层上方的Mac OS X路径查找API返回相对于容器的路径,而不是相对于用户主目录的路径.如果您的应用程序在沙箱之前访问用户实际主目录(〜)中的位置并且您正在使用Cocoa或Core Foundation API,那么在启用沙盒后,您的路径查找代码会自动使用您的应用程序容器.

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

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

如果您的应用需要访问用户的主目录才能运行,请让Apple通过Apple错误报告系统了解您的需求.

  • 这太荒谬了......但是内容丰富.谢谢. (9认同)

Rob*_*idt 7

使用 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
}
Run Code Online (Sandbox Code Playgroud)


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