2012-10-03 29 views
6

मेरे पास एक सी लाइब्रेरी है जिसे मैं जितना संभव हो सके संशोधित कर रहा हूं, एक सुविधा जोड़ने के लिए और आईओएस पर ठीक से चलाने के लिए इसे प्राप्त कर सकता हूं। यह आईओएस 5.1 पर ठीक काम कर रहा है, लेकिन आईओएस 6 पर तोड़ना क्योंकि इसे एक छोटी अस्थायी फ़ाइल लिखना आवश्यक है, और मुझे लगता है कि वहां एक मुद्दा w/एंटाइटेलमेंट्स है जहां यह लिखने के लिए उपयोग किया जाता है (/tmp/some.file)।CoreFoundation में NSHomeDirectory() के बराबर क्या है?

मुझे पता है कि NSHomeDirectory() मुझे उद्देश्य सी से सैंडबॉक्स रूट देगा, लेकिन इसे चलाने के लिए उद्देश्य सी/फाउंडेशन की आवश्यकता है। मैं केवल सी/कोरफाउंडेशन कॉल का उपयोग करके सैंडबॉक्स रूट कैसे प्राप्त कर सकता हूं?

+0

आप पहुँच है 'NSSearchPathForDirectoriesInDomains' के लिए? या क्या यह वही समस्या है? – Rob

+0

क्या आप वास्तव में होम निर्देशिका की तलाश में हैं, या फ़ाइल को स्टोर करने के लिए केवल एक अस्थायी निर्देशिका है? –

+0

@Rob एक एनएस उपसर्ग फाउंडेशन का तात्पर्य है। – Macmade

उत्तर

8

NSHomeDirectory() की CoreFoundation बराबर CFCopyHomeDirectoryURL() है। यह आईओएस 5 के बाद उपलब्ध है और यह एकमात्र जगह है जहां यह "दस्तावेज" है iOS 4.3 to iOS 5.0 API Differences में है।

आप tmp स्ट्रिंग हार्डकोड बिना अस्थायी निर्देशिका चाहते हैं, तो आप _CS_DARWIN_USER_TEMP_DIR निरंतर साथ confstr का उपयोग करें और TMPDIR वातावरण चर पर वापस आने की अगर 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) –

+0

के बजाय n> sizeof (tmpdir) का उपयोग करें, यदि आपको 'confstr()' विफल रहता है और '$ TMPDIR' सेट नहीं होता है तो आपको शायद '/ tmp' पर अंतिम फ़ॉलबैक जोड़ना चाहिए। यह पूरी तरह असफल होने से बेहतर है। – Mecki

5

आईओएस पर कोई "होम" निर्देशिका नहीं है।

आपका ऐप एक सैंडबॉक्स में है, इसलिए आपके पास /tmp तक पहुंच नहीं है।

इसके बजाय, आपके पास अपने एप्लिकेशन के सैंडबॉक्स के अंदर tmp निर्देशिका है।

आप अपने ऐप के मार्ग प्राप्त करने के लिए CFBundle का उपयोग कर सकते हैं।
तब temp फ़ोल्डर ../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