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 първоначално е разработен за имейл прикачени файлове (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 ?? "")")
}

// Обратно конвертиране: 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

Три метода за определяне на MIME Type са налични в 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 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също