MIME Type — to znormalizowany identyfikator formatu danych, używany w iOS do określania typu pliku podczas przesyłania przez sieć, system plików i komunikację międzyprocesową. Według Apple Developer Documentation, 2024, MIME Type (Multipurpose Internet Mail Extensions) klasyfikuje pliki według ich zawartości: image/jpeg, application/pdf, text/plain. iOS konwertuje MIME na UTI (Uniform Type Identifier) przez UTType do systemowego przetwarzania plików.
Najważniejsze
MIME Type (Multipurpose Internet Mail Extensions) — to znormalizowany identyfikator formatu danych składający się z dwóch części: typu głównego (type) i podtypu (subtype), rozdzielonych ukośnikiem. Główne kategorie: text (tekst), image (obrazy), audio (dźwięk), video (wideo), application (dane binarne), multipart (wiadomości złożone).
Standard MIME został początkowo opracowany dla załączników email (RFC 2046, 1996), ale dziś jest używany powszechnie: serwery HTTP wskazują Content-Type odpowiedzi, przeglądarki określają sposób obsługi plików, a aplikacje mobilne — jakie dane można otworzyć. IANA (Internet Assigned Numbers Authority) prowadzi rejestr zarejestrowanych typów MIME.
Według IANA Media Types Registry (2024), zarejestrowano ponad 1800 oficjalnych typów MIME, a rzeczywista liczba z uwzględnieniem niestandardowych i vendorskich typów przekracza 5000. iOS obsługuje większość standardowych typów i udostępnia API do pracy z nimi przez Uniform Type Identifiers.
UTI (Uniform Type Identifier) — to własny system identyfikacji typów treści Apple, używany wewnątrz iOS i macOS. W przeciwieństwie do MIME, UTI obsługuje hierarchię dziedziczenia (np. public.image — rodzic dla public.png i public.jpeg) i obejmuje nie tylko formaty plików, ale także abstrakcyjne typy danych.
| MIME Type | UTI | Rozszerzenie | Opis |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg, .jpeg | Obraz JPEG |
| application/pdf | com.adobe.pdf | Dokument PDF | |
| text/plain | public.plain-text | .txt | Plik tekstowy |
| application/json | public.json | .json | Dane JSON |
| video/mp4 | public.mpeg-4 | .mp4 | Wideo MP4 |
Konwersja między MIME a UTI w iOS odbywa się przez klasę UTType (iOS 14+). System prowadzi wewnętrzną bazę zgodności, która pokrywa większość standardowych formatów. Dla niestandardowych typów programista rejestruje zgodność w 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 ?? "")")
}
// Konwersja odwrotna: UTI na MIME
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME for PDF: \(mime)")
}
Hierarchia UTI pozwala sprawdzać, czy typ odpowiada określonej kategorii. Na przykład wszystkie typy obrazów (JPEG, PNG, GIF) conforms(to: .image). Jest to wygodne do grupowego filtrowania i określania możliwości przetwarzania typu przez komponenty systemowe.
Ważna różnica: MIME — to płaska klasyfikacja (brak dziedziczenia), podczas gdy UTI obsługuje wielokrotne dziedziczenie. Na przykład public.html odpowiada zarówno public.source-code, jak i public.text. Daje to bardziej elastyczne kierowanie podczas przetwarzania plików w iOS.
Trzy metody określania MIME Type są dostępne w iOS: po rozszerzeniu pliku (szybkie, ale zawodne), po zawartości przez magic bytes (niezawodne, ale wymaga odczytu pliku) i po nagłówku HTTP Content-Type (tylko dla żądań sieciowych).
import UniformTypeIdentifiers
enum MIMEDetector {
// Wykryj po rozszerzeniu
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// Wykryj po zawartości (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
}
}
Określanie po rozszerzeniu przez UTType — to najszybsza metoda, ale jest zawodna, jeśli rozszerzenie brakuje lub zostało sfałszowane. Atakujący może zmienić nazwę .exe na .jpg — system określi image/jpeg, mimo że plik jest wykonywalny. Dla krytycznych scenariuszy (bezpieczeństwo, dane medyczne) obowiązkowo używaj sprawdzania po zawartości.
Magic bytes — to pierwsze bajty pliku, unikalne dla każdego formatu. Większość formatów ma sygnaturę składającą się z 2–12 bajtów. iOS nie udostępnia wbudowanego detektora MIME po zawartości — programista albo implementuje tabelę sygnatur samodzielnie, albo używa bibliotek takich jak CocoaLumberjack lub niestandardowego detektora opartego na heurystykach.
Niestandardowe typy są niezbędne, gdy aplikacja pracuje z własnymi formatami danych, niezarejestrowanymi w IANA lub Apple. Rejestracja w Info.plist pozwala iOS prawidłowo obsługiwać takie pliki: otwierać je z Files.app, wyświetlać ikony i przekazywać innym aplikacjom przez 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>
Do rejestracji niestandardowego typu należy wskazać w Info.plist: identyfikator UTI (w formacie reverse-DNS), zgodność z typami nadrzędnymi, rozszerzenie pliku i typ MIME. iOS wykorzystuje te informacje do kierowania plików: gdy użytkownik otwiera plik .sdoc, system wie, że jego właścicielem jest Twoja aplikacja.
UTExportedTypeDeclarations — dla typów definiowanych przez Twoją aplikację (eksport). UTImportedTypeDeclarations — dla typów utworzonych przez inne aplikacje, z którymi Twoja aplikacja może pracować (import). Apple zaleca rejestrowanie wszystkich niestandardowych typów, z którymi pracuje aplikacja, dla prawidłowej integracji z systemem.
Nieznane typy MIME stanowią ryzyko dla bezpieczeństwa aplikacji iOS. Jeśli plik ma nieznany lub niesprawdzony typ, aplikacja powinna podjąć środki ostrożności: nie otwierać pliku automatycznie, pokazać ostrzeżenie użytkownikowi lub przeanalizować zawartość przed przetworzeniem.
Główne zagrożenia: plik z fałszywym typem MIME może zawierać złośliwy kod lub exploit na podatność parsera. iOS chroni system przez Sandbox, ale aplikacja może być podatna, jeśli ufa typowi MIME bez sprawdzenia zawartości. Zawsze sprawdzaj plik po magic bytes, jeśli pochodzi z niezaufanego źródła.
Według OWASP Mobile Security Guide, 2024, do obsługi plików nieznanych typów stosuje się następujące praktyki: odrzucaj pliki z typem MIME application/octet-stream z niezweryfikowanych źródeł; używaj UTType do sprawdzania zgodności z oczekiwanymi kategoriami; nie otwieraj plików w zewnętrznych aplikacjach bez potwierdzenia użytkownika; rejestruj wszystkie przypadki niezgodności MIME z rzeczywistą zawartością do audytu bezpieczeństwa.
Rejestracja niestandardowych typów MIME w Info.plist — to nie tylko funkcjonalność, ale także bezpieczeństwo. Jeśli aplikacja prawidłowo rejestruje tylko swoje typy, system nie będzie błędnie przekazywać jej obcych plików. Używaj specyficznych prefiksów vendorskich (application/vnd.company.app-format) zamiast ogólnych (application/x-format), aby uniknąć konfliktów z innymi aplikacjami.
Często zadawane pytania
MIME Type — to standardowy identyfikator formatu danych składający się z typu i podtypu (na przykład image/jpeg). Jest używany przez serwery HTTP, przeglądarki i aplikacje do określenia sposobu przetwarzania pliku.
UTI (Uniform Type Identifier) — to system Apple do identyfikacji typów treści z obsługą hierarchii dziedziczenia. MIME — to płaski standard dla sieci. iOS używa UTType do konwersji między UTI a MIME przez właściwość preferredMIMEType.
Trzy sposoby: po rozszerzeniu przez UTType(filenameExtension:), po zawartości przez magic bytes (pierwsze bajty pliku), po nagłówku HTTP Content-Type. Dla bezpieczeństwa używaj sprawdzania po zawartości, a nie tylko po rozszerzeniu.
Dodaj UTExportedTypeDeclarations w Info.plist: wskaż identyfikator UTI (com.company.format), rozszerzenie pliku, typ MIME i typ nadrzędny. Pliki z tym rozszerzeniem będą automatycznie kojarzone z Twoją aplikacją.
Nie ufaj nieznanemu MIME. Sprawdź zawartość po magic bytes, pokaż ostrzeżenie użytkownikowi i nie otwieraj pliku automatycznie. Dla plików typu application/octet-stream zawsze wykonuj analizę heurystyczną przed przetworzeniem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również