Photo Editing Extension هي آلية iOS تسمح للتطبيقات الخارجية بإضافة أدوات تحرير مباشرة في تطبيق الصور الأساسي. وخلافًا للمحررات الكاملة، لا تقوم الإضافة بتحميل الصورة إلى تطبيق منفصل — يقوم المستخدم بتطبيق المرشحات وتصحيح الألوان وإضافة التأثيرات دون مغادرة الواجهة القياسية. وفقًا لوثائق مطوري Apple (2025)، يوفر PhotoKit أكثر من 40 API للعمل مع موارد الصور، بما في ذلك PHAdjustmentData و PHContentEditingController.
النقاط الرئيسية
Photo Editing Extension هي نوع من إضافات التطبيقات في iOS تقوم بدمج أدوات معالجة الصور في الواجهة القياسية لتطبيق الصور. يفتح المستخدم صورةً، يضغط على زر تحرير ويختار الإضافة المطلوبة من قائمة الإضافات المثبتة. بعد التحرير، يتم حفظ النتيجة في المكتبة، ويبقى الملف الأصلي متاحًا للاستعادة.
تحل هذه البنية مشكلة رئيسية في تجربة المستخدم: لا حاجة للتبديل بين التطبيقات أو تصدير واستيراد الصور أو تتبع الإصدارات. وفقًا لمؤتمر WWDC 2025، تعمل جميع الإضافات في عملية معزولة بصندوق الرمل الخاص بها ووقت تنفيذ محدود — تصلي إلى 30 ثانية لكل عملية تحرير.
لا تملك الإضافة وصولًا إلى الملفات العشوائية في ذاكرة الجهاز — فقط إلى الصورة التي قام المستخدم بتمريرها صراحةً من خلال واجهة الاختيار. يضمن ذلك أمان بيانات المستخدم عند استخدام أدوات الطرف الثالث.
PhotoKit هو إطار عمل Apple للعمل مع مكتبة الوسائط المتعددة للجهاز، ظهر في iOS 8. يوفر وصولًا برمجيًا إلى موارد الصور، بما في ذلك الصور والفيديو والألبومات والبيانات الوصفية. بالنسبة لإضافات التحرير، يعمل PhotoKit كطبقة وسيطة بين التخزين وواجهة التعديل.
PHAsset يمثل كائنًا وسائطيًا فرديًا في المكتبة — صورة أو فيديو. من خلال PHAsset، يمكن الحصول على البيانات الوصفية: تاريخ الالتقاط، نوع الملف، الموقع على الخريطة واتجاه الكاميرا. يوفر PHAssetResource وصولًا إلى الموارد الأساسية — على سبيل المثال، إلى ملف الصورة الأصلي بتنسيق RAW أو HEIC.
بالنسبة لإضافة التحرير، يعد PHContentEditingInput أمرًا بالغ الأهمية — كائن يحتوي على ملف الصورة (أو الفيديو) الكامل المتاح للقراءة والمعالجة. تتلقى الإضافة هذا الكائن عند التنشيط وتستخدمه كمادة أصلية.
PHImageManager يدير تحميل وتخزين الصور مؤقتًا. بالنسبة لإضافة التحرير، لا يتم استخدامه مباشرةً — تتلقى الإضافة الملف الكامل عبر PHContentEditingInput. ومع ذلك، يسمح PHImageRequestOptions بتكوين معلمات الطلب: الحجم، نوع التسليم (متزامن أو غير متزامن) وتنسيق النتيجة.
وفقًا لشركة Apple، يقوم PHImageManager بتخزين الصور المصغرة تلقائيًا في الذاكرة المؤقتة (RAM)، مما يسرع عرض المعاينة المتكرر. لإضافات التحرير، يوصى باستخدام PHImageRequestOptionsDeliveryModeHighQualityFormat للحصول على أفضل جودة صورة.
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// use image for display
}
تقوم كل Photo Editing Extension بتطبيق بروتوكول PHContentEditingController — عنصر التحكم المركزي في الإضافة. يحدد البروتوكول طرقًا لعرض الواجهة واستقبال بيانات الإدخال وحفظ النتيجة.
beginContentEditing(with:) يتم استدعاؤه عند بدء جلسة التحرير. تتلقى الإضافة PHContentEditingInput ويجب أن تعرض الواجهة مع الصورة الأصلية. finishContentEditing(completionHandler:) ينهي التحرير — تعيد الإضافة PHContentEditingOutput مع الملف المعدل و AdjustmentData. cancelContentEditing() يلغي التغييرات دون حفظ.
فارق دقيق: في لحظة استدعاء beginContentEditing، تحصل الإضافة على وصول فقط إلى نسخة واحدة من الصورة — تلك التي طلبها المستخدم. لا يمكن الوصول إلى صورة أخرى أو ألبوم. هذا قيد صندوق الرمل الذي فرضته Apple للأمان.
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController يفصل واجهة التحرير عن منطق الحفظ. تقوم عملية iOS الرئيسية باستدعاء beginContentEditing، تعرض الإضافة واجهة المستخدم الخاصة بها، يقوم المستخدم بإجراء التغييرات، ثم يقوم finishContentEditing بإنشاء ملف جديد. توصي Apple بتنفيذ جميع المعالجات المستهلكة للموارد — مرشحات CIFilter، معالجات Core Image — في خيط خلفي، وليس في الخيط الرئيسي، لتجنب حجب الواجهة.
PHAdjustmentData هو الآلية الرئيسية التي تمكن التحرير غير المدمر في Photo Editing Extension. هو كائن يحتوي على معلومات حول التغييرات المطبقة بتنسيق تعسفي. تقوم الإضافة بتسلسل معلمات المرشحات والأقنعة والإعدادات في AdjustmentData وتحفظها مع الصورة المعدلة.
عند إعادة فتح الصورة، تقرأ الإضافة AdjustmentData، تستعيد حالة الواجهة السابقة وتسمح للمستخدم بمواصلة التحرير من نفس النقطة. إذا لم تكن الإضافة مثبتة، تظهر الصورة بآخر نسخة محفوظة، ويتم تخزين الأصل بشكل منفصل.
وفقًا لوثائق Apple، يخزن PHAdjustmentData formatIdentifier و formatVersion — سلسل لتحديد تنسيق البيانات. عند تحديث الإضافة، يجب التحقق من الإصدار ومعالجة التنسيقات القديمة بشكل صحيح.
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
في لحظة finishContentEditing، تكتب الإضافة AdjustmentData في كائن PHContentEditingOutput مع ملف الصورة المعدل. ثم تقوم النظام بحفظ كلا المكونين: النسخة للعرض والبيانات الوصفية لاستعادة جلسة التحرير.
تظهر Photo Editing Extension تلقائيًا في قائمة تطبيق الصور بعد تثبيت التطبيق الحاوي لها. يفتح المستخدم صورةً، يختار تحرير، وفي الصف السفلي للأدوات تظهر جميع إضافات التحرير المثبتة — النظامية والخارجية على حد سواء.
تتم تسجيل الإضافة عبر Info.plist للتطبيق الرئيسي بمفتاح NSExtensionActivationRule، الذي يحدد أنواع المحتوى التي تنشط الإضافة. لمحرر الصور، يتطلب ActivationRule عادةً image — لن تظهر الإضافة للفيديو أو الصور الحية.
توصي Apple بتحديد أنواع التنشيط المحددة لتجنب إثقال قائمة التحرير. إذا كانت الإضافة تدعم JPEG و HEIC فقط، فمن الأفضل تقييد التنشيط بهذه التنسيقات.
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
بعد اختيار الإضافة، يقوم iOS بإنشاء عملية منفصلة مع UIViewController مخصص يظهر فوق واجهة الصور. يرى المستخدم صورته وأدوات الإضافة وزري إلغاء/تم. لا يمكن للإضافة تغيير التنقل خارج متحكمها أو الوصول إلى أجزاء أخرى من النظام.
وفقًا لإرشادات واجهة المستخدم من Apple، يجب أن تكون واجهة الإضافة بسيطة ووظيفية — بدون إعلانات أو روابط دخيلة أو عناصر تنقل غير ضرورية. يوصى باستخدام UIScrollView لعرض لوحة الأدوات لتجنب ازدحام الشاشة.
الأسئلة الشائعة
تتلقى الإضافة PHContentEditingInput مع رابط ملف الصورة الكامل عبر طريقة beginContentEditing(with:). يتم منح الوصول فقط إلى صورة واحدة مختارة — دون حقوق وصول إلى موارد المكتبة الأخرى.
لا، لا يتم تعديل الأصل أبدًا. تقوم الإضافة بإنشاء نسخة جديدة عبر PHContentEditingOutput، ويخزن AdjustmentData معلمات التغييرات لإمكانية العودة إلى الحالة الأصلية.
تعمل الإضافة مع جميع التنسيقات التي يدعمها PhotoKit: JPEG، HEIC، RAW، PNG، TIFF و Live Photos. تتم تحديد القيود عبر NSExtensionActivationRule في Info.plist للإضافة.
يخصص iOS ما يصل إلى 30 ثانية لعملية finishContentEditing. عند تجاوز الحد، تنتهي الإضافة قسريًا ولا تتم حفظ التغييرات. لا يقوم المعالجة الخلفية بـ CIFilter بتمديد هذا الوقت.
نعم، Core Image (CIFilter) و Metal (للتظليلات المخصصة) مدعومان بالكامل. توصي Apple بتحميل الحسابات الثقيلة على الخيوط الخلفية عبر Grand Central Dispatch.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا