MIME Type — что это, типы файлов и определение в iOS

Автор: IT Sectr Опубликовано: 2026-07-11 Время чтения: 7 мин

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

Главное

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

Что такое MIME Type?

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

Стандарт MIME изначально разработан для email-вложений (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) и включает не только файловые форматы, но и абстрактные типы данных.

MIME TypeUTIРасширениеОписание
image/jpegpublic.jpeg.jpg, .jpegJPEG изображение
application/pdfcom.adobe.pdf.pdfPDF документ
text/plainpublic.plain-text.txtТекстовый файл
application/jsonpublic.json.jsonJSON данные
video/mp4public.mpeg-4.mp4MP4 видео

Конвертация между 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("Conforms to image: \(uti.conforms(to: .image))")
    print("Extension: \(uti.preferredFilenameExtension ?? "")")
}

// Reverse conversion: UTI to MIME
if let uti = UTType(filenameExtension: "pdf"),
   let mime = uti.preferredMIMEType {
    print("MIME for PDF: \(mime)")
}

Иерархия UTI позволяет проверять, соответствует ли тип определённой категории. Например, все типы изображений (JPEG, PNG, GIF) conforms(to: .image). Это удобно для групповой фильтрации и определения возможности обработки типа системными компонентами.

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

Как определить MIME Type файла в iOS

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

swift
import UniformTypeIdentifiers

enum MIMEDetector {
    // Detect by extension
    static func fromExtension(_ ext: String) -> String? {
        UTType(filenameExtension: ext)?.preferredMIMEType
    }

    // Detect by content (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-типы registration в Info.plist — это не только функциональность, но и безопасность. Если приложение корректно регистрирует только свои типы, система не будет ошибочно передавать ему чужие файлы. Используйте специфичные вендорские префиксы (application/vnd.company.app-format) вместо общих (application/x-format), чтобы избежать конфликтов с другими приложениями.

Часто задаваемые вопросы

Что такое MIME Type?

MIME Type — это стандартный идентификатор формата данных, состоящий из типа и подтипа (например, image/jpeg). Он используется HTTP-серверами, браузерами и приложениями для определения способа обработки файла.

Чем UTI отличается от MIME в iOS?

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

Как определить MIME Type файла в 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 Type — стандартизированный идентификатор формата данных (тип/подтип), используемый в 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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