2012-04-21 12 views
16

मैं अपने ऐप को सैंडबॉक्स कर रहा हूं, और उन्हें संदर्भित करने के लिए एक एक्सएमएल फ़ाइल का उपयोग करके कई फाइलों के आयात/निर्यात की अनुमति देने की कोशिश कर रहा हूं। एक्सएम में सूचीबद्ध फाइलों तक मेरे ऐप (या अन्य सैंडबॉक्स किए गए ऐप) तक पहुंचने के लिए, मैं एक सीरियलाइज्ड सुरक्षा-स्कोप्ड बुकमार्क भी शामिल कर रहा हूं। मैं this answer में वर्णित अनुसार इसे क्रमबद्ध कर रहा हूं, और मेरे यूनिट परीक्षण (जो सैंडबॉक्स नहीं हैं) बिना किसी समस्या के XML डेटा लिखें और पढ़ें। जब मेरा ऐप बुकमार्क को हल करता है, तो NSURL लौटाया गया है, जैसा कि NSError संदर्भ है। चूंकि मुझे विश्वास नहीं है कि यह मामला होना चाहिए, यह क्यों हो रहा है? मैं उपयोगकर्ता को NSOpenPanel के साथ फ़ाइल/निर्देशिका का चयन करने के लिए प्रेरित करके इसके आसपास काम कर सकता हूं, लेकिन मैं अभी भी बुकमार्क को काम करने के लिए प्राप्त करना चाहता हूं।ऐप सैंडबॉक्स: दस्तावेज़-स्कोप्ड बुकमार्क हल नहीं कर रहा है; किसी भी त्रुटि को वापस नहीं कर रहा

एक परीक्षण परियोजना में पुन: निर्मित

घर पर पुन: पेश, Xcode में एक नया कोको अनुप्रयोग बनाने के लिए, और इस परियोजना में फ़ाइलों के लिए निम्नलिखित सार का उपयोग करें: https://gist.github.com/2582589 (एक उचित अगली दृश्य के साथ अद्यतन लूप)

फिर, प्रोजेक्ट को कोड-हस्ताक्षर करने के लिए Apple's instructions का पालन करें। अनुक्रम में बटन क्लिक करके आप समस्या को पुन: उत्पन्न करते हैं (जिसे मैंने ऐप्पल को rdar://11369377 के रूप में सबमिट किया है)। आप डिस्क पर (ऐप के कंटेनर के बाहर), फिर एक एक्सएमएल निर्यात करने के लिए, और फिर आयात करने के लिए एक ही एक्सएमएल चुनते हैं।

उम्मीद है कि आप लोग यह जानने में मेरी सहायता कर सकेंगे कि मैं क्या गलत कर रहा हूं। या तो मैं कुछ गलत कर रहा हूं और ढांचा गलती से खुद को रख रहा है, या मैं इसे सही कर रहा हूं और यह पूरी तरह टूटा हुआ है। मैं blame the framework नहीं करने की कोशिश करता हूं, तो यह कौन सा है? या क्या कोई और संभावना है?

नमूना कोड

docURL करने के लिए XML निर्यात:

// After the user picks an XML (docURL) destination with NSSavePanel 

[targetURL startAccessingSecurityScopedResource]; 
NSData *bookmark = [targetURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
         includingResourceValuesForKeys:nil 
             relativeToURL:docURL 
               error:&error]; 
[targetURL stopAccessingSecurityScopedResource]; 

docURL से XML आयात करना:

// After the user selected the XML (docURL) from an NSOpenPanel 

NSURL *result = [NSURL URLByResolvingBookmarkData:bookmarkData 
              options:NSURLBookmarkResolutionWithSecurityScope 
            relativeToURL:docURL 
           bookmarkDataIsStale:nil 
              error:&error]; 

मैं [docURL ..AccessingSecurityScopedResource] से यह कॉल आसपास की कोशिश की है, जो नहीं किया एक अंतर बनाएं (जैसा कि अपेक्षित है, क्योंकि docURL पहले से ही दायरे में है के बाद होने ओपन कक्ष में चयनित किया गया

इसके अलावा, मैं अपने app.entitlements फ़ाइल में निम्न निर्दिष्ट करें:

com.apple.security.files.user-selected.read-write 
com.apple.security.files.bookmarks.app-scope 
com.apple.security.files.bookmarks.collection-scope 

ऊपर उल्लेख किया है, दूसरे चरण (बुकमार्क को हल करने) पूरा करती है, लेकिन छोड़ देता है दोनों error और result शून्य। चूंकि मैं सैंडबॉक्सिंग लागू कर रहा हूं, मैंने जो गलतियों को बनाया है, उसके परिणामस्वरूप NSError लौटाया गया है, जिसने मुझे बग को हल करने में मदद की। लेकिन अब कोई त्रुटि नहीं है, और कोई यूआरएल हल नहीं हुआ है।

विविध समस्या निवारण चरणों

  • मैं अपने ऐप के सैंडबॉक्स है, जो एक फर्क नहीं था में एक्सएमएल फ़ाइल रखने की कोशिश की, तो एक्सएमएल फ़ाइल के लिए उपयोग समस्या

  • नहीं है ऐप एआरसी का उपयोग करता है, लेकिन यूनिट परीक्षण करता है, जो सफल होता है। मैं एक alloc/autoreleased वर्ग विधि के बजाय init, भी (सिर्फ मामले में)

  • मैं तुरंत बुकमार्क बनाने के बाद यूआरएल संकल्प कोड चिपकाया उपयोग करने की कोशिश, और यह ठीक चलता है, एक सुरक्षा-दायरे यूआरएल

  • उत्पादन
  • मैंने मूल रूप से बनाए गए बुकमार्क (क्रमबद्धता से पहले) पर po किया था, और फिर deserialization के बाद बुकमार्क पर, और वे 100% से मेल खाते हैं। सीरियलाइजेशन समस्या नहीं है

  • मैंने संकल्प कॉल को CFURLCreateByResolvingBookmarkData(..) के साथ बदल दिया, बिना किसी बदलाव के। यदि यह एक बग है, यह कोर फाउंडेशन एपीआई के साथ-साथ कोको परत

  • bookmarkDataIsStale: के लिए एक मूल्य निर्दिष्ट में मौजूद है अगर मैं options: के लिए 0 निर्दिष्ट कोई प्रभाव नहीं

  • है, तो मैं करना एक वैध NSURL वापस प्राप्त करें, लेकिन इसमें कोई सुरक्षा गुंजाइश नहीं है, और इसलिए फ़ाइल पढ़ने के लिए बाद में कॉल

    दूसरे शब्दों में, deserialized बुकमार्क मान्य प्रतीत होता है। तो बुकमार्क डेटा दूषित कर दी गई, मुझे शक है NSURL इसके साथ कुछ भी कर करने में सक्षम होगा

  • NSURL.h कुछ बाहर बात करने के लिए मैं कर रहा हूँ गलत

किसी और को है किसी भी उपयोगी टिप्पणियों को शामिल नहीं किया था सुरक्षा के साथ एक सैंडबॉक्स अनुप्रयोग में सुरक्षा-स्कोप्ड दस्तावेज़ बुकमार्क का उपयोग कर? यदि हां, तो आप मुझसे अलग क्या कर रहे हैं?

OS संस्करण

माउंटेन शेर बीटा के लिए उपयोग के साथ किसी को सत्यापित कर सकते हैं या नहीं, मेरी नमूना परियोजना एक ही त्रुटि (एक की कमी) से पता चलता अनुरोध? यदि यह एक बग है जिसे शेर के बाद तय किया गया है, तो मैं इसके बारे में चिंता नहीं करूंगा। मैं अभी तक डेवलपर प्रोग्राम में नहीं हूं, और इसलिए पहुंच नहीं है। मुझे यकीन नहीं है कि अगर उस प्रश्न का उत्तर एनडीए का उल्लंघन करेगा, लेकिन मुझे उम्मीद नहीं है।

+0

मैं वैसे भी मदद नहीं कर सका, लेकिन यह प्रश्न आपकी खोज के माध्यम से एक यात्रा लॉग का थोड़ा सा है। यह बहुत अच्छा होगा अगर आप इसे फिर से काम कर सकें, इस बारे में भूल गए कि आपने कहां किया है। कोई अपराध नहीं: सवाल उच्च गुणवत्ता वाला प्रतीत होता है, जो 5 अपवॉट्स (अब मेरे साथ 6) प्रतिबिंबित करता है। इनपुट और अपवॉट के लिए –

+0

@Yar धन्यवाद। मैंने दो कारणों से अपडेट (अधिकांश) को रखा है। सबसे पहले, मैं उन चरणों को दस्तावेज कर रहा हूं जिनकी मैंने कोशिश की थी ताकि अन्य दोहराए गए समस्या निवारण से बच सकें, और दूसरा, मैंने नीचे दिए गए अपडेट पोस्ट किए हैं (मुख्य प्रश्न में नई जानकारी को काम करने के बजाय) प्रश्न के बाद उन लोगों को स्पष्ट करने के लिए वास्तव में बदल गया। मैंने उत्तर देने के बाद प्रश्न को संपादित करने की योजना बनाई। क्या आप इस प्रश्न में सामग्री को पुनर्व्यवस्थित करने या कम प्रासंगिक टुकड़ों को हटाने का सुझाव दे रहे हैं? – Dov

+0

दोनों। यह उत्तर देने की आपकी संभावना को बढ़ाएगा और पोस्ट को उन भविष्य के उपयोगकर्ताओं के लिए अधिक प्रासंगिक बना देगा जिनके पास पूरी तरह से अलग अन्वेषण हैं, लेकिन एक ही समस्या है। आप जानते हैं, समस्या का सार;) –

उत्तर

5

अपने सार कोड में, AppDelegate.m में निम्न पंक्ति (लाइन 61) बदलने के लिए:

[xmlTextFileData writeToURL:savePanel.URL atomically:YES]; 

को
[xmlTextFileData writeToURL:savePanel.URL atomically:NO]; 

आपका कोड तो काम करेंगे।

इसका कारण यही कारण है कि एक मौजूदा (लेकिन खाली) फ़ाइल होना जरूरी है जिसमें दस्तावेज़-स्कोप्ड बुकमार्क्स शामिल होंगे [anURL bookmarkDataWithOptions]: NSData इंस्टेंस बनाने के दौरान, ScopedBookmarkAgent उस फ़ाइल में कुछ (जैसे एक टैग, शायद एक विस्तारित फ़ाइल विशेषता) जोड़ता है।

यदि आप डेटा को औपचारिक रूप से डेटा (यानी बुकमार्क यूआरएल) लिखते हैं, वास्तव में वे सीधे फाइल पर नहीं लिखे जाते हैं, लेकिन पहले एक अस्थायी फ़ाइल के लिए लिखा जाता है जिसका नाम बदलना सफल होता है। ऐसा लगता है कि टैग (खाली, लेकिन मौजूदा) फ़ाइल में जोड़ा गया है जिसमें बुकमार्क की इस प्रक्रिया के दौरान एक अस्थायी फ़ाइल में खोया जा रहा है और फिर इसे नामित किया जा रहा है (और इस प्रकार मूल, खाली फ़ाइल को हटाने की संभावना है) ।

वैसे: दस्तावेज़-स्कोप्ड बुकमार्क्स वाले XML फ़ाइल में संबंधित यूआरएल पास करने से पहले ऐप-स्कोप्ड बुकमार्क्स बनाना आवश्यक नहीं होना चाहिए।

अतिरिक्त: com.apple.security.files.bookmarks.collection-scope का नाम बदलकर com.apple.security.files.bookmarks.document-scope 10.7.4 में कर दिया गया है।

+0

धन्यवाद x1000। यह विचार मेरे लिए कभी भी नहीं हुआ। नामित एंटाइटेलमेंट कुंजी के संबंध में, क्या आप एक संदर्भ दे सकते हैं? दस्तावेज अभी भी 'संग्रह-स्कोप' कहता है। – Dov

+1

[एंटाइटेलमेंट कुंजी संदर्भ] (https://developer.apple.com/library/mac/#documentation/Miscellaneous/Reference/EntitlementKeyReference/EnablingAppSandbox/EnablingAppSandbox.html#/ की तालिका 3-4 में एंटाइटेलमेंट नाम परिवर्तन का उल्लेख किया गया है।/apple_ref/doc/यूआईडी/TP40011195-CH4-SW18)। – Tim

+0

@Tim आप उल्लेख करते हैं कि "एक मौजूदा (लेकिन खाली) फ़ाइल होना आवश्यक है जिसमें दस्तावेज़-स्कोप्ड बुकमार्क्स होंगे"। किसी को उस स्थान को कैसे जानना चाहिए जिस पर उपयोगकर्ता पहली बार एक नया दस्तावेज़ सहेज लेगा। इसके अलावा, किसी स्थान पर सैंडबॉक्सिंग के साथ कोई खाली फ़ाइल कैसे बनाती है और NSSavePanel चित्र में नहीं आती है? – AmaltasCoder

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