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

问题描述 投票:0回答:3

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

这个

/Users/username/Library/Containers/appID/Data
是被退回的东西。我如何获得
/Users/username/

objective-c macos cocoa appstore-sandbox
3个回答
38
投票

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

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()
  • 进行比较

12
投票

来自苹果文档

访问用户数据

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

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

如果你使用POSIX命令比如getpwuid获取路径 到用户的实际主目录,请考虑使用 Cocoa 或 Core Foundation 符号,例如 NSHomeDirectory 函数。 通过使用 Cocoa 或 Core Foundation,你支持 App Sandbox 限制 反对直接访问用户的主目录。

如果您的应用需要访问用户的主目录以便 函数,让 Apple 知道你的需求,使用 Apple bug 报告系统.


6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.