2014-09-17 8 views
12

मेरे पास एक आईओएस ऐप है जो डेटाबेस में और जेनरेट किए गए एचटीएमएल दस्तावेज़ों में फ़ाइलों का पूर्ण पथ संग्रहीत करता है। मैंने हाल ही में अपने आईफोन को आईओएस 8 में अपडेट किया है और अब जब भी मैं ऐप चलाता हूं ऐसा लगता है कि ऐप प्रत्येक पुन: संकलित एक अलग निर्देशिका में स्थापित है। उदाहरण के लिए पहले निर्माण/रन [[एनएसबंडल मेनबंडल] बंडलपैथ] अगले निर्माण/रन पर कुछ अलग करता है। क्या हो रहा है? क्या यह ऐप्पल की एक नई सुविधा है?आईओएस 8: बंडल पथ बदलता है

अद्यतन: बग रिपोर्ट

बनाया गया था कोड उदाहरण:

अगर मैं कई निर्माण से अधिक निम्न पंक्ति को चलाने/रन तो मैं एक अलग परिणाम हर बार मिल जाएगा।

#define kOLD_PATH @"oldPath" 
NSString* newPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
NSString* oldPath = [[NSUserDefaults standardUserDefaults] objectForKey:kOLD_PATH]; 

NSLog(@"New Path: %@", newPath); 
NSLog(@"Old Path: %@", oldPath); 
NSLog(@"Result: %@", [oldPath isEqualToString:newPath] ? @"Same" : @"Changed"); 

[[NSUserDefaults standardUserDefaults] setObject:newPath forKey:kOLD_PATH]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

उत्पादन कई पर इस चलाता है की तरह

New Path: /var/mobile/Containers/Data/Application/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/Library 
Old Path: /var/mobile/Containers/Data/Application/B038B2DA-F85D-4E18-A5F1-8635834EC454/Library 
Result: Changed 

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

उत्तर

7

Refer Technical Note 2406 by Apple

तोड़ने परिवर्तन

iOS 8, दस्तावेज़ और लाइब्रेरी निर्देशिका में शुरू है आपके आवेदन के बंडल का कोई अब भाई-बहन हैं।

अपने दस्तावेज़ों में पूरा पथ/यूआरएल स्टोर न करें। फ़ाइल नाम स्टोर करें और हमेशा अनुशंसित दृष्टिकोण के साथ पूर्ण पथ/यूआरएल उत्पन्न करें।

DocumentsDirectory यूआरएल

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

तो फिर तुम यूआरएल से बाहर रास्ता मिल जाओ और फ़ाइल नाम संलग्न पूरा पथ उत्पन्न करने के लिए।

+0

यहां तक ​​कि जब भी मैं दौड़ता हूं, यह मुझे अलग-अलग पथ देता है: \ –

18

आईओएस 8 में, ऐप कंटेनर का फ़ाइल सिस्टम लेआउट बदल गया है। एप्लिकेशन और उनकी सामग्री अब एक रूट निर्देशिका में संग्रहीत नहीं हैं।

iOS 8 रिलीज नोट्स से:

फाइल सिस्टम ऐप्लिकेशन कंटेनर के लेआउट डिस्क पर बदल गया है। इसके बजाय हार्ड-कोडेड निर्देशिका संरचना पर निर्भर होने के बजाय, NSSearchPathForDirectoriesInDomains फ़ंक्शन या URLForDirectory:inDomain:appropriateForURL:create:error: NSFileManager कक्षा का उपयोग करें। File System Programming Guide में Accessing Files and Directories देखें।

यह एक बग नहीं है। सुनिश्चित करें कि आप अनुशंसित एपीआई (उपर्युक्त उद्धरण से) का उपयोग करें और आपको कोई समस्या नहीं होगी।

तो, आप एक बंडल संसाधन आप प्रोजेक्ट में जोड़ी का उपयोग करने की कोशिश कर रहे हैं, तो आप का प्रयोग करेंगे:

[[NSBundle mainBundle] pathForResource:@"resourceName" ofType:@"extension"]; 

लेकिन आप कुछ है कि आप दस्तावेज़ों निर्देशिका में डाल उपयोग करना चाहते हैं, तो आप का प्रयोग करेंगे :

[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"resourceName.extension"]; 
+0

मेरे ऐप में मैं उन HTML पृष्ठों को उत्पन्न करता हूं जिनमें हार्ड कोडित फ़ाइल पथ हैं। ये पथ अब लगातार बदल रहे हैं। मुझे यकीन नहीं है कि मुझे इसे कैसे संभालना है। – datinc

+0

मेरी संपादन मदद करता है? – liamnichols

+0

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

2

मुझे लगता है कि प्रत्येक बिल्ड और रन के लिए अलग-अलग पथ आईओएस सिम्युलेटर में होने वाली चीजों का इच्छित तरीका है। यह कोई मुद्दा नहीं है।

/var/मोबाइल/कंटेनर/डेटा/आवेदन/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/लाइब्रेरी /var/मोबाइल/कंटेनर/डेटा/आवेदन/B038B2DA-F85D-4E18-A5F1-8635834EC454/लाइब्रेरी

मैंने पाया भले ही आप जिस तरह से

- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

परिणाम एक ही हैं सिफारिश का उपयोग करें।प्रत्येक निर्माण & रन के लिए अलग पथ।

+0

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

3

पता नहीं है कि आपने अपनी समस्या का समाधान किया है, लेकिन यह लिंक उत्तर संभव है।

"महत्वपूर्ण::, फ़ाइल हालांकि वे जबकि आपके एप्लिकेशन चल रहा है उपयोग करने के लिए सुरक्षित हैं

https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW10

लगाने बुकमार्क

पेज में इस खंड से पहले कुछ लाइनों

का उपयोग करके फ़ाइलें इस पाठ है संदर्भ यूआरएल आपके ऐप के लॉन्च के बीच स्टोर और पुन: उपयोग करने के लिए सुरक्षित नहीं हैं क्योंकि सिस्टम रीबूट होने पर फ़ाइल की आईडी बदल सकती है। अगर आप अपने ऐप के लॉन्च के बीच लगातार फाइल का स्थान स्टोर करना चाहते हैं, तो ढूंढने में वर्णित एक बुकमार्क बनाएं बुकमार्क का उपयोग कर फाइलें। "

अलविदा अलविदा।

+0

यह काम करता है। आप फ़ाइल के लिए बुकमार्क बनाने के लिए गाइड लाइनों का उपयोग कर सकते हैं, फिर आप बुकमार्क को बदल सकते हैं जो एक एनएसडीटीए को एनएससीटींग में डीकोड बेस 64 का उपयोग करके बदलता है और आप उस स्ट्रिंग को सेंट पर स्टोर कर सकते हैं अयस्क आपकी फाइल का स्थान। जब आप फ़ाइल को पढ़ना चाहते हैं तो आप NSString को NSData बुकमार्क में और फिर फ़ाइल के वर्तमान स्थान के URL पर डीकोड करते हैं। – mylaneza