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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође