MIME Type — co to jest, typy plików i określanie w iOS

Autor: IT Sectr Opublikowano: 2026-07-11 Czas czytania: 7 min

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 — identyfikator formatu danych składający się z dwóch części: typ/podtyp (image/png)
  • UTType — iOS-owy odpowiednik MIME, używany wewnętrznie przez system do identyfikacji typów plików
  • Konwersja między MIME a UTI odbywa się przez UTType.preferredMIMEType
  • Określenie MIME możliwe po rozszerzeniu pliku, zawartości (magic bytes) lub nagłówku HTTP
  • iOS Sandbox ogranicza dostęp do plików nieznanych typów — ważne jest prawidłowe rejestrowanie niestandardowych typów

Co to jest MIME Type?

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.

MIME i UTI w iOS: różnice i konwersja

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 TypeUTIRozszerzenieOpis
image/jpegpublic.jpeg.jpg, .jpegObraz JPEG
application/pdfcom.adobe.pdf.pdfDokument PDF
text/plainpublic.plain-text.txtPlik tekstowy
application/jsonpublic.json.jsonDane JSON
video/mp4public.mpeg-4.mp4Wideo 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.

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

Jak określić MIME Type pliku 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).

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

Rejestracja niestandardowych typów MIME i UTI

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.

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

Bezpieczeństwo i obsługa nieznanych typów

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

Co to jest MIME Type?

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.

Czym UTI różni się od MIME w iOS?

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.

Jak określić MIME Type pliku w iOS?

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.

Jak zarejestrować niestandardowy typ MIME w iOS?

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

Co robić z nieznanymi typami MIME?

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

  • MIME Type — znormalizowany identyfikator formatu danych (typ/podtyp), używany w HTTP i iOS
  • UTType — iOS API do pracy z typami treści, obsługujące hierarchię i konwersję MIME→UTI
  • Określanie typu odbywa się po rozszerzeniu, magic bytes lub nagłówku HTTP Content-Type
  • Niestandardowe typy rejestruje się w Info.plist przez UTExportedTypeDeclarations
  • Bezpieczeństwo wymaga sprawdzenia zawartości — MIME z nagłówka może być sfałszowany
  • Hierarchia UTI pozwala sprawdzać kategorię pliku (obraz, tekst, wideo) przez conforms(to:)
  • Application/octet-stream — uniwersalny typ dla nieznanych danych binarnych, wymaga analizy heurystycznej

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.

Omów projekt

Przeczytaj również