MIMEタイプは、iOSでネットワーク、ファイルシステム、プロセス間通信を介して送信する際にファイルタイプを判別するために使用される標準化されたデータ形式識別子です。Appleデベロッパードキュメンテーション、2024によると、MIMEタイプ(Multipurpose Internet Mail Extensions)はファイルをその内容に基づいて分類します:image/jpeg、application/pdf、text/plain。iOSはシステムファイル処理のため、UTTypeを通じてMIMEをUTI(ユニフォームタイプ識別子)に変換します。
重要なポイント
MIMEタイプ(Multipurpose Internet Mail Extensions)は、メインタイプ(type)とサブタイプ(subtype)の2つの部分からなり、スラッシュで区切られた標準化されたデータ形式識別子です。主なカテゴリ:text(テキスト)、image(画像)、audio(オーディオ)、video(ビデオ)、application(バイナリデータ)、multipart(複合メッセージ)。
MIME標準はもともと電子メールの添付ファイル用に開発されました(RFC 2046、1996)が、今日ではあらゆるところで使用されています:HTTPサーバーは応答のContent-Typeを指定し、ブラウザはファイルの処理方法を決定し、モバイルアプリケーションは開くことができるデータを識別します。IANA(Internet Assigned Numbers Authority)は登録されたMIMEタイプのレジストリを管理しています。
IANAメディアタイプレジストリ(2024)によると、1800以上の公式MIMEタイプが登録されており、カスタムタイプとベンダータイプを含む実際の数は5000を超えています。iOSはほとんどの標準タイプをサポートし、ユニフォームタイプ識別子を通じてそれらを操作するためのAPIを提供しています。
UTI(ユニフォームタイプ識別子)は、iOSおよびmacOS内で使用されるApple独自のコンテンツタイプ識別システムです。MIMEとは異なり、UTIは継承階層をサポートし(例:public.imageはpublic.pngとpublic.jpegの親です)、ファイル形式だけでなく抽象データ型も含みます。
| MIMEタイプ | UTI | 拡張子 | 説明 |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg、.jpeg | JPEG画像 |
| application/pdf | com.adobe.pdf | PDFドキュメント | |
| text/plain | public.plain-text | .txt | テキストファイル |
| application/json | public.json | .json | JSONデータ |
| video/mp4 | public.mpeg-4 | .mp4 | MP4ビデオ |
変換 iOSでのMIMEとUTI間の変換は、UTTypeクラス(iOS 14+)を通じて実行されます。システムは、ほとんどの標準形式をカバーする内部マッピングデータベースを維持しています。カスタムタイプの場合、開発者はInfo.plistにマッピングを登録します。
import UniformTypeIdentifiers
let mimeType = "image/jpeg"
if let uti = UTType(mimeType: mimeType) {
print("UTI: \(uti.identifier)")
print("画像に準拠: \(uti.conforms(to: .image))")
print("拡張子: \(uti.preferredFilenameExtension ?? "")")
}
// 逆変換:UTIからMIMEへ
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("PDFのMIME: \(mime)")
}
UTI階層により、タイプが特定のカテゴリに準拠しているかどうかを確認できます。例えば、すべての画像タイプ(JPEG、PNG、GIF)はconform(to: .image)します。これはグループフィルタリングや、タイプがシステムコンポーネントによって処理可能かどうかの判断に便利です。
重要な違い:MIMEはフラットな分類(継承なし)ですが、UTIは多重継承をサポートしています。例えば、public.htmlはpublic.source-codeとpublic.textの両方に準拠します。これにより、iOSでファイルを処理する際のより柔軟なルーティングが可能になります。
3つの方法でiOSでMIMEタイプを判定できます:ファイル拡張子による方法(高速だが信頼性が低い)、マジックバイトによる内容からの方法(信頼性が高いがファイルの読み取りが必要)、HTTP Content-Typeヘッダーによる方法(ネットワークリクエストのみ)。
import UniformTypeIdentifiers
enum MIMEDetector {
// 拡張子で検出
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// 内容で検出(マジックバイト)
static func fromFile(at url: URL) -> String? {
guard let handle = try? FileHandle(forReadingFrom: url) else {
return nil
}
defer { handle.closeFile() }
let header = handle.readData(ofLength: 12)
// PNG: 89 50 4E 47 0D 0A 1A 0A
// JPEG: FF D8 FF
// PDF: 25 50 44 46
// ZIP: 50 4B 03 04
if header.starts(with: [0x89, 0x50, 0x4E, 0x47]) {
return "image/png"
}
if header.starts(with: [0xFF, 0xD8, 0xFF]) {
return "image/jpeg"
}
if header.starts(with: [0x25, 0x50, 0x44, 0x46]) {
return "application/pdf"
}
return nil
}
}
拡張子による判定はUTTypeを通じた最速の方法ですが、拡張子がない場合や偽造されている場合は信頼できません。攻撃者は.exeを.jpgにリネームする可能性があります — システムはファイルが実行可能であってもimage/jpegとして識別します。重要なシナリオ(セキュリティ、医療データ)では、常に内容ベースの検証を使用してください。
マジックバイトはファイルの最初のバイトであり、各形式に固有です。ほとんどの形式には2〜12バイトのシグネチャがあります。iOSは内容による組み込みのMIME検出器を提供していません — 開発者は自分でシグネチャテーブルを実装するか、CocoaLumberjackなどのライブラリやヒューリスティックベースのカスタム検出器を使用します。
カスタムタイプは、アプリケーションがIANAまたはAppleに登録されていない独自のデータ形式を扱う場合に必要です。Info.plistへの登録により、iOSはそのようなファイルを正しく処理できます:Files.appから開く、アイコンを表示する、UIActivityViewControllerを介して他のアプリケーションに渡す。
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>MyApp Document</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.myapp.secret-doc</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.myapp.secret-doc</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array><string>sdoc</string></array>
<key>public.mime-type</key>
<array><string>application/vnd.myapp.secret-doc</string></array>
</dict>
</dict>
</array>
カスタムタイプを登録するには、Info.plistで以下を指定する必要があります:UTI識別子(reverse-DNS形式)、親タイプへの準拠、ファイル拡張子、MIMEタイプ。iOSはファイルルーティングにこの情報を使用します:ユーザーが.sdocファイルを開くと、システムはその所有者があなたのアプリケーションであることを認識します。
UTExportedTypeDeclarations — アプリケーションが定義するタイプ用(エクスポート)。UTImportedTypeDeclarations — 他のアプリケーションが作成した、アプリが処理できるタイプ用(インポート)。Appleは、正しいシステム統合のために、アプリケーションが扱うすべてのカスタムタイプを登録することを推奨しています。
不明なMIMEタイプはiOSアプリケーションにセキュリティリスクをもたらします。ファイルのタイプが不明または未検証の場合、アプリケーションは注意を払う必要があります:ファイルを自動的に開かない、ユーザーに警告を表示する、処理前に内容を分析する。
主な脅威:偽造されたMIMEタイプのファイルには、悪意のあるコードやパーサーの脆弱性を狙ったエクスプロイトが含まれている可能性があります。iOSはサンドボックスを通じてシステムを保護しますが、アプリケーションは内容を検証せずにMIMEタイプを信頼すると脆弱になる可能性があります。信頼できないソースからのファイルは、常にマジックバイトで確認してください。
OWASPモバイルセキュリティガイド(2024)によると、不明なタイプのファイルを処理するには以下のプラクティスが適用されます:信頼できないソースからのapplication/octet-stream MIMEタイプのファイルを拒否する;UTTypeを使用して期待されるカテゴリへの準拠を確認する;ユーザーの確認なしに外部アプリケーションでファイルを開かない;セキュリティ監査のためにMIMEと実際の内容の不一致をすべてログに記録する。
カスタムMIMEタイプのInfo.plistへの登録は、機能性だけでなくセキュリティでもあります。アプリケーションが自身のタイプのみを正しく登録すれば、システムが誤って他のファイルを渡すことはありません。他のアプリケーションとの競合を避けるため、汎用プレフィックス(application/x-format)ではなく、特定のベンダープレフィックス(application/vnd.company.app-format)を使用してください。
よくある質問
MIMEタイプは、タイプとサブタイプ(例:image/jpeg)からなる標準的なデータ形式識別子です。HTTPサーバー、ブラウザ、アプリケーションがファイルの処理方法を決定するために使用します。
UTI(ユニフォームタイプ識別子)は、継承階層をサポートするAppleのコンテンツタイプ識別システムです。MIMEはネットワーク用のフラットな標準です。iOSはpreferredMIMETypeプロパティを通じてUTIとMIME間の変換にUTTypeを使用します。
3つの方法:拡張子による UTType(filenameExtension:)経由、内容による マジックバイト経由(ファイルの最初のバイト)、HTTPヘッダーによる Content-Type。セキュリティのため、拡張子だけでなく内容ベースの検証を使用してください。
Info.plistにUTExportedTypeDeclarationsを追加:UTI識別子(com.company.format)、ファイル拡張子、MIMEタイプ、親タイプを指定します。この拡張子のファイルは自動的にアプリケーションに関連付けられます。
不明なMIMEを信頼しないでください。マジックバイトで内容を確認し、ユーザーに警告を表示し、ファイルを自動的に開かないでください。application/octet-streamタイプのファイルは、処理前に常にヒューリスティック分析を実行してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。