2012-10-03 14 views
6

Ho una libreria C Sto modificando, il meno possibile, per aggiungere una funzione e farlo funzionare correttamente su iOS. Funziona bene su iOS 5.1, ma si rompe su iOS 6 perché è necessario scrivere un piccolo file temporaneo, e penso che ci sia un problema w/Entitlement con dove è stato scritto (/tmp/some.file).Qual è l'equivalente di NSHomeDirectory() in CoreFoundation?

So che NSHomeDirectory() mi darà la radice di sandbox da objectiveC, ma richiede l'esecuzione di objectC/Foundation. Come posso ottenere la root sandbox usando solo le chiamate C/CoreFoundation?

+0

Non si ha accesso a 'NSSearchPathForDirectoriesInDomains'? O ha lo stesso problema? – Rob

+0

Stai effettivamente cercando la directory home o solo una directory temporanea in cui archiviare un file? –

+0

@Rob Un prefisso NS implica Foundation. – Macmade

risposta

8

La CoreFoundation equivalente di NSHomeDirectory() è CFCopyHomeDirectoryURL(). È disponibile da iOS 5 e l'unico posto in cui è "documentato" è nello iOS 4.3 to iOS 5.0 API Differences.

Se si desidera che la directory temporanea, senza hardcoding la stringa tmp, quindi si consiglia di utilizzare confstr con la costante _CS_DARWIN_USER_TEMP_DIR e fallback alla variabile TMPDIR ambiente se la chiamata confstr fallisce:

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

Ci è voluto un po 'per verificare, ma questo sembra essere un po' più preciso di una risposta (beh, in realtà due risposte - ma la prima è a cosa mi riferisco) quindi sto passando la risposta scelta a questa. Sono tutti corretti per quanto posso dire però. – codehearted

+1

usa n> sizeof (tmpdir) invece di n> = sizeof (tmpdir) –

+0

Probabilmente dovresti aggiungere un fallback finale a '/ tmp' nel caso in cui' confstr() 'fallisce e' $ TMPDIR' non sia impostato. Questo è meglio che fallire completamente. – Mecki

5

Non esiste una directory "home" su iOS.

L'app si trova in una sandbox, quindi non si ha accesso a /tmp.

Invece, si dispone di una directory tmp all'interno della sandbox dell'applicazione.

È possibile utilizzare CFBundle per ottenere il percorso della propria app.
La cartella temporanea può essere trovata aggiungendo ../tmp/.

Fondamentalmente:

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

Questo mi sembra proprio quello che volevo, grazie - ti farò sapere come funziona una volta provata. – codehearted

+0

Ho ancora problemi a scrivere su di esso (ottenendo un brutto accesso su fprintf), ma il codice sopra sembra avere correttamente una posizione all'interno della sandbox, quindi sto contrassegnando questo come corretto. Grazie ancora. – codehearted

Problemi correlati