CoreFoundation 中的 NSHomeDirectory() 相当于什么?



我有一个C库,我正在修改,尽可能少地添加一个功能,让它在iOS上正常运行。它在 iOS 5.1 上运行良好,但在 iOS 6 上中断,因为它需要写入一个小的临时文件,我认为它曾经写入的地方存在权利问题 (/tmp/some.file)。

我知道NSHomeDirectory()会给我来自objectiveC的沙盒根目录,但它需要objectiveC/Foundation才能运行。如何仅使用 C/CoreFoundation 调用获取沙盒根目录?

CoreFoundation 相当于 NSHomeDirectory()CFCopyHomeDirectoryURL() 。它从iOS 5开始可用,并且唯一"记录"它的地方是在iOS 4.3到iOS 5.0 API差异中。

如果您希望临时目录不对tmp字符串进行硬编码,则可能需要将confstr_CS_DARWIN_USER_TEMP_DIR常量一起使用,并在 confstr 调用失败时回退到TMPDIR环境变量:

char tmpdir[PATH_MAX];
size_t n = confstr(_CS_DARWIN_USER_TEMP_DIR, tmpdir, sizeof(tmpdir));
if ((n <= 0) || (n >= sizeof(tmpdir)))
    strlcpy(tmpdir, getenv("TMPDIR"), sizeof(tmpdir));
CFURLRef tmp = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)tmpdir, strlen(tmpdir), true);

iOS 上没有"home"目录。

您的应用程序位于沙盒中,因此您无权访问/tmp

相反,您在应用程序的沙箱中有一个tmp目录。

您可以使用 CFBundle 获取 app.
的路径然后可以通过添加 ../tmp/ 找到临时文件夹。

基本上:

CFBundleRef         bundle;
CFURLRef            url;
CFStringRef         bundlePath;
CFStringRef         tmpRelPath;
CFMutableStringRef  tmpPath;
bundle      = CFBundleGetMainBundle();
url         = CFBundleCopyBundleURL( bundle );
bundlePath  = CFURLCopyFileSystemPath( url, kCFURLPOSIXPathStyle );
tmpRelPath  = CFSTR( "/../tmp/" );
tmpPath     = CFStringCreateMutable( kCFAllocatorDefault, CFStringGetLength( bundlePath ) + CFStringGetLength( tmpRelPath ) );
CFStringAppend( tmpPath, bundlePath );
CFStringAppend( tmpPath, tmpRelPath );
CFShow( tmpPath );
CFRelease( url );
CFRelease( bundlePath );
CFRelease( tmpPath );

最新更新