Objective c 获取macOS上当前用户的桌面路径

Objective c 获取macOS上当前用户的桌面路径,objective-c,cocoa,Objective C,Cocoa,我用 它工作得很好。但是当我用sudo启动应用程序时,它给出了root的桌面路径。是否有任何方法可以始终返回当前用户的桌面(即使应用程序是用sudo启动的)?我想说没有方法可以这样做。但我可以解释我为什么这么想。当您使用NSUserDomain时,它将缩小到活动用户的文件结构。就像你说的,当你以root用户的身份访问文件时,它会使用root的目录。它不能假定另一个用户的目录,因为如果有多个用户,它首先不知道哪个用户在运行它,因此也不知道要访问哪个桌面目录 我找到了解决这个问题的方法,应该对你有用

我用


它工作得很好。但是当我用sudo启动应用程序时,它给出了root的桌面路径。是否有任何方法可以始终返回当前用户的桌面(即使应用程序是用sudo启动的)?

我想说没有方法可以这样做。但我可以解释我为什么这么想。当您使用NSUserDomain时,它将缩小到活动用户的文件结构。就像你说的,当你以root用户的身份访问文件时,它会使用root的目录。它不能假定另一个用户的目录,因为如果有多个用户,它首先不知道哪个用户在运行它,因此也不知道要访问哪个桌面目录

我找到了解决这个问题的方法,应该对你有用。您必须使用环境变量自己构建路径,而不是使用
NSSearchPathForDirectoriesInDomains
。在OSX上使用
sudo
时,它不会覆盖
$HOME
变量,因此它会维护调用者的主目录。您可以使用访问所有环境变量

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES );
NSString* theDesktopPath = [paths objectAtIndex:0];
并使用获得
$HOME

[[NSProcessInfo processInfo] environment];

因此,您可以将
$HOME
作为字符串抓取,并将
/Desktop
附加到其中。这在沙箱中无法正常工作,但由于您正在谈论以root用户身份运行它,所以我假设您不是。

我使用下面的语句

[[[NSProcessInfo processInfo] environment] objectForKey:@"HOME"];

您可能会获得当前用户的uid,而不是有效的uid
mangetuid
然后找到home目录:其中一个
mangetpuid
它还返回沙盒路径,如
/Users/{user}/Library/Containers/{app_bundle}/Data/Desktop/
,这太棒了!当使用sudoI运行时,这个答案也会改变,它会建议您阅读更多苹果的文档。。NSString*userDesktopPath=[@“~/Desktop”stringByExpandingTildeInPath];如果使用sudo运行,使用
stringByExpandingTildeInPath
会给您提供错误的路径,而这正是原始文章试图解决的问题。我的机器上带有sudo的代码返回
/var/root
[NSURL fileURLWithPath:[NSHomeDirectory()stringByAppendingPathComponent:@"Desktop"]]