How do I get the users home directory in a sandboxed app?

Justin808 picture Justin808 · Mar 4, 2012 · Viewed 10.8k times · Source

NSHomeDirectory() is retuning my sandbox root, not my home directory. [@"~" stringByExpandingTildeInPath] is doing the same thing.

This /Users/username/Library/Containers/appID/Data is what's being returned. How do I get /Users/username/?

Answer

CRD picture CRD · Mar 4, 2012

If you want the path to the user's real home directory you can use:

char *realHome = getpwuid(getuid())->pw_dir;

Full example:

#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];
}

This gives you the path to the user's home, but does not automatically give you access to that folder. As noted in comments, you can use this path for:

  • providing a sane default folder for the open/save dialogs
  • detecting whether you are in a sandbox, by comparing the result to NSHomeDirectory()