8

機能を追加してiOSで適切に実行するために、可能な限り変更しているCライブラリがあります。iOS 5.1 では正常に動作していますが、小さな一時ファイルを書き込む必要があるため、iOS 6 では機能しません。書き込みに使用されていた場所 (/tmp/some.file) に資格に関する問題があると思います。

NSHomeDirectory() が ObjectiveC からのサンドボックス ルートを提供することはわかっていますが、それには ObjectiveC / Foundation を実行する必要があります。C / CoreFoundation 呼び出しのみを使用してサンドボックス ルートを取得するにはどうすればよいですか?

4

2 に答える 2

10

に相当する CoreFoundationNSHomeDirectory()は ですCFCopyHomeDirectoryURL()。これは iOS 5 以降で利用可能であり、「文書化」されている唯一の場所はiOS 4.3 から iOS 5.0 API の相違点 にあります。

tmp文字列をハードコーディングせずに一時ディレクトリが必要な場合confstrは、定数を使用して、confstr 呼び出しが失敗した場合_CS_DARWIN_USER_TEMP_DIRに環境変数にフォールバックすることをお勧めします。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);
于 2012-10-03T22:05:32.357 に答える
7

iOS には「ホーム」ディレクトリはありません。

アプリはサンドボックス内にあるため、にアクセスできません/tmp

代わりに、tmpアプリケーションのサンドボックス内にディレクトリがあります。

CFBundleを使用して、アプリへのパスを取得できます。
一時フォルダーは、追加することで見つけることができます../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 );
于 2012-10-03T18:06:16.463 に答える