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 (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.
UTI (Uniform Type Identifier) — это собственная система идентификации типов контента Apple, используемая внутри iOS и macOS. В отличие от MIME, UTI поддерживает иерархию наследования (например, public.image — родитель для public.png и public.jpeg) и включает не только файловые форматы, но и абстрактные типы данных.
| MIME Type | UTI | Расширение | Описание |
|---|---|---|---|
| image/jpeg | public.jpeg | .jpg, .jpeg | JPEG изображение |
| application/pdf | com.adobe.pdf | PDF документ | |
| text/plain | public.plain-text | .txt | Текстовый файл |
| application/json | public.json | .json | JSON данные |
| video/mp4 | public.mpeg-4 | .mp4 | MP4 видео |
Конвертация между MIME и UTI в iOS выполняется через класс UTType (iOS 14+). Система ведёт внутреннюю базу соответствий, которая покрывает большинство стандартных форматов. Для кастомных типов разработчик регистрирует соответствие в 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 ?? "")")
}
// 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: по расширению файла (быстро, но ненадёжно), по содержимому через magic bytes (надёжно, но требует чтения файла) и по HTTP-заголовку Content-Type (только для сетевых запросов).
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 или кастомный детектор на основе эвристик.
Кастомные типы необходимы, когда приложение работает с проприетарными форматами данных, не зарегистрированными в IANA или Apple. Регистрация в Info.plist позволяет iOS корректно обрабатывать такие файлы: открывать их из Files.app, отображать иконки и передавать другим приложениям через 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>
Для регистрации кастомного типа необходимо указать в 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 — это стандартный идентификатор формата данных, состоящий из типа и подтипа (например, image/jpeg). Он используется HTTP-серверами, браузерами и приложениями для определения способа обработки файла.
UTI (Uniform Type Identifier) — система Apple для идентификации типов контента с поддержкой иерархии наследования. MIME — плоский стандарт для сети. iOS использует UTType для конвертации между UTI и MIME через свойство preferredMIMEType.
Три способа: по расширению через UTType(filenameExtension:), по содержимому через magic bytes (первые байты файла), по HTTP-заголовку Content-Type. Для безопасности используйте проверку по содержимому, а не только по расширению.
Добавьте UTExportedTypeDeclarations в Info.plist: укажите UTI-идентификатор (com.company.format), расширение файла, MIME-тип и родительский тип. Файлы с этим расширением будут автоматически ассоциироваться с вашим приложением.
Не доверяйте неизвестному MIME. Проверьте содержимое по magic bytes, покажите предупреждение пользователю и не открывайте файл автоматически. Для файлов типа application/octet-stream всегда выполняйте эвристический анализ перед обработкой.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также