ファイルの種類をiPhoneアプリケーションに関連付けるにはどうすればよいですか?


318

iPhoneアプリとファイルタイプの関連付けについて。

、この有益な質問私はアプリがカスタムURLプロトコルに関連付けることができることを学びました。

それはほぼ1年前のことで、それ以来Appleは「ドキュメントサポート」を導入しました。これにより、一歩進んで、アプリをファイルタイプに関連付けることができます。不明なファイルタイプが検出されたときに他の適切なアプリを起動するようにアプリを設定する方法については、ドキュメントに多くの説明があります。これは、URLプロトコルの登録のように、関連付けがアプリの箱から出して機能しないことを意味します。

これは私に質問を導きます:関連するアプリケーションを選択するために、SafariやMailのようなシステムアプリがこのシステムを実装していますか、それとも以前のように何もしませんか?

回答:


408

ファイルタイプの処理は、iPhone OS 3.2で新しく追加され、既存のカスタムURLスキームとは異なります。特定の種類のドキュメントを処理するようにアプリケーションを登録できます。ドキュメントコントローラーを使用するアプリケーションは、これらのドキュメントの処理を独自のアプリケーションに引き渡すことができます。

たとえば、私のアプリケーションMolecules(ソースコードが利用可能)は、.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>

メールおよびドキュメントを表示できるその他のアプリケーションでサポートされているタイプのアイコンとして使用される2つの画像が提供されます。LSItemContentTypesキーはあなたのアプリケーションで開くことができるという統一タイプ識別子症(UTI)のアレイを提供することができます。システム定義のUTIのリストについては、AppleのUniform Type Identifiers Referenceを参照してください。UTIの詳細については、AppleのUniform Type Identifiers Overviewを参照してください。この機能はMac全体に移植されているため、これらのガイドはMacデベロッパーセンターにあります。

上記の例で使用されたUTIの1つはシステム定義でしたが、もう1つはアプリケーション固有のUTIでした。システム上の他のアプリケーションがそれを認識できるように、アプリケーション固有のUTIをエクスポートする必要があります。これを行うには、次のようなセクションを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.pdbでは、MIMEタイプに対応する.pdbファイル拡張子を付けてUTIをエクスポートしますchemical/x-pdb

これにより、アプリケーションは、メールに添付されたドキュメントやシステム上の他のアプリケーションからのドキュメントを処理できるようになります。メールでは、タップアンドホールドして、特定の添付ファイルを開くことができるアプリケーションのリストを表示できます。

添付ファイルを開くと、アプリケーションが起動し、-application:didFinishLaunchingWithOptions:アプリケーションのデリゲートメソッドでこのファイルの処理を処理する必要があります。この方法でMailからロードされたファイルは、到着したメールボックスに対応するサブディレクトリの下のアプリケーションのDocumentsディレクトリにコピーされるようです。次のようなコードを使用して、アプリケーションデリゲートメソッド内でこのファイルのURLを取得できます。

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

これは、カスタムURLスキームの処理に使用した方法と同じです。次のようなコードを使用して、ファイルのURLを他のURLから分離できます。

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

9
-application:didFinishLaunchingWithOptions:アプリデリゲートでは、ファイルを処理するために開いたときにアプリがバックグラウンドで実行されなかった場合にのみ呼び出されることに注意してください。
11

3
クイックルックの回避:raywenderlich.com/1980/...
TheLearner

4
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)urliOS 4以降でも使用する必要があります
Dmitry

1
キー「CFBundleTypeExtensions」はどうですか?あなたのスニペットはそれを設定していないようです。必要ありませんか?
Bram

3
ここや他の場所で提供されているすべての方法論を試しましたが、まだPNGファイルを開くのに苦労しています。私はiOS 7を使用しています。一部の地域では、この問題はiOS 6から始まると言っています。本当ですか?iOS 7の[開く]ダイアログボックスでPNGファイルを開くことはできませんか?
Kumar Aditya

24

Bradの優れた答えに加えて、(少なくともiOS 4.2.1では)メールアプリからカスタムファイルを開くと、アプリが起動されないか、以前に添付ファイルが開かれていた場合に通知されないことがわかりました。「…で開く」ポップアップが表示されますが、何もしません。

これは、受信ボックスディレクトリからファイルを(再)移動することで修正されるようです。安全なアプローチは、ファイルが開かれたときにファイルを(再)移動することと-(BOOL)application:openURL:sourceApplication:annotation:、Documents / Inboxディレクトリを経由してすべてのアイテムを削除すること(たとえば)の両方のようapplicationDidBecomeActive:です。以前のインポートでクラッシュが発生したり、中断されたりした場合に備えて、アプリをクリーンな状態に戻すには、最後のキャッチオールが必要になる場合があります。


6
この動作はわかりません。私のアプリがバックグラウンドである場合、-(BOOL)application:openURL:sourceApplication:annotation:すでに開かれている添付ファイルであっても、常に呼び出されます。添付ファイルを開くたびに、ファイル名の末尾に番号が付加され、一意になるように増分されます(test.text、test-1.txt、test-2.txtなど)
memmons

私の受信トレイディレクトリは空ですが、Safariで応答しない「開く」ボタンがあります。数年前、私のアプリは問題なく動作していましたが、突然動作しなくなりました。AppleがSafariで何かを変更したのではないかと思う。
Bram

18

大きな警告:拡張機能がMIMEタイプに関連付けられていないことを100%確認してください。

基本的に、カスタムファイルに拡張子「.icz」を使用しましたが、Safariでは「Safariはこのファイルを開くことができません」と言ってファイルを開くことができませんでした。上記のUTを使って何をしたか、または試したかに関係なく。

やがて、さまざまなことを調べるために使用できるUT * C関数がいくつかあることに気付きました。.iczが正しい答えを提供しているのに(私たちのアプリ):

アプリで上部に読み込まれました、これを実行してください...

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

そして、その行の後に改行を入れて、UTIとurが何であるかを確認します(この場合、それは私たちが望むIDでした)、バンドルURL(ur)はアプリのフォルダーを指しています。

ただし、Dropboxがリンクに返す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

Content-Typeは私たちが望むものです。Dropboxは、これはテキスト/カレンダーエントリであると主張しています。すごい。しかし、私の場合、テキスト/カレンダーをアプリのMIMEタイプに挿入しようとしましたが、それでも機能しません。代わりに、text / calendar mimetypeのUTIとバンドルURLを取得しようとすると、

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

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

「com.apple.ical.ics」をUTIとして、「... / MobileCoreTypes.bundle /」をバンドルURLとして表示します。私たちのアプリではなく、アップル。だから私はcom.apple.ical.icsを自分のものと一緒にLSItemContentTypesに入れ、エクスポートではUTConformsToに入れようとしましたが、うまくいきません。

つまり、基本的には、Appleがある時点で何らかの形式のファイルタイプ(アプリの公開から10年後に作成される可能性があります)を処理したいと考えている場合は、拡張子を変更する必要があります。ファイルタイプ。


役立つ警告をありがとう!
RockSolid 2016

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.