نوع MIME هو معرف موحد لتنسيق البيانات يُستخدم في iOS لتحديد نوع الملف عند النقل عبر الشبكة، ونظام الملفات، والتواصل بين العمليات. وفقًا لـ توثيق Apple للمطورين، 2024، نوع MIME (Multipurpose Internet Mail Extensions) يصنف الملفات حسب محتواها: image/jpeg، application/pdf، text/plain. يحول iOS نوع MIME إلى UTI (معرف النوع الموحد) عبر UTType لمعالجة ملفات النظام.
النقاط الرئيسية
نوع MIME (Multipurpose Internet Mail Extensions) هو معرف موحد لتنسيق البيانات يتكون من جزأين: نوع رئيسي (type) ونوع فرعي (subtype)، مفصولين بشرطة مائلة. الفئات الرئيسية: text (نص)، image (صور)، audio (صوت)، video (فيديو)، application (بيانات ثنائية)، multipart (رسائل مركبة).
تم تطوير معيار MIME في الأصل لمرفقات البريد الإلكتروني (RFC 2046، 1996)، ولكنه اليوم يُستخدم في كل مكان: خوادم HTTP تحدد Content-Type للاستجابات، المتصفحات تحدد كيفية معالجة الملفات، والتطبيقات المحمولة تحدد أي البيانات يمكن فتحها. تحتفظ IANA (هيئة أرقام الإنترنت المخصصة) بسجل لأنواع MIME المسجلة.
وفقًا لـ سجل أنواع الوسائط IANA (2024)، هناك أكثر من 1800 نوع MIME رسمي مسجل، والعدد الفعلي بما في ذلك الأنواع المخصصة وأنواع البائعين يتجاوز 5000. يدعم iOS معظم الأنواع القياسية ويوفر واجهات برمجة تطبيقات للعمل معها من خلال معرفات النوع الموحدة.
UTI (معرف النوع الموحد) هو نظام Apple الخاص لتحديد أنواع المحتوى المستخدم داخل iOS وmacOS. على عكس MIME، يدعم UTI تسلسلاً هرميًا للوراثة (على سبيل المثال، public.image هو الأصل لكل من public.png وpublic.jpeg) ولا يشمل تنسيقات الملفات فحسب بل يشمل أيضًا أنواع البيانات المجردة.
| نوع MIME | 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("يتوافق مع الصورة: \(uti.conforms(to: .image))")
print("الامتداد: \(uti.preferredFilenameExtension ?? "")")
}
// التحويل العكسي: UTI إلى MIME
if let uti = UTType(filenameExtension: "pdf"),
let mime = uti.preferredMIMEType {
print("MIME لـ PDF: \(mime)")
}
التسلسل الهرمي لـ UTI يسمح بالتحقق مما إذا كان النوع يتوافق مع فئة معينة. على سبيل المثال، جميع أنواع الصور (JPEG، PNG، GIF) conform(to: .image). هذا مناسب لتصفية المجموعات وتحديد ما إذا كان النوع يمكن معالجته بواسطة مكونات النظام.
الفرق المهم: MIME هو تصنيف مسطح (بدون وراثة)، بينما يدعم UTI الوراثة المتعددة. على سبيل المثال، public.html يتوافق مع كل من public.source-code وpublic.text. وهذا يوفر توجيهًا أكثر مرونة عند معالجة الملفات في iOS.
ثلاث طرق لتحديد نوع MIME متوفرة في iOS: بواسطة امتداد الملف (سريع ولكن غير موثوق)، بواسطة المحتوى عبر البتات السحرية (موثوق ولكنه يتطلب قراءة الملف)، وبواسطة رأس HTTP Content-Type (فقط لطلبات الشبكة).
import UniformTypeIdentifiers
enum MIMEDetector {
// الكشف بالامتداد
static func fromExtension(_ ext: String) -> String? {
UTType(filenameExtension: ext)?.preferredMIMEType
}
// الكشف بالمحتوى (البتات السحرية)
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 على الرغم من أن الملف قابل للتنفيذ. للسيناريوهات الحرجة (الأمان، البيانات الطبية)، استخدم دائمًا التحقق القائم على المحتوى.
البتات السحرية هي أول بتات من الملف، فريدة لكل تنسيق. معظم التنسيقات لها توقيع من 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 دون التحقق من المحتوى. تحقق دائمًا من الملفات بواسطة البتات السحرية إذا كانت من مصدر غير موثوق.
وفقًا لـ دليل أمان الأجهزة المحمولة OWASP، 2024، تُطبق الممارسات التالية لمعالجة الملفات من الأنواع غير المعروفة: رفض الملفات بنوع MIME application/octet-stream من مصادر غير موثوقة؛ استخدام UTType للتحقق من الامتثال للفئات المتوقعة؛ عدم فتح الملفات في التطبيقات الخارجية دون تأكيد المستخدم؛ تسجيل جميع حالات عدم التطابق بين MIME والمحتوى الفعلي لتدقيق الأمان.
تسجيل أنواع MIME المخصصة في Info.plist ليس فقط وظيفيًا بل وأمنيًا أيضًا. إذا سجل التطبيق أنواعه الخاصة فقط بشكل صحيح، لن يقوم النظام بتمرير الملفات الأخرى إليه عن طريق الخطأ. استخدم بادئات بائع محددة (application/vnd.company.app-format) بدلاً من البادئات العامة (application/x-format) لتجنب التعارض مع التطبيقات الأخرى.
الأسئلة الشائعة
نوع MIME هو معرف معياري لتنسيق البيانات يتكون من نوع ونوع فرعي (مثل image/jpeg). يُستخدم بواسطة خوادم HTTP والمتصفحات والتطبيقات لتحديد كيفية معالجة الملف.
UTI (معرف النوع الموحد) هو نظام Apple لتحديد أنواع المحتوى مع دعم للتسلسل الهرمي للوراثة. MIME هو معيار مسطح للشبكة. يستخدم iOS UTType للتحويل بين UTI وMIME عبر الخاصية preferredMIMEType.
ثلاث طرق: بالامتداد عبر UTType(filenameExtension:)، بالمحتوى عبر البتات السحرية (أول بتات من الملف)، برأس HTTP Content-Type. للأمان، استخدم التحقق القائم على المحتوى بدلاً من الامتداد فقط.
أضف UTExportedTypeDeclarations إلى Info.plist: حدد معرف UTI (com.company.format)، وامتداد الملف، ونوع MIME، والنوع الأصل. سيتم ربط الملفات بهذا الامتداد تلقائيًا بتطبيقك.
لا تثق في MIME غير معروف. تحقق من المحتوى بواسطة البتات السحرية، وأظهر تحذيرًا للمستخدم، ولا تفتح الملف تلقائيًا. للملفات من نوع application/octet-stream، قم دائمًا بإجراء تحليل استدلالي قبل المعالجة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا