نوع MIME — ما هو، أنواع الملفات والتحديد في iOS

المؤلف: IT Sectr نُشر: 2026-07-11 وقت القراءة: 7 دق

نوع MIME هو معرف موحد لتنسيق البيانات يُستخدم في iOS لتحديد نوع الملف عند النقل عبر الشبكة، ونظام الملفات، والتواصل بين العمليات. وفقًا لـ توثيق Apple للمطورين، 2024، نوع MIME (Multipurpose Internet Mail Extensions) يصنف الملفات حسب محتواها: image/jpeg، application/pdf، text/plain. يحول iOS نوع MIME إلى UTI (معرف النوع الموحد) عبر UTType لمعالجة ملفات النظام.

النقاط الرئيسية

  • نوع MIME — معرف تنسيق بيانات من جزأين: النوع/النوع الفرعي (image/png)
  • UTType — نظير iOS لـ MIME، يُستخدم داخليًا لتحديد أنواع الملفات
  • التحويل بين MIME وUTI يتم عبر UTType.preferredMIMEType
  • تحديد MIME ممكن بواسطة امتداد الملف، المحتوى (البتات السحرية) أو رأس HTTP
  • iOS Sandbox يقيد الوصول إلى الملفات من الأنواع غير المعروفة — من المهم تسجيل الأنواع المخصصة بشكل صحيح

ما هو نوع MIME؟

نوع 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 معظم الأنواع القياسية ويوفر واجهات برمجة تطبيقات للعمل معها من خلال معرفات النوع الموحدة.

MIME وUTI في iOS: الاختلافات والتحويل

UTI (معرف النوع الموحد) هو نظام Apple الخاص لتحديد أنواع المحتوى المستخدم داخل iOS وmacOS. على عكس MIME، يدعم UTI تسلسلاً هرميًا للوراثة (على سبيل المثال، public.image هو الأصل لكل من public.png وpublic.jpeg) ولا يشمل تنسيقات الملفات فحسب بل يشمل أيضًا أنواع البيانات المجردة.

نوع MIMEUTIالامتدادالوصف
image/jpegpublic.jpeg.jpg, .jpegصورة JPEG
application/pdfcom.adobe.pdf.pdfمستند PDF
text/plainpublic.plain-text.txtملف نصي
application/jsonpublic.json.jsonبيانات JSON
video/mp4public.mpeg-4.mp4فيديو MP4

التحويل بين 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("يتوافق مع الصورة: \(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

ثلاث طرق لتحديد نوع MIME متوفرة في iOS: بواسطة امتداد الملف (سريع ولكن غير موثوق)، بواسطة المحتوى عبر البتات السحرية (موثوق ولكنه يتطلب قراءة الملف)، وبواسطة رأس HTTP Content-Type (فقط لطلبات الشبكة).

swift
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 أو كاشف مخصص يعتمد على الاستدلال.

تسجيل أنواع 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 دون التحقق من المحتوى. تحقق دائمًا من الملفات بواسطة البتات السحرية إذا كانت من مصدر غير موثوق.

وفقًا لـ دليل أمان الأجهزة المحمولة OWASP، 2024، تُطبق الممارسات التالية لمعالجة الملفات من الأنواع غير المعروفة: رفض الملفات بنوع MIME application/octet-stream من مصادر غير موثوقة؛ استخدام UTType للتحقق من الامتثال للفئات المتوقعة؛ عدم فتح الملفات في التطبيقات الخارجية دون تأكيد المستخدم؛ تسجيل جميع حالات عدم التطابق بين MIME والمحتوى الفعلي لتدقيق الأمان.

تسجيل أنواع MIME المخصصة في Info.plist ليس فقط وظيفيًا بل وأمنيًا أيضًا. إذا سجل التطبيق أنواعه الخاصة فقط بشكل صحيح، لن يقوم النظام بتمرير الملفات الأخرى إليه عن طريق الخطأ. استخدم بادئات بائع محددة (application/vnd.company.app-format) بدلاً من البادئات العامة (application/x-format) لتجنب التعارض مع التطبيقات الأخرى.

الأسئلة الشائعة

ما هو نوع MIME؟

نوع MIME هو معرف معياري لتنسيق البيانات يتكون من نوع ونوع فرعي (مثل image/jpeg). يُستخدم بواسطة خوادم HTTP والمتصفحات والتطبيقات لتحديد كيفية معالجة الملف.

كيف يختلف UTI عن MIME في iOS؟

UTI (معرف النوع الموحد) هو نظام Apple لتحديد أنواع المحتوى مع دعم للتسلسل الهرمي للوراثة. MIME هو معيار مسطح للشبكة. يستخدم iOS UTType للتحويل بين UTI وMIME عبر الخاصية preferredMIMEType.

كيفية تحديد نوع MIME لملف في iOS؟

ثلاث طرق: بالامتداد عبر UTType(filenameExtension:)، بالمحتوى عبر البتات السحرية (أول بتات من الملف)، برأس HTTP Content-Type. للأمان، استخدم التحقق القائم على المحتوى بدلاً من الامتداد فقط.

كيفية تسجيل نوع MIME مخصص في iOS؟

أضف UTExportedTypeDeclarations إلى Info.plist: حدد معرف UTI (com.company.format)، وامتداد الملف، ونوع MIME، والنوع الأصل. سيتم ربط الملفات بهذا الامتداد تلقائيًا بتطبيقك.

ماذا تفعل مع أنواع MIME غير المعروفة؟

لا تثق في MIME غير معروف. تحقق من المحتوى بواسطة البتات السحرية، وأظهر تحذيرًا للمستخدم، ولا تفتح الملف تلقائيًا. للملفات من نوع application/octet-stream، قم دائمًا بإجراء تحليل استدلالي قبل المعالجة.

الخلاصة

  • نوع MIME — معرف موحد لتنسيق البيانات (نوع/نوع فرعي) يُستخدم في HTTP وiOS
  • UTType — واجهة برمجة تطبيقات iOS للعمل مع أنواع المحتوى، تدعم التسلسل الهرمي والتحويل MIME→UTI
  • تحديد النوع يتم بواسطة الامتداد، البتات السحرية أو رأس HTTP Content-Type
  • الأنواع المخصصة تُسجل في Info.plist عبر UTExportedTypeDeclarations
  • الأمان يتطلب التحقق من المحتوى — MIME من الرأس قد يكون مزيفًا
  • التسلسل الهرمي لـ UTI يسمح بالتحقق من فئة الملف (صورة، نص، فيديو) عبر conforms(to:)
  • Application/octet-stream — نوع عالمي للبيانات الثنائية غير المعروفة، يتطلب تحليلاً استدلاليًا

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا