2012-10-03 2 views
6

C 라이브러리가 있습니다. 기능을 추가하고 iOS에서 제대로 실행되도록 최대한 수정하고 있습니다. 그것은 iOS 5.1에서 잘 작동하지만, 작은 임시 파일을 작성해야하기 때문에 iOS 6을 사용하고 있으며, Entitlement에서 /tmp/some.file을 쓰는 데 문제가 있다고 생각합니다.CoreFoundation에서 NSHomeDirectory()와 동일한 기능은 무엇입니까?

NSHomeDirectory()가 objectiveC에서 샌드 박스 루트를 제공한다는 것을 알고 있지만 objectiveC/Foundation을 실행해야합니다. C/CoreFoundation 호출 만 사용하여 샌드 박스 루트를 얻으려면 어떻게해야합니까?

+0

당신이 액세스 할 수 있습니까 NSSearchPathForDirectoriesInDomains'에? 아니면 그 같은 문제가 있습니까? – Rob

+0

실제로 홈 디렉토리 또는 파일을 저장할 임시 디렉토리를 찾고 있습니까? –

+0

@Rob NS 접두어는 Foundation을 의미합니다. – Macmade

답변

8
NSHomeDirectory()

의 CoreFoundation에서 상응 CFCopyHomeDirectoryURL()이다. iOS 5부터 사용할 수 있으며 "문서화 된"유일한 곳은 iOS 4.3 to iOS 5.0 API Differences입니다. 당신이 tmp 문자열을 하드 코딩하지 않고 임시 디렉토리를 원하는 경우 confstr를 호출이 실패 할 경우

, 당신은 TMPDIR 환경 변수에 _CS_DARWIN_USER_TEMP_DIR 상수 confstr을 사용하고 폴백 할 수 있습니다 :

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); 
+0

확인하는 데 시간이 좀 걸렸지 만 이것이 좀 더 정확한 답변 인 것처럼 보입니다. (글쎄, 실제로는 두 가지 답변 -하지만 첫 번째는 제가 말한 것입니다.) 그래서 선택 응답을이 것으로 바꾸고 있습니다. 내가 알 수있는 한 그들은 모두 정확하다. – codehearted

+1

n> = sizeof (tmpdir) 대신 n> sizeof (tmpdir)를 사용하십시오. –

+0

'confstr()'이 실패하고'$ TMPDIR'이 설정되지 않은 경우에 대비하여'/ tmp'에 마지막 폴백을 추가해야합니다. 이것은 완전히 실패하는 것보다 낫습니다. – Mecki

5

iOS에는 "home"디렉토리가 없습니다.

앱이 샌드 박스에 있으므로 /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); 
+0

이것은 내가 원했던 것처럼 보입니다. 감사합니다. 한번 시도한 후에 어떻게 작동하는지 알려 드리겠습니다. – codehearted

+0

필자는 여전히 (fprintf에 대한 잘못된 액세스를 얻는) 문제를 겪고 있지만 위의 코드는 샌드 박스 내부의 위치를 ​​올바르게 표시하는 것으로 보이므로 올바른 것으로 표시하고 있습니다. 다시 한번 감사드립니다. – codehearted

관련 문제