2012-03-04 13 views
20

NSHomeDirectory() मेरी सैंडबॉक्स रूट को फिर से चालू कर रहा है, न कि मेरी होम निर्देशिका। [@"~" stringByExpandingTildeInPath] एक ही काम कर रहा है।मैं सैंडबॉक्स वाले ऐप में प्रयोजन-सी में उपयोगकर्ताओं की होम निर्देशिका कैसे प्राप्त करूं?

यह /Users/username/Library/Containers/appID/Data क्या लौटे किया जा रहा है है। मैं /Users/username/ कैसे प्राप्त करूं?

उत्तर

30

आप उपयोगकर्ता के वास्तविक घर निर्देशिका के लिए पथ चाहते हैं तो आप उपयोग कर सकते हैं:

char *realHome = getpwuid(getuid())->pw_dir; 

पूर्ण उदाहरण:

#include <unistd.h> 
#include <sys/types.h> 
#include <pwd.h> 
#include <assert.h> 

NSString *RealHomeDirectory() { 
    struct passwd *pw = getpwuid(getuid()); 
    assert(pw); 
    return [NSString stringWithUTF8String:pw->pw_dir]; 
} 

यह आपको उपयोगकर्ता के घर पथ देता है , लेकिन स्वचालित रूप से आपको उस फ़ोल्डर में तक पहुंच नहीं देता है।के रूप में टिप्पणी में बताया गया है, आप के लिए इस मार्ग का उपयोग कर सकते हैं:

  • खुला के लिए एक समझदार डिफ़ॉल्ट फ़ोल्डर उपलब्ध कराने/संवाद
  • का पता लगाने के लिए कि क्या आप एक सैंडबॉक्स में कर रहे हैं बचाने के लिए, NSHomeDirectory()
के परिणाम की तुलना द्वारा
+1

एकमात्र चीज जो वास्तव में अच्छी है, फाइल को खुले/सहेजने वाले संवाद में एक सेन डिफ़ॉल्ट सेट कर रही है। अभी, अगर मैं इसे NSHomeDirectory() पर सेट करता हूं तो यह बहुत उपयोगकर्ता के अनुकूल नहीं है। ज्यादातर लोग यह भी नहीं जानते कि लाइब्रेरी फ़ोल्डर क्या है। – Justin808

+1

यह एक अच्छा उपयोग है, दूसरा यह जांचना है कि क्या आप इसे 'NSHomeDirectory() 'रिटर्न से तुलना करके सैंडबॉक्स में हैं, और मुझे यकीन है कि अन्य हैं ... – CRD

+0

और फिर भी एक अन्य तक पहुंच प्राप्त करना है 'com.apple.security.temporary-upgrade.files.home-relative-path के माध्यम से फ़ाइल करें। * 'अस्थायी एंटाइटेलमेंट – Dov

10
सेब documentation से

:

तक पहुँचना उपयोगकर्ता डेटा

मैक ओएस एक्स पथ खोजने एपीआई, POSIX परत से ऊपर, रास्तों लौटने के बजाय उपयोगकर्ता के घर कंटेनर के लिए रिश्तेदार रिश्तेदार निर्देशिका। अपने अनुप्रयोग, इससे पहले कि आप सैंडबॉक्स, में स्थानों तक पहुँचता है, तो उपयोगकर्ता की वास्तविक घर निर्देशिका (~) और आप कोको या कोर फाउंडेशन एपीआई का उपयोग कर रहे है, तो, आप सैंडबॉक्सिंग सक्षम करने के बाद, अपना रास्ता खोजने कोड स्वचालित रूप से आपके एप्लिकेशन की कंटेनर का उपयोग करता बजाय।

अपने सैंडबॉक्स एप्लिकेशन पहली बार खोले जाने के लिए, मैक ओएस एक्स स्वचालित रूप से यदि आपके ऐप की मुख्य प्राथमिकताएं फ़ाइल माइग्रेट करती है। अपने अनुप्रयोग अतिरिक्त समर्थन फ़ाइलों का उपयोग करता है, तो उन फ़ाइलों की एक बार की माइग्रेशन कंटेनर के लिए, में वर्णित के रूप आप इस तरह के getpwuid के रूप में एक POSIX आदेश का उपयोग कर रहे हैं, तो प्रदर्शन "एक सैंडबॉक्स से App प्रवास के।"

उपयोगकर्ता की वास्तविक होम निर्देशिका में पथ प्राप्त करने के लिए, कोको या कोर फाउंडेशन प्रतीक जैसे NSHomeDirectory फ़ंक्शन का उपयोग करने पर विचार करें। कोको या कोर फाउंडेशन का उपयोग करके, आप सीधे उपयोगकर्ता की होम निर्देशिका तक पहुंचने के विरुद्ध ऐप सैंडबॉक्स प्रतिबंध का समर्थन करते हैं।

अपने अनुप्रयोग समारोह के क्रम में उपयोगकर्ता के घर निर्देशिका के लिए उपयोग की आवश्यकता है, एप्पल अपनी आवश्यकताओं Apple bug reporting system उपयोग के बारे में बताएं।

+7

हास्यास्पद है ... लेकिन जानकारीपूर्ण। धन्यवाद। – Dakine83

0

स्विफ्ट का उपयोग करना, आप इस प्रकार का sandboxed app से उन घर निर्देशिका पथ पहुँच सकते हैं:

var userHomeDirectoryPath : String { 
    let pw = getpwuid(getuid()) 
    let home = pw?.pointee.pw_dir 
    let homePath = FileManager.default.string(withFileSystemRepresentation: home!, length: Int(strlen(home))) 

    return homePath 
} 


मैं यह इतना बनाया इस ब्लॉग पोस्ट में स्निपेट के आधार पर ल्यूशन: http://zpasternack.org/accessing-the-real-home-folder-from-a-sandboxed-app/

संबंधित मुद्दे