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 първоначално е разработен за имейл прикачени файлове (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 ?? "")")
}
// Обратно конвертиране: UTI към 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 {
// Откриване по разширение
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 или потребителски детектор, базиран на евристики.
Потребителски типове са необходими, когато приложението работи с патентовани формати данни, които не са регистрирани в 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 типове в 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също