برنامج تعليمي حول ملحقات تطبيقات iOS 8
نشرت: 2022-03-11قليلون قد حاولوا من قبل (ألق نظرة على هذا) ، لكن Apple مع أول iPhone هو الذي حدد كيف يجب أن يبدو الهاتف الذكي ونظام التشغيل المحمول. حققت Apple طفرة لا تصدق في تجربة الأجهزة والمستخدم. ومع ذلك ، غالبًا ما ننسى أنهم وضعوا أيضًا معايير لكيفية عمل نظام تشغيل الهاتف المحمول ، وكيف ينبغي إنشاء تطبيقات الهاتف الذكي.
كان بناء الجدران الخرسانية بين التطبيقات ، وجعلها معزولة تمامًا وغير مدركة لبعضها البعض ، أفضل طريقة للحفاظ عليها آمنة وحماية بياناتها. تمت مراقبة جميع الأنشطة عن كثب بواسطة iOS ، ولم يكن هناك سوى عدد قليل من الإجراءات التي كان يمكن للتطبيق القيام بها خارج نطاقه.
"العفة خير حماية!" - ولكن أين هي المتعة في ذلك؟
استغرق الأمر منهم بعض الوقت. وقت طويل إذا سألتني ، ولكن مع نظام التشغيل iOS 8 ، قررت Apple الاستمتاع ببعض المرح. قدم iOS 8 مفهومًا جديدًا يسمى ملحقات التطبيقات. هذه الميزة الجديدة لم تكسر الجدران بين التطبيقات ، لكنها فتحت بعض الأبواب لتوفير اتصال لطيف وملموس بين بعض التطبيقات. أعطى التحديث الأخير لمطوري iOS خيارًا لتخصيص نظام iOS البيئي ، ونحن حريصون على فتح هذا المسار أيضًا.
ما هي ملحقات تطبيق iOS 8 وكيف تعمل؟
بعبارات بسيطة ، توفر ملحقات تطبيقات iOS 8 طريقة جديدة للتفاعل مع تطبيقك ، دون بدء تشغيله أو عرضه على الشاشة.
كما هو متوقع ، تأكدت Apple من بقائهم على رأس كل شيء ، لذلك لا يوجد سوى عدد قليل من نقاط الدخول الجديدة التي يمكن أن يوفرها تطبيقك:
- اليوم (يُطلق عليه أيضًا عنصر واجهة مستخدم) - يُظهر الامتداد المعروض في عرض اليوم لمركز الإشعارات معلومات موجزة ويسمح بأداء المهام السريعة.
- مشاركة - امتداد يمكّن تطبيقك من مشاركة المحتوى مع المستخدمين على الشبكات الاجتماعية وخدمات المشاركة الأخرى.
- الإجراء - ملحق يسمح بإنشاء أزرار إجراءات مخصصة في ورقة الإجراءات للسماح للمستخدمين بعرض المحتوى الذي تم إنشاؤه في تطبيق مضيف أو تحويله.
- تحرير الصور - امتداد يتيح للمستخدمين تحرير صورة أو مقطع فيديو داخل تطبيق الصور.
- موفر المستندات - امتداد يستخدم للسماح للتطبيقات الأخرى بالوصول إلى المستندات التي يديرها تطبيقك.
- لوحة مفاتيح مخصصة - امتداد يحل محل لوحة مفاتيح النظام.
ملحقات التطبيقات ليست تطبيقات قائمة بذاتها. إنهم يوفرون وظائف موسعة للتطبيق (والتي يمكن الوصول إليها من تطبيقات أخرى ، تسمى تطبيقات المضيف) والتي من المفترض أن تكون فعالة ومركزة على مهمة واحدة. لديهم التوقيع الثنائي الخاص بهم ، وتوقيع الكود الخاص بهم ، ومجموعة العناصر الخاصة بهم ، ولكن يتم تسليمهم عبر متجر التطبيقات كجزء من البرنامج الثنائي المحتوي للتطبيق. يمكن أن يحتوي تطبيق واحد (يحتوي على) على أكثر من امتداد واحد. بمجرد أن يقوم المستخدم بتثبيت تطبيق يحتوي على ملحقات ، ستكون متاحة عبر iOS.
لنلقِ نظرة على مثال: يجد المستخدم صورة باستخدام Safari ، ويضغط على زر المشاركة ويختار امتداد التطبيق الخاص بك للمشاركة. Safari "يتحدث" إلى إطار العمل الاجتماعي لنظام iOS ، والذي يقوم بتحميل الامتداد وعرضه. يعمل رمز الامتداد ويمرر البيانات باستخدام قنوات الاتصال التي تم إنشاء مثيل لها في النظام ، وبمجرد الانتهاء من المهمة - يقوم Safari بتمزيق عرض الامتداد. بعد ذلك بفترة وجيزة ، ينهي النظام العملية ، ولم يتم عرض تطبيقك على الشاشة مطلقًا. ومع ذلك فقد أكملت وظيفة مشاركة الصور.
iOS ، باستخدام الاتصال بين العمليات ، هو المسؤول عن ضمان أن التطبيق المضيف وملحق التطبيق يمكنهما العمل معًا. يستخدم المطورون واجهات برمجة التطبيقات عالية المستوى التي توفرها نقطة الامتداد والنظام ، لذلك لا داعي للقلق بشأن آليات الاتصال الأساسية.
دورة الحياة
ملحقات التطبيقات لها دورة حياة مختلفة عن تطبيقات iOS. يبدأ التطبيق المضيف دورة حياة الامتداد كرد فعل على إجراء المستخدم. ثم يقوم النظام بإنشاء مثيل ملحق التطبيق وإعداد قناة اتصال بينهما. يتم عرض عرض الامتداد في سياق التطبيق المضيف باستخدام العناصر المستلمة في طلب التطبيق المضيف. بمجرد عرض عرض الامتداد ، يمكن للمستخدم التفاعل معها. استجابةً لإجراء المستخدم ، تكمل الإضافة طلب التطبيق المضيف من خلال تنفيذ / إلغاء المهمة فورًا أو ، إذا لزم الأمر ، بدء عملية في الخلفية لتنفيذها. بعد ذلك مباشرة ، يمزق التطبيق المضيف عرض الامتداد ويعود المستخدم إلى سياقه السابق داخل التطبيق المضيف. يمكن إرجاع نتائج تنفيذ هذه العملية إلى التطبيق المضيف بمجرد اكتمال العملية. عادةً ما يتم إنهاء الامتداد بعد فترة وجيزة من إكمال الطلب المستلم من التطبيق المضيف (أو بدء عملية في الخلفية لتنفيذها).
يفتح النظام امتداد إجراء المستخدم من التطبيق المضيف ، ويعرض الملحق واجهة المستخدم ، ويقوم ببعض الأعمال ، ويعيد البيانات إلى التطبيق المضيف (إذا كان ذلك مناسبًا لنوع الامتداد). لا يعمل التطبيق المحتوي حتى أثناء تشغيل ملحقه.
إنشاء ملحق تطبيق - مثال عملي باستخدام إضافة Today
توجد ملحقات Today ، التي تسمى أيضًا عناصر واجهة المستخدم ، في عرض Today لمركز الإشعارات. إنها طريقة رائعة لتقديم محتوى محدث للمستخدم (مثل عرض أحوال الطقس) أو أداء مهام سريعة (مثل وضع علامة على الأشياء التي تم إجراؤها في عنصر واجهة مستخدم لتطبيق قائمة المهام). يجب أن أشير هنا إلى أن إدخال لوحة المفاتيح غير مدعوم .
لنقم بإنشاء ملحق Today الذي سيعرض أحدث المعلومات من تطبيقنا (الكود على GitHub). لتشغيل هذا الرمز ، يرجى التأكد من أنك (أعدت) تكوين مجموعة التطبيقات للمشروع (حدد فريق التطوير الخاص بك ، ضع في اعتبارك أن اسم مجموعة التطبيقات يجب أن يكون فريدًا واتبع تعليمات Xcode).
إنشاء عنصر واجهة مستخدم جديد
كما قلنا من قبل ، ملحقات التطبيقات ليست تطبيقات قائمة بذاتها. نحتاج إلى تطبيق يحتوي على إضافة سنبني عليه امتداد التطبيق. بمجرد أن يكون لدينا التطبيق المحتوي لدينا ، نختار إضافة هدف جديد بالانتقال إلى ملف -> جديد -> الهدف إلى Xcode. من هنا نختار نموذجًا لهدفنا الجديد لإضافة ملحق اليوم.
في الخطوة التالية يمكننا اختيار اسم المنتج الخاص بنا. هذا هو الاسم الذي سيظهر في عرض "اليوم" في مركز الإشعارات. هناك خيار لاختيار اللغة بين Swift و Objective-C في هذه الخطوة أيضًا. بعد الانتهاء من هذه الخطوات ، يقوم Xcode بإنشاء قالب Today ، والذي يوفر رأسًا وملفات تنفيذ افتراضية للفئة الرئيسية (تسمى TodayViewController
) مع ملف Info.plist
وملف واجهة (لوحة عمل أو ملف .xib). ملف Info.plist
، افتراضيًا ، يبدو كما يلي:
<key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>
إذا كنت لا تريد استخدام لوحة العمل التي يوفرها النموذج ، فقم بإزالة مفتاح NSExtensionMainStoryboard
وأضف مفتاح NSExtensionPrincipalClass
باسم وحدة التحكم في العرض كقيمة.
يجب أن تقوم أداة Today بما يلي:
- تأكد من أن المحتوى دائمًا ما يتم تحديثه
- الاستجابة بشكل مناسب لتفاعلات المستخدم
- تعمل بشكل جيد (يجب أن تستخدم أدوات iOS الذاكرة بحكمة وإلا سيتم إنهاؤها بواسطة النظام)
مشاركة البيانات والحاوية المشتركة
يتمتع كل من إضافة التطبيق والتطبيق الذي يحتوي عليه بإمكانية الوصول إلى البيانات المشتركة في الحاوية المشتركة المحددة بشكل خاص - وهي طريقة للاتصال غير المباشر بين التطبيق المحتوي والإضافة.
ألا تحب الطريقة التي تجعل بها Apple هذه الأشياء "بسيطة"؟ :)
تعد مشاركة البيانات من خلال NSUserDefaults
بسيطة وحالة استخدام شائعة. بشكل افتراضي ، يستخدم الامتداد والتطبيق الذي يحتوي عليه مجموعات بيانات NSUserDefaults
منفصلة ، ولا يمكن الوصول إلى حاويات بعضها البعض. لتغيير هذا السلوك ، قدم iOS مجموعات التطبيقات . بعد تمكين مجموعات التطبيقات على التطبيق المحتوي والإضافة ، بدلاً من استخدام [NSUserDefaults standardUserDefaults]
استخدم [[NSUserDefaults alloc] initWithSuiteName:@"group.yourAppGroupName"]
للوصول إلى نفس الحاوية المشتركة.
تحديث القطعة
لضمان تحديث المحتوى دائمًا ، يوفر ملحق Today واجهة برمجة تطبيقات لإدارة حالة عنصر واجهة المستخدم ومعالجة تحديثات المحتوى. يلتقط النظام أحيانًا لقطات من عرض عنصر واجهة المستخدم ، لذلك عندما تصبح الأداة مرئية ، يتم عرض أحدث لقطة حتى يتم استبدالها بنسخة حية من العرض. يعد التوافق مع بروتوكول NCWidgetProviding
مهمًا لتحديث حالة عنصر واجهة المستخدم قبل أخذ لقطة. بمجرد أن يتلقى عنصر واجهة widgetPerformUpdateWithCompletionHandler:
call ، يجب تحديث عرض عنصر واجهة المستخدم بأحدث محتوى ويجب استدعاء معالج الإكمال بأحد الثوابت التالية لوصف نتيجة التحديث:

-
NCUpdateResultNewData
- يتطلب المحتوى الجديد إعادة رسم طريقة العرض -
NCUpdateResultNoDate
- القطعة لا تتطلب التحديث -
NCUpdateResultFailed
- حدث خطأ أثناء عملية التحديث
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered, use NCUpdateResultFailed // If there's no update required, use NCUpdateResultNoData // If there's an update, use NCUpdateResultNewData [self updateTableView]; completionHandler(NCUpdateResultNewData); }
التحكم في وقت عرض الأداة
للتحكم في وقت عرض عنصر واجهة المستخدم ، استخدم طريقة setHasContent:forWidgetWithBundleIdentifier:
من فئة NCWidgetController
. ستتيح لك هذه الطريقة تحديد حالة محتوى الأداة. يمكن استدعاؤه من الأداة أو من التطبيق الذي يحتوي عليه (إذا كان نشطًا). يمكنك تمرير علامة NO
أو YES
إلى هذه الطريقة ، مع تحديد أن محتوى عنصر واجهة المستخدم جاهز أم لا. إذا لم يكن المحتوى جاهزًا ، فلن يعرض iOS عنصر واجهة المستخدم الخاص بك عند فتح عرض اليوم.
NCWidgetController *widgetController = [[NCWidgetController alloc] init]; [widgetController setHasContent:YES forWidgetWithBundleIdentifier:@"com.your-company.your-app.your-widget"];
فتح التطبيق المتضمن من الأداة
تعد أداة Today هي الامتداد الوحيد الذي يمكنه طلب فتح التطبيق المحتوي الخاص به عن طريق استدعاء openURL:completionHandler:
method. لضمان فتح التطبيق المحتوي بطريقة تكون منطقية في سياق مهمة المستخدم الحالية ، يجب تحديد مخطط عنوان URL مخصص (يمكن لكل من الأداة والتطبيق المحتوي استخدامه).
[self.extensionContext openURL:[NSURL URLWithString:@"customURLsheme://URLpath"] completionHandler:nil];
اعتبارات واجهة المستخدم
عند تصميم عنصر واجهة المستخدم الخاص بك ، استفد من فئة UIVisualEffectView
، مع الأخذ في الاعتبار أنه يجب إضافة وجهات النظر التي يجب أن تكون مشوشة / نابضة بالحياة إلى عرض UIVisualEffectView
contentView
. يجب أن تقوم عناصر واجهة المستخدم (المتوافقة مع بروتوكول NCWidgetProviding
) بتحميل الحالات المخزنة مؤقتًا في viewWillAppear:
من أجل مطابقة حالة العرض من العرض الأخير viewWillDisappear:
ثم الانتقال بسلاسة إلى البيانات الجديدة عند وصولها ، وهي ليست حالة ذات عرض عادي وحدة تحكم (يتم إعداد واجهة المستخدم في viewDidLoad
وتتولى الرسوم المتحركة وتحميل البيانات في viewWillAppear
). يجب أن تكون الأدوات المصممة لأداء مهمة ما ، أو فتح التطبيق المحتوي بنقرة واحدة. إدخال لوحة المفاتيح غير متاح داخل عنصر واجهة المستخدم. هذا يعني أنه لا ينبغي استخدام أي واجهة مستخدم تتطلب إدخال نص.
لا يمكن إضافة مخطوطات إلى عنصر واجهة مستخدم ، عموديًا وأفقيًا. أو بشكل أكثر دقة ، من الممكن إضافة عرض تمرير ولكن التمرير لن ينجح. سيتم اعتراض إيماءة التمرير الأفقي في عرض التمرير في ملحق اليوم من قبل مركز الإشعارات مما سيؤدي إلى التمرير من اليوم إلى مركز الإشعارات. ستتم مقاطعة التمرير الرأسي لعرض التمرير داخل ملحق اليوم عن طريق التمرير في عرض اليوم.
الملاحظات الفنية
سأشير هنا إلى بعض الأشياء المهمة التي يجب وضعها في الاعتبار عند إنشاء ملحق التطبيق.
الميزات المشتركة لجميع الملحقات
العناصر التالية صحيحة لجميع الامتدادات:
كائن sharedApplication خارج الحدود : لا يمكن لملحقات التطبيقات الوصول إلى كائن SharedApplication ، أو استخدام أي من الأساليب المتعلقة بهذا الكائن.
الكاميرا والميكروفون خارج الحدود : لا يمكن لملحقات التطبيقات الوصول إلى الكاميرا أو الميكروفون على الجهاز (ولكن هذه ليست حالة لجميع عناصر الأجهزة). هذا نتيجة لعدم توفر بعض واجهات برمجة التطبيقات. للوصول إلى بعض عناصر الأجهزة في ملحق التطبيق ، سيتعين عليك التحقق مما إذا كانت واجهة برمجة التطبيقات متاحة لإضافات التطبيقات أم لا (مع التحقق من توفر واجهة برمجة التطبيقات الموضح أعلاه).
معظم مهام الخلفية محظورة : لا يمكن لإضافات التطبيقات أداء مهام الخلفية طويلة الأمد ، باستثناء بدء التحميلات أو التنزيلات ، وهو ما تمت مناقشته أدناه.
AirDrop خارج الحدود : لا يمكن لملحقات التطبيقات تلقي (ولكن يمكنها إرسال) البيانات باستخدام AirDrop.
التحميل / التنزيل في الخلفية
المهمة الوحيدة التي يمكن أداؤها في الخلفية هي التحميل / التنزيل باستخدام NSURLSession object
.
بعد بدء مهمة التحميل / التنزيل ، يمكن للملحق إكمال طلب التطبيق المضيف وإنهائه دون أي تأثير على نتيجة المهمة. إذا لم يكن الامتداد قيد التشغيل في الوقت الذي تكتمل فيه مهمة الخلفية ، فسيقوم النظام بتشغيل التطبيق المحتوي في الخلفية ويتم استدعاء تطبيق أسلوب التفويض الخاص application:handleEventsForBackgroundURLSession:completionHandler:
يجب أن يحتوي التطبيق الذي تبدأ الإضافة مهمة NSURLSession
في الخلفية على حاوية مشتركة تم إعدادها بحيث يمكن لكل من التطبيق المحتوي وامتداده الوصول.
تأكد من إنشاء جلسات خلفية مختلفة للتطبيق المحتوي ولكل من إضافات التطبيقات الخاصة به (يجب أن يكون لكل جلسة في الخلفية معرّف فريد). هذا مهم لأن عملية واحدة فقط يمكنها استخدام جلسة خلفية في كل مرة.
العمل مقابل المشاركة
الاختلافات بين امتدادات الإجراء والمشاركة ليست واضحة تمامًا من منظور المبرمج ، لأنها من الناحية العملية متشابهة جدًا. يستخدم قالب Xcode لهدف امتداد المشاركة SLComposeServiceViewController
، والذي يوفر واجهة مستخدم عرض تكوين قياسية يمكنك استخدامها للمشاركة الاجتماعية ، ولكنها ليست مطلوبة. يمكن أن يرث امتداد المشاركة مباشرة من UIViewController لتصميم مخصص بالكامل ، بنفس الطريقة التي يمكن أن يرثها ملحق Action من SLComposeServiceViewController
.
تكمن الاختلافات بين هذين النوعين من الامتدادات في كيفية استخدامها. باستخدام ملحق الإجراء ، يمكنك إنشاء امتداد بدون واجهة مستخدم خاصة به (على سبيل المثال ، ملحق يستخدم لترجمة النص المحدد وإعادة الترجمة إلى التطبيق المضيف). يتيح لك ملحق المشاركة مشاركة التعليقات والصور ومقاطع الفيديو والصوت والروابط والمزيد مباشرة من التطبيق المضيف. يقوم UIActivityViewController
كل من امتدادات Action and Share ، حيث يتم تقديم امتدادات المشاركة كرموز ملونة في الصف العلوي ويتم تقديم امتدادات الإجراء كرموز أحادية اللون في الصف السفلي (الصورة 2.1).
واجهات برمجة التطبيقات المحظورة
لا يمكن استخدام واجهات برمجة التطبيقات التي تم تمييزها في ملفات الرأس باستخدام الماكرو NS_EXTENSION_UNAVAILABLE
، أو ماكرو مشابه لعدم التوفر (على سبيل المثال: لا تتوفر إطارات HealthKit و EventKit UI في iOS 8 للاستخدام في أي ملحق تطبيق).
إذا كنت تشارك رمزًا بين تطبيق وإضافات ، فعليك أن تضع في اعتبارك أنه حتى الإشارة إلى واجهة برمجة تطبيقات غير مسموح بها لملحق التطبيق سيؤدي إلى رفض تطبيقك من متجر التطبيقات. يمكنك اختيار التعامل مع هذا عن طريق إعادة تحليل الفئات المشتركة إلى تسلسلات هرمية ، مع أحد الوالدين المشتركين وفئات فرعية مختلفة لأهداف مختلفة. وهناك طريقة أخرى وهي استخدام المعالج المسبق عن طريق عمليات التحقق #ifdef
. نظرًا لأنه لا يزال هناك هدف شرطي مضمّن ، يجب عليك إنشاء هدفك الخاص.
هناك طريقة لطيفة أخرى للقيام بذلك وهي إنشاء إطار عمل مضمن خاص بك. فقط تأكد من أنه لن يحتوي على أي واجهات برمجة تطبيقات غير متوفرة للإضافات. لتهيئة إضافة تطبيق لاستخدام إطار عمل مضمن ، انتقل إلى إعدادات إنشاء الهدف وقم بتعيين إعداد "مطلوب فقط واجهة برمجة التطبيقات الآمنة لإضافات التطبيقات" على "نعم". عند تكوين مشروع Xcode ، في مرحلة إنشاء نسخ الملفات ، يجب اختيار "الأطر" كوجهة لإطار العمل المضمن. إذا اخترت وجهة "SharedFrameworks" ، فسيتم رفض ما ترسله بواسطة App Store.
ملاحظة حول التوافق مع الإصدارات السابقة
على الرغم من أن إضافات التطبيقات كانت متاحة فقط منذ iOS 8 ، إلا أنه يمكنك جعل تطبيقك المحتوي متاحًا لإصدارات iOS السابقة.
امتثال واجهة Apple البشرية
ضع في اعتبارك إرشادات واجهة iOS البشرية من Apple عند تصميم امتداد التطبيق. يجب عليك التأكد من أن إضافة التطبيق عالمية ، بغض النظر عن الجهاز الذي يدعمه التطبيق الذي يحتوي على. للتأكد من أن إضافة التطبيق عامة ، استخدم إعداد إنشاء عائلة الجهاز المستهدف في Xcode الذي يحدد قيمة "iPhone / iPad" (تسمى أحيانًا عامة).
خاتمة
من المؤكد أن لإضافات التطبيقات التأثير الأكثر وضوحًا في نظام التشغيل iOS 8. نظرًا لأن 79٪ من الأجهزة تستخدم نظام التشغيل iOS 8 بالفعل (كما تم قياسه بواسطة متجر التطبيقات في 13 أبريل 2015) ، فإن إضافات التطبيقات هي ميزات رائعة يجب أن تستفيد منها التطبيقات. من خلال الجمع بين قيود واجهة برمجة التطبيقات وطريقة مشاركة البيانات بين الملحقات والتطبيق المحتوي عليها ، يبدو أن Apple تمكنت من معالجة واحدة من أكبر الشكاوى حول النظام الأساسي دون المساس بنموذج الأمان الخاص بها. لا توجد حتى الآن طريقة لتطبيقات الطرف الثالث لمشاركة بياناتها مباشرة مع بعضها البعض. على الرغم من أن هذا مفهوم جديد جدًا ، إلا أنه يبدو واعدًا جدًا.