Тип MIME — що це, типи файлів та визначення в iOS

Автор: IT Sectr Опубліковано: 2026-07-11 Час читання: 7 хв

Тип MIME — це стандартизований ідентифікатор формату даних, що використовується в iOS для визначення типу файлу при передачі через мережу, файлову систему та міжпроцесну взаємодію. За даними документації Apple для розробників, 2024, тип MIME (Multipurpose Internet Mail Extensions) класифікує файли за їхнім вмістом: image/jpeg, application/pdf, text/plain. iOS перетворює MIME в UTI (Uniform Type Identifier) через UTType для системної обробки файлів.

Головне

  • Тип MIME — ідентифікатор формату даних із двох частин: тип/підтип (image/png)
  • UTType — iOS-аналог MIME, що використовується всередині системи для ідентифікації типів файлів
  • Конвертація між MIME та UTI виконується через UTType.preferredMIMEType
  • Визначення MIME можливе за розширенням файлу, вмістом (magic bytes) або HTTP-заголовком
  • iOS Sandbox обмежує доступ до файлів невідомих типів — важливо коректно реєструвати кастомні типи

Що таке тип MIME?

Тип MIME (Multipurpose Internet Mail Extensions) — це стандартизований ідентифікатор формату даних, що складається з двох частин: основного типу (type) та підтипу (subtype), розділених косою рискою. Основні категорії: text (текст), image (зображення), audio (аудіо), video (відео), application (бінарні дані), multipart (складені повідомлення).

Стандарт MIME спочатку був розроблений для вкладень електронної пошти (RFC 2046, 1996), але сьогодні використовується повсюдно: HTTP-сервери вказують Content-Type відповіді, браузери визначають, як обробляти файли, а мобільні додатки — які дані можна відкрити. IANA (Internet Assigned Numbers Authority) веде реєстр зареєстрованих MIME-типів.

За даними IANA Media Types Registry (2024), зареєстровано понад 1800 офіційних MIME-типів, а реальна кількість з урахуванням кастомних та вендорських типів перевищує 5000. iOS підтримує більшість стандартних типів і надає API для роботи з ними через Uniform Type Identifiers.

MIME та UTI в iOS: відмінності та конвертація

UTI (Uniform Type Identifier) — це власна система ідентифікації типів вмісту Apple, що використовується всередині iOS та macOS. На відміну від MIME, UTI підтримує ієрархію успадкування (наприклад, public.image є батьком для public.png та public.jpeg) і включає не лише файлові формати, але й абстрактні типи даних.

Тип MIMEUTIРозширенняОпис
image/jpegpublic.jpeg.jpg, .jpegЗображення JPEG
application/pdfcom.adobe.pdf.pdfPDF документ
text/plainpublic.plain-text.txtТекстовий файл
application/jsonpublic.json.jsonДані JSON
video/mp4public.mpeg-4.mp4Відео MP4

Конвертація між MIME та UTI в iOS виконується через клас UTType (iOS 14+). Система веде внутрішню базу відповідностей, яка покриває більшість стандартних форматів. Для кастомних типів розробник реєструє відповідність в Info.plist.

swift
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("MIME для PDF: \(mime)")
}

Ієрархія UTI дозволяє перевіряти, чи відповідає тип певній категорії. Наприклад, усі типи зображень (JPEG, PNG, GIF) conform(to: .image). Це зручно для групового фільтрування та визначення можливості обробки типу системними компонентами.

Важлива відмінність: MIME — це пласка класифікація (без успадкування), тоді як UTI підтримує множинне успадкування. Наприклад, public.html відповідає і public.source-code, і public.text. Це забезпечує більш гнучку маршрутизацію при обробці файлів в iOS.

Як визначити тип MIME файлу в iOS

Три методи визначення типу MIME доступні в iOS: за розширенням файлу (швидко, але ненадійно), за вмістом через magic bytes (надійно, але потребує читання файлу) та за HTTP-заголовком Content-Type (тільки для мережевих запитів).

swift
import UniformTypeIdentifiers

enum MIMEDetector {
    // Визначити за розширенням
    static func fromExtension(_ ext: String) -> String? {
        UTType(filenameExtension: ext)?.preferredMIMEType
    }

    // Визначити за вмістом (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
    }
}

Визначення за розширенням через UTType — найшвидший метод, але він ненадійний, якщо розширення відсутнє або підроблене. Зловмисник може перейменувати .exe на .jpg — система визначить image/jpeg, хоча файл є виконуваним. Для критичних сценаріїв (безпека, медичні дані) обов'язково використовуйте перевірку за вмістом.

Magic bytes — це перші байти файлу, унікальні для кожного формату. Більшість форматів мають сигнатуру з 2–12 байтів. iOS не надає вбудованого детектора MIME за вмістом — розробник або реалізує таблицю сигнатур самостійно, або використовує бібліотеки типу CocoaLumberjack або кастомний детектор на основі евристик.

Реєстрація кастомних типів MIME та UTI

Кастомні типи необхідні, коли додаток працює з пропрієтарними форматами даних, не зареєстрованими в IANA або Apple. Реєстрація в Info.plist дозволяє iOS коректно обробляти такі файли: відкривати їх з Files.app, відображати іконки та передавати іншим додаткам через 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>

Для реєстрації кастомного типу необхідно вказати в Info.plist: ідентифікатор UTI (у форматі reverse-DNS), відповідність батьківським типам, розширення файлу та MIME-тип. iOS використовує цю інформацію для маршрутизації файлів: коли користувач відкриває файл .sdoc, система знає, що його власник — ваш додаток.

UTExportedTypeDeclarations — для типів, що визначаються вашим додатком (експорт). UTImportedTypeDeclarations — для типів, створених іншими додатками, з якими ваш додаток може працювати (імпорт). Apple рекомендує реєструвати всі кастомні типи, з якими працює додаток, для коректної інтеграції з системою.

Безпека та обробка невідомих типів

Невідомі типи MIME становлять ризик для безпеки iOS-додатка. Якщо файл має невідомий або неперевірений тип, додаток повинен вжити заходів обережності: не відкривати файл автоматично, показувати попередження користувачеві або аналізувати вміст перед обробкою.

Основні загрози: файл із підробленим MIME-типом може містити шкідливий код або експлойт для вразливості парсера. iOS захищає систему через Sandbox, але додаток може бути вразливим, якщо довіряє MIME-типу без перевірки вмісту. Завжди перевіряйте файл за magic bytes, якщо він отриманий з ненадійного джерела.

За даними OWASP Mobile Security Guide, 2024, для обробки файлів невідомих типів застосовуються такі практики: відхиляти файли з MIME-типом application/octet-stream із неперевірених джерел; використовувати UTType для перевірки відповідності очікуваним категоріям; не відкривати файли в зовнішніх додатках без підтвердження користувача; логувати всі випадки невідповідності MIME та фактичного вмісту для аудиту безпеки.

Реєстрація кастомних MIME-типів в Info.plist — це не лише функціональність, але й безпека. Якщо додаток коректно реєструє лише свої типи, система не помилково передаватиме йому чужі файли. Використовуйте специфічні вендорські префікси (application/vnd.company.app-format) замість загальних (application/x-format), щоб уникнути конфліктів з іншими додатками.

Часто задавані питання

Що таке тип MIME?

Тип MIME — це стандартний ідентифікатор формату даних, що складається з типу та підтипу (наприклад, image/jpeg). Він використовується HTTP-серверами, браузерами та додатками для визначення способу обробки файлу.

Чим UTI відрізняється від MIME в iOS?

UTI (Uniform Type Identifier) — система Apple для ідентифікації типів вмісту з підтримкою ієрархії успадкування. MIME — плаский стандарт для мережі. iOS використовує UTType для конвертації між UTI та MIME через властивість preferredMIMEType.

Як визначити тип MIME файлу в iOS?

Три способи: за розширенням через UTType(filenameExtension:), за вмістом через magic bytes (перші байти файлу), за HTTP-заголовком Content-Type. Для безпеки використовуйте перевірку за вмістом, а не лише за розширенням.

Як зареєструвати кастомний тип MIME в iOS?

Додайте UTExportedTypeDeclarations до Info.plist: вкажіть UTI-ідентифікатор (com.company.format), розширення файлу, MIME-тип та батьківський тип. Файли з цим розширенням будуть автоматично асоціюватися з вашим додатком.

Що робити з невідомими типами MIME?

Не довіряйте невідомому MIME. Перевірте вміст за magic bytes, покажіть попередження користувачеві та не відкривайте файл автоматично. Для файлів типу application/octet-stream завжди виконуйте евристичний аналіз перед обробкою.

Підсумки

  • Тип MIME — стандартизований ідентифікатор формату даних (тип/підтип), що використовується в HTTP та iOS
  • UTType — iOS API для роботи з типами вмісту, що підтримує ієрархію та конвертацію MIME→UTI
  • Визначення типу виконується за розширенням, magic bytes або HTTP-заголовком Content-Type
  • Кастомні типи реєструються в Info.plist через UTExportedTypeDeclarations
  • Безпека потребує перевірки вмісту — MIME із заголовка може бути підроблений
  • Ієрархія UTI дозволяє перевіряти категорію файлу (зображення, текст, відео) через conforms(to:)
  • Application/octet-stream — універсальний тип для невідомих бінарних даних, потребує евристичного аналізу

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також