MIME Type — je standardizovaný identifikátor formátu dat, používaný v iOS k určení typu souboru při přenosu přes síť, souborový systém a meziprocesovou komunikaci. Podle Apple Developer Documentation, 2024, MIME Type (Multipurpose Internet Mail Extensions) klasifikuje soubory podle jejich obsahu: image/jpeg, application/pdf, text/plain. iOS převádí MIME na UTI (Uniform Type Identifier) přes UTType pro systémové zpracování souborů.
Hlavní body
MIME Type (Multipurpose Internet Mail Extensions) — je standardizovaný identifikátor formátu dat sestávající ze dvou částí: hlavního typu (type) a podtypu (subtype), oddělených lomítkem. Hlavní kategorie: text (text), image (obrázky), audio (zvuk), video (video), application (binární data), multipart (složené zprávy).
Standard MIME byl původně vyvinut pro e-mailové přílohy (RFC 2046, 1996), ale dnes se používá všude: HTTP servery uvádějí Content-Type odpovědi, prohlížeče určují, jak zpracovat soubory, a mobilní aplikace — jaká data lze otevřít. IANA (Internet Assigned Numbers Authority) vede registr registrovaných MIME typů.
Podle IANA Media Types Registry (2024) je registrováno více než 1800 oficiálních MIME typů a skutečný počet včetně vlastních a vendorských typů přesahuje 5000. iOS podporuje většinu standardních typů a poskytuje API pro práci s nimi prostřednictvím Uniform Type Identifiers.
UTI (Uniform Type Identifier) — je vlastní systém identifikace typů obsahu společnosti Apple, používaný uvnitř iOS a macOS. Na rozdíl od MIME, UTI podporuje hierarchii dědičnosti (např. public.image — rodič pro public.png a public.jpeg) a zahrnuje nejen formáty souborů, ale také abstraktní typy dat.
| MIME Type | UTI | Přípona | Popis |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg, .jpeg | Obrázek JPEG |
| application/pdf | com.adobe.pdf | Dokument PDF | |
| text/plain | public.plain-text | .txt | Textový soubor |
| application/json | public.json | .json | JSON data |
| video/mp4 | public.mpeg-4 | .mp4 | Video MP4 |
Konverze mezi MIME a UTI v iOS se provádí přes třídu UTType (iOS 14+). Systém udržuje interní databázi shod, která pokrývá většinu standardních formátů. Pro vlastní typy vývojář registruje shodu v Info.plist.
import UniformTypeIdentifiers
let mimeType = "image/jpeg"
if let uti = UTType(mimeType: mimeType) {
print("UTI: \(uti.identifier)")
print("Conforms to image: \(uti.conforms(to: .image))")
print("Extension: \(uti.preferredFilenameExtension ?? "")")
}
// Zpětná konverze: UTI na MIME
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME for PDF: \(mime)")
}
Hierarchie UTI umožňuje kontrolovat, zda typ odpovídá určité kategorii. Například všechny typy obrázků (JPEG, PNG, GIF) conforms(to: .image). To je vhodné pro skupinové filtrování a určení schopnosti zpracování typu systémovými komponentami.
Důležitý rozdíl: MIME — je plochá klasifikace (bez dědičnosti), zatímco UTI podporuje vícenásobnou dědičnost. Například public.html odpovídá jak public.source-code, tak public.text. To poskytuje flexibilnější směrování při zpracování souborů v iOS.
Tři metody určení MIME Type jsou k dispozici v iOS: podle přípony souboru (rychlé, ale nespolehlivé), podle obsahu přes magic bytes (spolehlivé, ale vyžaduje čtení souboru) a podle HTTP hlavičky Content-Type (pouze pro síťové požadavky).
import UniformTypeIdentifiers
enum MIMEDetector {
// Detekovat podle přípony
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// Detekovat podle obsahu (magic bytes)
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
}
}
Určení podle přípony přes UTType — nejrychlejší metoda, ale je nespolehlivá, pokud přípona chybí nebo je zfalšovaná. Útočník může přejmenovat .exe na .jpg — systém určí image/jpeg, přestože je soubor spustitelný. Pro kritické scénáře (bezpečnost, lékařská data) povinně používejte kontrolu podle obsahu.
Magic bytes — jsou první bajty souboru, jedinečné pro každý formát. Většina formátů má podpis o délce 2–12 bajtů. iOS neposkytuje vestavěný detektor MIME podle obsahu — vývojář buď implementuje tabulku podpisů sám, nebo používá knihovny jako CocoaLumberjack nebo vlastní detektor založený na heuristikách.
Vlastní typy jsou nezbytné, když aplikace pracuje s proprietárními formáty dat, které nejsou registrovány v IANA nebo Apple. Registrace v Info.plist umožňuje iOS správně zpracovávat takové soubory: otevírat je z Files.app, zobrazovat ikony a předávat je jiným aplikacím přes 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>
Pro registraci vlastního typu je třeba uvést v Info.plist: identifikátor UTI (ve formátu reverse-DNS), shodu s nadřazenými typy, příponu souboru a MIME typ. iOS tyto informace používá pro směrování souborů: když uživatel otevře soubor .sdoc, systém ví, že jeho vlastníkem je vaše aplikace.
UTExportedTypeDeclarations — pro typy definované vaší aplikací (export). UTImportedTypeDeclarations — pro typy vytvořené jinými aplikacemi, se kterými může vaše aplikace pracovat (import). Apple doporučuje registrovat všechny vlastní typy, se kterými aplikace pracuje, pro správnou integraci se systémem.
Neznámé MIME typy představují riziko pro bezpečnost iOS aplikace. Pokud má soubor neznámý nebo neověřený typ, aplikace by měla přijmout opatření: neotevírat soubor automaticky, zobrazit varování uživateli nebo analyzovat obsah před zpracováním.
Hlavní hrozby: soubor s falešným MIME typem může obsahovat škodlivý kód nebo exploit pro zranitelnost analyzátoru. iOS chrání systém přes Sandbox, ale aplikace může být zranitelná, pokud důvěřuje MIME typu bez kontroly obsahu. Vždy kontrolujte soubor podle magic bytes, pokud pochází z nedůvěryhodného zdroje.
Podle OWASP Mobile Security Guide, 2024 se pro zpracování souborů neznámých typů používají následující postupy: odmítejte soubory s MIME typem application/octet-stream z neověřených zdrojů; používejte UTType pro kontrolu shody s očekávanými kategoriemi; neotevírejte soubory ve vnějších aplikacích bez potvrzení uživatele; zaznamenávejte všechny případy nesouladu mezi MIME a skutečným obsahem pro bezpečnostní audit.
Registrace vlastních MIME typů v Info.plist — není jen funkčnost, ale také bezpečnost. Pokud aplikace registruje správně pouze své typy, systém jí nebude omylem posílat cizí soubory. Používejte specifické vendorské prefixy (application/vnd.company.app-format) místo obecných (application/x-format), abyste předešli konfliktům s jinými aplikacemi.
Často kladené otázky
MIME Type — je standardní identifikátor formátu dat sestávající z typu a podtypu (například image/jpeg). Používá se HTTP servery, prohlížeči a aplikacemi k určení způsobu zpracování souboru.
UTI (Uniform Type Identifier) — systém Apple pro identifikaci typů obsahu s podporou hierarchie dědičnosti. MIME — plochý standard pro síť. iOS používá UTType pro konverzi mezi UTI a MIME přes vlastnost preferredMIMEType.
Tři způsoby: podle přípony přes UTType(filenameExtension:), podle obsahu přes magic bytes (první bajty souboru), podle HTTP hlavičky Content-Type. Pro bezpečnost používejte kontrolu podle obsahu, nejen podle přípony.
Přidejte UTExportedTypeDeclarations do Info.plist: uveďte identifikátor UTI (com.company.format), příponu souboru, MIME typ a nadřazený typ. Soubory s touto příponou budou automaticky asociovány s vaší aplikací.
Nedůvěřujte neznámému MIME. Zkontrolujte obsah podle magic bytes, zobrazte varování uživateli a neotevírejte soubor automaticky. Pro soubory typu application/octet-stream vždy proveďte heuristickou analýzu před zpracováním.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také