Dosya türlerini bir iPhone uygulamasıyla nasıl ilişkilendiririm?


318

İPhone uygulamanızı dosya türleriyle ilişkilendirme konusunda.

Gelen bu bilgilendirici soruya ben uygulamalar özel URL protokolleri ile ilişkili olabileceğini öğrendik.

Bu neredeyse bir yıl önceydi ve o zamandan beri Apple, bir adım daha ileri giderek uygulamaların dosya türleriyle ilişkilendirilmesine izin veren 'Belge Desteği'ni tanıttı. Belgenizde , uygulamanızı bilinmeyen bir dosya türüyle karşılaştığında diğer uygun uygulamaları başlatacak şekilde nasıl ayarlayacağınız hakkında çok fazla konuşma var . Bu, ilişkilendirmenin, URL protokol kaydı gibi herhangi bir uygulama için kutudan çıkmadığı anlamına gelir.

Bu beni şu soruya yönlendiriyor: Safari veya Mail gibi sistem uygulamaları bu sistemi ilişkili uygulamaları seçmek için uyguladı mı yoksa eskisi gibi bir şey yapmayacak mı?

Yanıtlar:


408

Dosya türü işleme, iPhone OS 3.2'de yenidir ve mevcut özel URL şemalarından farklıdır. Belirli belge türlerini işlemek için uygulamanızı kaydedebilirsiniz ve belge denetleyicisi kullanan herhangi bir uygulama bu belgelerin işlenmesini kendi uygulamanıza teslim edebilir.

Örneğin, uygulamam Moleküllerim (kaynak kodun mevcut olduğu) .pdb ve .pdb.gz dosya türlerini e-postayla veya desteklenen başka bir uygulamada alırlarsa işler.

Destek kaydetmek için Info.plist'inizde aşağıdakine benzer bir şey olması gerekir:

<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>

Mail'de ve belge gösterebilen diğer uygulamalarda desteklenen türler için simge olarak kullanılacak iki resim sağlanır. LSItemContentTypesAnahtar başvurunuzun açabilirsiniz Üniforma Tipi Tanımlayıcıları bir dizi (İYE) sunmasına izin verir. Sistem tanımlı UTI'ların listesi için Apple'ın Tek Tip Tip Tanımlayıcıları Referansına bakın . UTI'ler hakkında daha fazla ayrıntı Apple'ın Tek Tip Tip Tanımlayıcılarına Genel Bakış'ta bulunabilir . Bu kılavuzlar Mac geliştirici merkezinde bulunmaktadır, çünkü bu özellik Mac'in karşısına taşınmıştır.

Yukarıdaki örnekte kullanılan İYE'lerden biri sistem tanımlıydı, diğeri uygulamaya özgü bir İYE'ydi. Uygulamaya özgü İYE'nin dışa aktarılması gerekecektir, böylece sistemdeki diğer uygulamalar bundan haberdar edilebilir. Bunu yapmak için Info.plist'inize aşağıdaki gibi bir bölüm eklersiniz:

<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>

Bu özel örnek com.sunsetlakesoftware.molecules.pdb, UTI'yi MIME türüne karşılık gelen .pdb dosya uzantısıyla dışa aktarır chemical/x-pdb.

Bu durumda uygulamanız, e-postalara eklenmiş veya sistemdeki diğer uygulamalardan gelen belgeleri işleyebilir. Mail'de, belirli bir eki açabilecek uygulamaların bir listesini görüntülemek için dokunup basılı tutabilirsiniz.

Ek açıldığında, uygulamanız başlatılır ve bu dosyanın -application:didFinishLaunchingWithOptions:uygulama temsilci yönteminizde işlenmesi gerekir . Mail'den bu şekilde yüklenen dosyaların, uyguladıkları e-posta kutusuna karşılık gelen bir alt dizin altında uygulamanızın Belgeler dizinine kopyalandığı anlaşılır. Aşağıdaki gibi kodu kullanarak uygulama temsilcisi yönteminde bu dosyanın URL'sini alabilirsiniz:

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

Bunun, özel URL şemalarını işlemek için kullandığımız yaklaşımla aynı olduğunu unutmayın. Aşağıdaki gibi bir kod kullanarak dosya URL'lerini diğerlerinden ayırabilirsiniz:

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

9
-application:didFinishLaunchingWithOptions:Uygulama temsilcisinin yalnızca uygulamanız bir dosyayı işlemek için açıldığında arka plana sahip değilse çağrıldığına dikkat edilmelidir .
memmons

3
QuickLook'tan Kaçınma: raywenderlich.com/1980/…
TheLearner

4
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urlİOS 4+ da kullanmalıyız
Dmitry

1
'CFBundleTypeExtensions' anahtarına ne dersiniz? Snippet'iniz bunu ayarlamıyor gibi görünüyor. Gerekli değil mi?
Bram

3
Burada ve diğer yerlerde sağlanan tüm metodolojileri denedim, ancak hala açık PNG dosyaları almak için mücadele ediyorum. İOS 7 ile çalışıyorum. Bazı yerlerde bu sorunun ios 6 ile başladığını söylüyorlar. Doğru mu? Png dosyalarını "7 içinde aç" iletişim kutusunda ios 7 ile açamıyor muyuz?
Kumar Aditya

24

Brad'in mükemmel cevabına ek olarak, Posta uygulamasından özel dosyalar açarken (en azından iOS 4.2.1'de), ek daha önce açıldıysa uygulamanızın tetiklenmediğini veya bildirilmediğini öğrendim. "Birlikte aç ..." açılır penceresi görünür, ancak hiçbir şey yapmaz.

Bu, dosyayı Gelen Kutusu dizininden (yeniden) taşıyarak giderilmiş gibi görünüyor. Güvenli bir yaklaşım, dosyayı hem açıldığında (içeri) hareket ettirmenin hem -(BOOL)application:openURL:sourceApplication:annotation:de Documents / Inbox dizininden geçerek (örn applicationDidBecomeActive:. İçindeki) tüm öğeleri kaldırmak gibi görünüyor . Önceki bir içe aktarma işleminin kilitlenmeye neden olması veya kesintiye uğraması durumunda, uygulamayı tekrar temiz duruma getirmek için bu son yakalama işlemi gerekebilir.


6
Bu davranışı görmüyorum. Uygulamam arka plandaysa, -(BOOL)application:openURL:sourceApplication:annotation:zaten açılmış ekler için bile her zaman çağrılır. Ek her açıldığında, dosya adına bir sayı eklenir ve benzersiz olarak artırılır - test.text, test-1.txt, test-
2.txt

Gelen Kutusu dizinim boş, ancak Safari'de bahsettiğiniz yanıt vermeyen "Şurada Aç" düğmesi var. Yıllar önce, uygulamam iyi çalışıyordu, ancak aniden çalışmayı durdurdu. Apple'ın Safari'de bir şey değiştirdiğinden şüpheleniyorum.
Bram

18

BÜYÜK UYARI: Uzantınızın zaten bazı mime türlerine bağlı olmadığından emin olun.

'.İcz' uzantısını temel dosyalarımız için özel olarak kullandığımız için kullandık ve Safari hiçbir zaman "Safari bu dosyayı açamıyor" diyerek onları açmanıza izin vermedi. yukarıdaki UT ile ne yaptığımız veya denediğimiz önemli değil.

Sonunda çeşitli şeyleri keşfetmek için kullanabileceğiniz bazı UT * C işlevleri olduğunu fark ettim ve .icz doğru cevabı verirken (uygulamamız):

Uygulamada üstte yük var, sadece bunu yap ...

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

ve bu satırdan sonra ara verin ve UTI ve ur'un ne olduğunu görün - bizim durumumuzda, istediğimiz gibi tanımlayıcımızdı) ve paket url (ur) uygulamamızın klasörüne işaret ediyordu.

Ancak Dropbox'ın bize bağlantımız için geri verdiği MIME türü, örn.

$ 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

İçerik Türü istediğimiz şeydir. Dropbox bunun bir metin / takvim girişi olduğunu iddia ediyor. Harika. Ama benim durumumda, uygulamamın mime tiplerine metin / takvim koymak için ZORUNLU ÇALIŞTIM ve hala çalışmıyor. Bunun yerine, metin / takvim mime türü için UTI ve paket URL'sini almaya çalıştığımda,

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

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

UTI olarak "com.apple.ical.ics" ve paket URL'si olarak "... / MobileCoreTypes.bundle /" ifadesini görüyorum. Bizim uygulamamız değil Apple. Bu yüzden com.apple.ical.ics'i LSItemContentTypes'e kendi adımımla ve UTConformsTo'ya dışa aktarmaya çalışıyorum, ama gitmiyorum.

Temel olarak, Apple bir noktada bir tür dosya türünü işlemek istediklerini düşünüyorsa (uygulamanız yayına girdikten 10 yıl sonra oluşturulabilir) dosya türü.


Yararlı uyarı için teşekkürler!
RockSolid

0

Kendi APP için herhangi bir dosya türü ile başa çıkmak için, CFBundleDocumentTypes için bu yapılandırmayı kullanın:

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.