मैं एक iPhone एप्लिकेशन के साथ फ़ाइल प्रकारों को कैसे जोड़ूँ?


318

अपने iPhone ऐप को फ़ाइल प्रकारों के साथ जोड़ने के विषय पर।

में इस जानकारीपूर्ण सवाल मुझे पता चला कि क्षुधा कस्टम URL के प्रोटोकॉल के साथ जुड़ा हो सकता है।

यह लगभग एक साल पहले था और तब से Apple ने 'डॉक्यूमेंट सपोर्ट' की शुरुआत की, जो एक कदम और आगे बढ़ता है और ऐप्स को फ़ाइल प्रकारों के साथ जुड़ने की अनुमति देता है। जब यह अज्ञात फ़ाइल प्रकार से सामना करता है तो अन्य उपयुक्त ऐप लॉन्च करने के लिए अपने ऐप को कैसे सेट किया जाए, इसके बारे में प्रलेखन में बहुत सारी बातें हैं । इसका मतलब यह है कि एसोसिएशन किसी भी ऐप के लिए बॉक्स से बाहर काम नहीं करता है, जैसे कि URL प्रोटोकॉल रजिस्टर करना।

यह मुझे इस सवाल की ओर ले जाता है: सिस्टम एप्लिकेशन जैसे सफारी या मेल ने संबंधित अनुप्रयोगों को चुनने के लिए इस प्रणाली को लागू किया है, या वे पहले की तरह कुछ नहीं करेंगे?

जवाबों:


408

IPhone OS 3.2 के साथ फ़ाइल प्रकार की हैंडलिंग नई है, और पहले से मौजूद कस्टम URL योजनाओं से अलग है। आप विशेष दस्तावेज़ प्रकारों को संभालने के लिए अपना आवेदन पंजीकृत कर सकते हैं, और कोई भी दस्तावेज़ जो दस्तावेज़ नियंत्रक का उपयोग करता है, इन दस्तावेजों के प्रसंस्करण को अपने स्वयं के आवेदन पर सौंप सकता है।

उदाहरण के लिए, मेरा एप्लिकेशन मोलेक्यूलस (जिसके लिए स्रोत कोड उपलब्ध है) .pdb और .pdb.gz फ़ाइल प्रकारों को संभालता है, यदि ईमेल के माध्यम से या किसी अन्य समर्थित एप्लिकेशन में प्राप्त किया जाता है।

समर्थन दर्ज करने के लिए, आपको अपने Info.plist में निम्नलिखित की तरह कुछ होना चाहिए:

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Document-molecules-320.png</string>
            <string>Document-molecules-64.png</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Molecules Structure File</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.sunsetlakesoftware.molecules.pdb</string>
            <string>org.gnu.gnu-zip-archive</string>
        </array>
    </dict>
</array>

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

उपरोक्त उदाहरण में उपयोग किए गए यूटीआई में से एक प्रणाली-परिभाषित था, लेकिन दूसरा एक एप्लिकेशन-विशिष्ट यूटीआई था। एप्लिकेशन-विशिष्ट यूटीआई को निर्यात करने की आवश्यकता होगी ताकि सिस्टम पर अन्य अनुप्रयोगों को इसके बारे में अवगत कराया जा सके। ऐसा करने के लिए, आप अपने Info.plist में एक सेक्शन जोड़ेंगे जैसे कि निम्नलिखित हैं:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.plain-text</string>
            <string>public.text</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Molecules Structure File</string>
        <key>UTTypeIdentifier</key>
        <string>com.sunsetlakesoftware.molecules.pdb</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <string>pdb</string>
            <key>public.mime-type</key>
            <string>chemical/x-pdb</string>
        </dict>
    </dict>
</array>

यह विशेष उदाहरण com.sunsetlakesoftware.molecules.pdbMIME प्रकार के अनुसार .pdb फ़ाइल एक्सटेंशन के साथ UTI निर्यात करता है chemical/x-pdb

इसके स्थान पर, आपका एप्लिकेशन ईमेल से जुड़े दस्तावेज़ों या सिस्टम के अन्य अनुप्रयोगों से निपटने में सक्षम होगा। मेल में, आप उन एप्लिकेशन की सूची लाने के लिए टैप-एंड-होल्ड कर सकते हैं जो किसी विशेष अनुलग्नक को खोल सकते हैं।

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

NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];

ध्यान दें कि यह वही दृष्टिकोण है जिसका उपयोग हमने कस्टम URL योजनाओं को संभालने के लिए किया था। आप निम्न की तरह कोड का उपयोग करके फ़ाइल के URL को दूसरों से अलग कर सकते हैं:

if ([url isFileURL])
{
    // Handle file being passed in
}
else
{
    // Handle custom URL scheme
}

9
यह ध्यान दिया जाना चाहिए कि -application:didFinishLaunchingWithOptions:ऐप में डेलिगेट केवल तभी कहा जाता है जब किसी फ़ाइल को संभालने के लिए आपके ऐप को बैकग्राउंड नहीं किया गया था।
मेमों


4
हमें - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urliOS 4+
दिमित्री

1
कुंजी 'CFBundleTypeExtensions' के बारे में क्या? आपका स्निपेट इसे सेट नहीं करता है। क्या इसकी आवश्यकता नहीं है?
ब्रैम

3
मैंने यहां और अन्य स्थानों पर भी प्रदान की गई सभी कार्यप्रणाली की कोशिश की है, लेकिन मैं अभी भी पीएनजी फाइलें खोलने के लिए संघर्ष कर रहा हूं। मैं iOS 7 के साथ काम कर रहा हूं। कुछ जगहों पर वे कह रहे हैं कि यह समस्या ios 6 से शुरू होती है। क्या यह सच है? क्या हम ios 7 के साथ "ओपन इन" डायलॉग बॉक्स में png फाइलें नहीं खोल सकते?
कुमार आदित्य

24

ब्रैड के उत्कृष्ट उत्तर के अलावा, मुझे पता चला है कि (आईओएस 4.2.1 पर कम से कम) मेल ऐप से कस्टम फाइलें खोलते समय, आपके ऐप को निकाल दिया गया है या अधिसूचित नहीं किया गया है यदि अटैचमेंट को पहले खोला गया है। "ओपन विथ ..." पॉपअप दिखाई देता है, लेकिन बस कुछ नहीं करता है।

यह इनबॉक्स निर्देशिका से फ़ाइल को स्थानांतरित करके (पुनः) तय किया गया लगता है। ऐसा लगता है कि एक सुरक्षित दृष्टिकोण दोनों को (पुनः) फ़ाइल को स्थानांतरित करता है क्योंकि इसे खोला गया है (इन -(BOOL)application:openURL:sourceApplication:annotation:) और साथ ही दस्तावेज़ / इनबॉक्स निर्देशिका के माध्यम से जा रहा है, सभी वस्तुओं को हटा रहा है, जैसे कि अंदर applicationDidBecomeActive:। पिछले कैच-सभी को फिर से एक स्वच्छ स्थिति में ऐप प्राप्त करने की आवश्यकता हो सकती है, अगर पिछले आयात में दुर्घटना का कारण बनता है या बाधित होता है।


6
मुझे यह व्यवहार दिखाई नहीं देता। यदि मेरा ऐप बैकग्राउंड है, -(BOOL)application:openURL:sourceApplication:annotation:तो हमेशा कॉल किया जाता है, यहां तक ​​कि अटैचमेंट के लिए भी जो पहले ही खुल चुके हैं। प्रत्येक अतिरिक्त समय के लिए अनुलग्नक खोला जाता है, एक नंबर फ़ाइल नाम के लिए प्रत्ययित किया जाता है और विशिष्ट होने के लिए बढ़ाया जाता है - test.text, test-1.xt, test-2.txt, इत्यादि
19

मेरा इनबॉक्स डायरेक्टरी खाली है, लेकिन फिर भी मेरे पास सफारी में "ओपन इन" बटन है। सालों पहले, मेरा ऐप ठीक काम कर रहा था, लेकिन अचानक उसने काम करना बंद कर दिया। मुझे संदेह है कि Apple ने सफारी में कुछ बदल दिया है।
ब्रम

18

बड़ा चेतावनी: सुनिश्चित करें कि आपका विस्तार पहले से ही कुछ माइम प्रकार से बंधा हुआ नहीं है।

हमने मूल रूप से, कभी भी, और सफारी के लिए अपनी कस्टम फ़ाइलों के लिए एक्सटेंशन '.icz' का उपयोग किया है और आपको कभी भी यह कहने की अनुमति नहीं देगा कि "सफारी इस फ़ाइल को नहीं खोल सकती।" कोई फर्क नहीं पड़ता कि हमने क्या किया या यूटी सामान के साथ ऊपर की कोशिश की।

आखिरकार मुझे एहसास हुआ कि कुछ यूटी * सी फ़ंक्शन हैं जिनका उपयोग आप विभिन्न चीजों का पता लगाने के लिए कर सकते हैं, और जबकि .icz सही उत्तर देता है (हमारा ऐप):

एप्लिकेशन में शीर्ष पर लोड किया गया, बस यह करें ...

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, 
                                                                   (CFStringRef)@"icz", 
                                                                   NULL);
CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

और उस लाइन के बाद ब्रेक लगाएं और देखें कि यूटीआई और उर क्या हैं - हमारे मामले में, यह हमारा पहचानकर्ता था जैसा हम चाहते थे), और बंडल url (उर) हमारे ऐप के फ़ोल्डर की ओर इशारा कर रहा था।

लेकिन MIME प्रकार जो ड्रॉपबॉक्स हमें हमारे लिंक के लिए वापस देता है, जिसे आप उदाहरण के लिए चेक कर सकते हैं

$ curl -D headers THEURLGOESHERE > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27393  100 27393    0     0  24983      0  0:00:01  0:00:01 --:--:-- 28926
$ cat headers
HTTP/1.1 200 OK
accept-ranges: bytes
cache-control: max-age=0
content-disposition: attachment; filename="123.icz"
Content-Type: text/calendar
Date: Fri, 24 May 2013 17:41:28 GMT
etag: 872926d
pragma: public
Server: nginx
x-dropbox-request-id: 13bd327248d90fde
X-RequestId: bf9adc56934eff0bfb68a01d526eba1f
x-server-response-time: 379
Content-Length: 27393
Connection: keep-alive

सामग्री-प्रकार वही है जो हम चाहते हैं। ड्रॉपबॉक्स का दावा है कि यह एक पाठ / कैलेंडर प्रविष्टि है। महान। लेकिन मेरे मामले में, मैंने अपने ऐप के माइम प्रकारों में पाठ / कैलेंडर को पहले से ही पढ़ लिया है, और यह काम नहीं करता है। इसके बजाय, जब मैं पाठ / कैलेंडर के लिए UTI और बंडल url प्राप्त करने का प्रयास करता हूं,

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,
                                                                   (CFStringRef)@"text/calendar", 
                                                                   NULL);

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

मैं "com.apple.ical.ics" को UTI के रूप में देखता हूं और "... / MobileCoreTypes.bundle /" बंडल URL के रूप में। हमारा ऐप नहीं, बल्कि ऐपल। तो मैं LSItemContentTypes में com.apple.ical.ics को अपने स्वयं के साथ, और UTConformsTo में निर्यात में डालने की कोशिश करता हूं, लेकिन नहीं जाता।

इसलिए मूल रूप से, यदि Apple को लगता है कि वे किसी बिंदु पर फ़ाइल प्रकार के कुछ प्रकार को संभालना चाहते हैं (जो कि आपके ऐप के लाइव होने के 10 साल बाद बनाया जा सकता है, तो आपको बुरा लगता है), आपको एक्सटेंशन बदलने का कारण बनाना होगा क्योंकि वे आपको आसानी से हैंडल नहीं करने देंगे फ़ाइल प्रकार।


उपयोगी चेतावनी के लिए धन्यवाद!
रॉकसॉलिड

0

अपने स्वयं के APP के लिए किसी भी प्रकार की फ़ाइलों से निपटने के लिए, मैं CFBundleDocumentTypes के लिए इस कॉन्फ़िगरेशन का उपयोग करता हूं:

    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>IPA</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>public.item</string>
                <string>public.content</string>
                <string>public.data</string>
                <string>public.database</string>
                <string>public.composite-content</string>
                <string>public.contact</string>
                <string>public.archive</string>
                <string>public.url-name</string>
                <string>public.text</string>
                <string>public.plain-text</string>
                <string>public.source-code</string>
                <string>public.executable</string>
                <string>public.script</string>
                <string>public.shell-script</string>
                <string>public.xml</string>
                <string>public.symlink</string>
                <string>org.gnu.gnu-zip-archve</string>
                <string>org.gnu.gnu-tar-archive</string>
                <string>public.image</string>
                <string>public.movie</string>
                <string>public.audiovisual-​content</string>
                <string>public.audio</string>
                <string>public.directory</string>
                <string>public.folder</string>
                <string>com.apple.bundle</string>
                <string>com.apple.package</string>
                <string>com.apple.plugin</string>
                <string>com.apple.application-​bundle</string>
                <string>com.pkware.zip-archive</string>
                <string>public.filename-extension</string>
                <string>public.mime-type</string>
                <string>com.apple.ostype</string>
                <string>com.apple.nspboard-typ</string>
                <string>com.adobe.pdf</string>
                <string>com.adobe.postscript</string>
                <string>com.adobe.encapsulated-​postscript</string>
                <string>com.adobe.photoshop-​image</string>
                <string>com.adobe.illustrator.ai-​image</string>
                <string>com.compuserve.gif</string>
                <string>com.microsoft.word.doc</string>
                <string>com.microsoft.excel.xls</string>
                <string>com.microsoft.powerpoint.​ppt</string>
                <string>com.microsoft.waveform-​audio</string>
                <string>com.microsoft.advanced-​systems-format</string>
                <string>com.microsoft.advanced-​stream-redirector</string>
                <string>com.microsoft.windows-​media-wmv</string>
                <string>com.microsoft.windows-​media-wmp</string>
                <string>com.microsoft.windows-​media-wma</string>
                <string>com.apple.keynote.key</string>
                <string>com.apple.keynote.kth</string>
                <string>com.truevision.tga-image</string>
            </array>
            <key>CFBundleTypeIconFiles</key>
            <array>
                <string>Icon-76@2x</string>
            </array>
        </dict>
    </array>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.