2012-10-03 17 views
6

Mam bibliotekę C Modyfikuję, tak mało jak to możliwe, aby dodać funkcję i uruchomić ją poprawnie w systemie iOS. Działa to dobrze na iOS 5.1, ale zrywając z iOS 6, ponieważ wymagane jest napisanie małego pliku tymczasowego i myślę, że jest problem z uprawnieniami do zapisu (/tmp/some.file).Jaki jest odpowiednik NSHomeDirectory() w CoreFoundation?

Wiem, że NSHomeDirectory() da mi korzeń piaskownicy z obiektu objectC, ale wymaga uruchomienia obiektu ObjectC/Foundation. Jak mogę zdobyć root piaskownicy za pomocą tylko wywołań C/CoreFoundation?

+0

Czy masz dostęp do 'NSSearchPathForDirectoriesInDomains'? Czy też ma ten sam problem? – Rob

+0

Czy rzeczywiście szukasz katalogu domowego, czy tylko tymczasowego katalogu do przechowywania pliku? –

+0

@Rob Przedrostek NS oznacza Fundację. – Macmade

Odpowiedz

8

Równoważnik CoreFoundation z NSHomeDirectory() jest CFCopyHomeDirectoryURL(). Jest on dostępny, ponieważ iOS 5 i jedyne miejsce, w którym jest "udokumentowane", znajduje się w iOS 4.3 to iOS 5.0 API Differences.

Jeśli chcesz tymczasowego katalogu, bez hardcoding ciąg tmp, to może chcesz używać confstr ze stałą _CS_DARWIN_USER_TEMP_DIR i awaryjne do zmiennej TMPDIR środowiska, jeżeli wywołanie funkcja confstr zawiedzie:

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

Zajęło trochę czasu, aby zweryfikować, ale to wydaje się być nieco bardziej precyzyjne odpowiedzi (dobrze, dwie odpowiedzi w rzeczywistości - ale pierwsza jest to, co mam na myśli), więc przełączam Wybrane Odpowiedź na ten. Wszystkie są poprawne, o ile wiem. – codehearted

+1

użyj n> sizeof (tmpdir) zamiast n> = sizeof (tmpdir) –

+0

Powinieneś prawdopodobnie dodać ostateczny fallback do '/ tmp' w przypadku niepowodzenia' confstr() 'i' $ TMPDIR' nie jest ustawione. To jest lepsze niż całkowite zawieszenie. – Mecki

5

Na iOS nie ma katalogu "domowego".

Twoja aplikacja jest w piaskownicy, więc nie masz dostępu do /tmp.

Zamiast tego znajduje się katalog tmp wewnątrz obszaru izolowanego aplikacji.

Możesz użyć CFBundle, aby uzyskać ścieżkę do swojej aplikacji.
Folder tymczasowy można następnie znaleźć, dodając ../tmp/.

zasadniczo:

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

To wygląda dokładnie tak, jak chciałem, dzięki - dam Ci znać, jak to działa, gdy go wypróbuję. – codehearted

+0

Nadal mam problemy z zapisem do niego (uzyskanie złego dostępu na fprintf), ale powyższy kod wydaje się poprawnie uzyskać lokalizację wewnątrz piaskownicy, więc zaznaczam to jako poprawne. Dzięki jeszcze raz. – codehearted

Powiązane problemy