UIDocumentPickerViewController هو واحد تحكم iOS لاختيار المستندات من نظام الملفات، iCloud Drive وتخزين سحابي تابع لجهات ثالثة. يوفر واحد تحكم واجهة موحدة لفتح واستيراد الملفات من أي نوع: الصور، PDF، النصوص والصوت. وفقاً لوثائق مطوري Apple (2025)، يدعم UIDocumentPickerViewController وضعي import و export ويعيد الملفات المحددة كمراجع URL عبر مفوض.
النقاط الرئيسية
UIDocumentPickerViewController هو واحد تحكم UIKit يوفر واجهة نظامية لاختيار المستندات. هو جزء من إطار UIKit ومتاح منذ iOS 8. يعرض واحد تحكم متصفح ملفات يشمل التخزين المحلي، iCloud Drive وخدمات سحابية تابعة لجهات ثالثة مسجلة.
يعمل واحد تحكم بشكل غير متزامن: بعد استدعاء present، يرى المستخدم حوار نظامي، يختار ملفاً، وتعاد النتيجة عبر المفوض. لا تتطلب التطبيق أذونات خاصة للوصول إلى الملف المحدد — يوفر المنتقي النظامي تلقائياً وصولاً مؤقتاً إلى URI.
يدعم UIDocumentPickerViewController iPad عبر UIPopoverPresentationController وواجهة متكيفة لـ iPhone. منذ iOS 14، تلقى واحد تحكم تصميماً محدثاً ودعم تنقل sidebar في iPadOS.
UIDocumentPickerViewController يعمل بوضعين رئيسيين، كل منهما يحدد كيفية وصول التطبيق إلى الملف. يتم تعيين الوضع عبر المعلمة forOpeningContentTypes أو forExporting حسب المهمة.
Import mode (forOpeningContentTypes) ينسخ الملف المحدد إلى صندوق التطبيق. يتلقى التطبيق URL لنسخته الخاصة من الملف، والتي لا يمكن الوصول إليها إلا له. هذا وضع آمن: لا يتم تعديل ملف تطبيق آخر، والنسخة تحت السيطرة الكاملة للتطبيق الحالي.
Export mode (forExporting) يوفر URL للملف الأصلي دون نسخ. يمكن للتطبيق قراءة الملف عبر الرابط، ولكن التغييرات لا تحفظ. يستخدم هذا الوضع عند الحاجة لنقل ملف إلى تطبيق آخر أو إرساله بالبريد. لكتابة التغييرات يستخدم الوضع open مع scoped security-scoped URL.
UTI (Uniform Type Identifier) هو نظام تحديد أنواع المحتوى في بيئة Apple. يقوم UIDocumentPickerViewController بتصفية الملفات المعروضة حسب مصفوفة UTI الممررة عبر forOpeningContentTypes. إذا لم يتم تحديد UTI، يعرض المنتقي جميع أنواع الملفات.
لاختيار عدة أنواع، يتم تمرير مصفوفة [UTType.pdf, UTType.image]. منذ iOS 14، توصي Apple باستخدام UTType بدلاً من ثوابت السلسلة. يقوم UIDocumentPickerViewController بتحديث قائمة الأنواع المعروضة تلقائياً عند تغيير الموفر المحدد.
التنفيذ لـ UIDocumentPickerViewController في Swift هو أدنى الحد: إنشاء مثال من واحد تحكم مع أنواع UTI، تعيين المفوض واستدعاء present. بعد اختيار الملف، يتلقى المفوض مصفوفة من URLs في الطريقة didPickDocumentsAt. كل URL هو مرجع security-scoped يتطلب استدعاء startAccessingSecurityScopedResource.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .image],
asCopy: true
)
picker.delegate = self
picker.allowsMultipleSelection = false
present(picker, animated: true)
// MARK: - UIDocumentPickerDelegate
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
// اقرأ الملف من url
}
يتطلب URL المؤمن استدعاء startAccessingSecurityScopedResource قبل القراءة. يخبر هذا الملف واحد تحكم النظام بأن التطبيق يحصل على وصول مؤقت إلى ملف خارج صندوق التطبيق. بعد الانتهاء، استدع دائماً stopAccessingSecurityScopedResource، وإلا قد يحظر النظام الوصول.
UIDocumentPickerDelegate يتلقى نتائج اختيار الملف عبر طريقتين: didPickDocumentsAt عند النجاح و didPickDocumentsAt عند الإلغاء. iOS تستدعي تلقائياً طريقة الإلغاء إذا أغلق المستخدم المنتقي دون اختيار.
يشمل معالجة الأخطاء التحقق من توفر URL. إذا اختار المستخدم ملفاً من iCloud Drive ولكن الجهاز غير متصل، قد لا يكون URL متاحاً. يوصى بالتحقق من FileManager.default.isReadableFile قبل القراءة وعرض رسالة خطأ واضحة للمستخدم.
لـ iOS 14+، تتوفر طريقة جديدة documentPicker:didPickDocumentsAt مع مصفوفة من URLs. الطريقة القديمة didPickDocumentAt (مفردة) مهملة. تعامل دائماً مع المصفوفة، حتى لو كان تحديد عدة اختيارات معطلاً — توصي Apple باستخدام معالج واحد.
iPad يتطلب تكويناً خاصاً لـ UIDocumentPickerViewController. على iPad، يتم عرض المنتقي كـ popover، ويحتاج إلى تحديد sourceView للوضع الصحيح. بدون sourceView، قد يتعطل واحد تحكم باستثناء على iPadOS.
للتنبيقة المنبثقة، يتم استخدام الخاصية popoverPresentationController. حدد sourceView و sourceRect لربطه بزر أو خلية جدول. على iPhone، ليس لهذا الكود تأثير — iOS يعرض المنتقي بشكل كامل الشاشة تلقائياً. منذ iPadOS 16، يدعم واحد تحكم sidebar و split view لتحسين التنقل.
يتبدل التصميم المتكيف لـ UIDocumentPickerViewController تلقائياً بين ملء الشاشة (iPhone) و popover (iPad). لا يحتاج المطور إلى تنفيذ واحدات تحكم منفصلة لأجهزة مختلفة — يكفي تكوين popoverPresentationController بشكل صحيح لـ iPad.
الأسئلة الشائعة
UIDocumentPickerViewController هو واحد تحكم UIKit نظامي لاختيار المستندات من iCloud Drive، التخزين المحلي وخدمات سحابية تابعة لجهات ثالثة. يعيد واحد تحكم URL الملف المحدد عبر المفوض.
أنشئ واحد تحكم بـ forOpeningContentTypes: [.pdf]. سيحد هذا من عرض ملفات PDF فقط. عين المفوض واستدع present لعرض المنتقي النظامي.
Import mode ينسخ الملف إلى صندوق التطبيق — التغييرات لا تؤثر على الأصل. Export mode يوفر URL للملف الأصلي للقراءة فقط دون نسخ.
URL المؤمن هو مرجع إلى ملف خارج صندوق التطبيق. استدع startAccessingSecurityScopedResource قبل القراءة، و stopAccessingSecurityScopedResource بعد الانتهاء.
قم بتكوين popoverPresentationController بـ sourceView و sourceRect. بدون ذلك، قد يتسبب واحد تحكم في استثناء على iPad. على iPhone، يتم تجاهل إعدادات popover — يظهر المنتقي بملء الشاشة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا