मैं सैंडबॉक्स के साथ थोड़ा उलझन में हूं। क्या यह संभव है?क्या मेरे सैंडबॉक्स किए गए मैक ऐप को ~/लाइब्रेरी में फ़ाइलों तक पहुंच पढ़ने का कोई तरीका है?
धन्यवाद!
मैं सैंडबॉक्स के साथ थोड़ा उलझन में हूं। क्या यह संभव है?क्या मेरे सैंडबॉक्स किए गए मैक ऐप को ~/लाइब्रेरी में फ़ाइलों तक पहुंच पढ़ने का कोई तरीका है?
धन्यवाद!
हां, लेकिन इसके लिए "अस्थायी अपवाद" एंटाइटेलमेंट की आवश्यकता है। "अस्थायी" का अर्थ है कि यह ओएस के कुछ भविष्य के संस्करण में जा सकता है, लेकिन यह जोखिम का अधिक नहीं है। बड़ी समस्या यह है कि शब्द "अपवाद": इसका मतलब है कि आपको अपने अधिकार के उपयोग को उचित ठहराना होगा, या ऐप स्टोर समीक्षकों को शायद आपको अस्वीकार कर दिया जाएगा।
एक बग रिपोर्ट दर्ज करें जो आपको लगता है कि आपको ऐसा करने में सक्षम होना चाहिए, लेकिन आज ~/Library
तक पहुंच के बिना नहीं कर सकता है, और आदर्श रूप से विषय पर एक फोरम थ्रेड भी शुरू कर सकता है। वे ~/Library
(शायद निजी एपीआई का उपयोग भी कर सकते हैं) तक पहुंचने के बजाय उपयोग करने के लिए एक समाधान का सुझाव दे सकते हैं, इस मामले में, वे जो कहते हैं वह करें। या वे अब के लिए अस्थायी अपवाद का उपयोग करने के लिए कह सकते हैं, इस मामले में, ऐसा करें। या वे जवाब नहीं दे सकते हैं, इस मामले में आप अस्थायी अपवाद का उपयोग करते हैं और अपनी उंगलियों को पार करते हैं। किसी भी मामले में, सुनिश्चित करें कि आपके ऐप स्टोर सबमिशन समीक्षा नोट्स में बग रिपोर्ट और/या फोरम थ्रेड का लिंक है।
आपको इसे करने के लिए मैन्युअल रूप से अपने प्रोजेक्ट के एंटाइटेलमेंट प्लिस्ट को संपादित करना होगा, लेकिन यह बहुत कठिन नहीं है। एक स्ट्रिंग, "/Library/"
के साथ com.apple.security.temporary-exception.files.home-relative-path.read-only
सरणी बनाएं। इस तरह:
<key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key>
<array>
<string>/Library/</string>
</array>
अतिरिक्त /
अंत में कैसे सैंडबॉक्स जानता है आप बल्कि एक फ़ाइल से, एक निर्देशिका का उपयोग करना चाहते हैं। यदि आप इसे छोड़ देते हैं, तो आपको ~/Library
में सभी फ़ाइलों तक पहुंच प्राप्त होगी, जो आपने पूछा है, लेकिन ~/Library
की उपनिर्देशिका (रिकर्सिव) में फ़ाइलों को नहीं, जैसे ~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist
, जैसा कि आप शायद चाहते हैं। एंटाइटेलमेंट कुंजी संदर्भ दस्तावेज में File Access Temporary Extensions देखें।
इसके अलावा, ध्यान दें कि ~/Library
के तहत कुछ चीजों के लिए आपके पास पहले से ही "मुफ्त में" पहुंच है, या तो वे आपके कंटेनर में कॉपी हो जाते हैं, या अप्रत्यक्ष रूप से जब आप पथ का उपयोग करने के बजाय उचित API का उपयोग करते हैं। इसलिए, आप जो भी कर रहे हैं उसे पूरा करने का एक बेहतर तरीका हो सकता है - उदाहरण के लिए, अपने ऐप के पिछले गैर-सैंडबॉक्स संस्करण द्वारा छोड़ी गई फ़ाइलों को पढ़ने के लिए, आप उन्हें कंटेनर में माइग्रेट करने और उन्हें वहां पढ़ने में सक्षम हो सकते हैं।
एक और बात: ~/लाइब्रेरी तक पहुंचने से NSHomeDirectory()
, URLsForDirectory:inDomains:
इत्यादि नहीं बदलेगा - आपको अभी भी ~/Containers/com.mycompany.myproduct/Data/Library
मिल जाएगा। इस से निपटने के लिए एप्पल के अर्द्ध सरकारी सिफारिश उपयोगकर्ता के वास्तविक घर निर्देशिका पाने के लिए बीएसडी API का उपयोग करने के लिए है, और सबसे आसान तरीका यह है:
const char *home = getpwuid(getuid())->pw_dir;
NSString *path = [[NSFileManager defaultManager]
stringWithFileSystemRepresentation:home
length:strlen(home)];
NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES];
कुछ नोट:
getpwuid
को अक्सर कॉल करने का अच्छा विचार। सबसे अच्छा समाधान इस कोड को एक बार जल्दी कॉल करना है, और उसके परिणामस्वरूप NSURL
कैश करें।Library
) निर्देशिका प्राप्त करने के लिए भी उपयोग किया जा सकता है, लेकिन ऐप स्टोर लगभग निश्चित रूप से किसी भी सॉफ़्टवेयर को अनुमति नहीं देगा जो वास्तव में कोशिश करता है।~/Library
पर एक "कार्यान्वयन विस्तार" माना जाता है जो एक दिन बदल सकता है, जो एक और कारण है (एंटाइटेलमेंट के शीर्ष पर) कि इसे एक अस्थायी समाधान माना जाना चाहिए जब तक कि ऐप्पल वास्तविक समाधान प्रदान न करे आपकी उच्च स्तरीय समस्या के लिए, और यह आपके समीक्षा नोट्स में उल्लेखनीय हो सकता है।उत्तर के लिए धन्यवाद! – dot
उपरोक्त, हालांकि 'getpwent() -> pw_dir' का उपयोग करने का आपका प्रस्तावित समाधान मेरे लिए 'var/virusmails' देता है। –
इसने मेरे लिए काम किया है: 'getpwnam ([NSUserName() UTF8String]) -> pw_dir' –
यह संभव "के साथ com.apple.security.temporary-exception.files.absolute-path.read से लिखने निर्दिष्ट फाइल या निर्देशिका/लिखें पहुंच पर पढ़ने में सक्षम बनाता है मेरे ऐप पर एक लिखने की अनुमति प्राप्त करने के लिए है निर्दिष्ट पूर्ण पथ। " – iGo