كل ما تحتاج لمعرفته حول ملحقات تطبيقات iOS



ظهرت إضافات التطبيقات في نظام التشغيل iOS 8 وجعلت النظام أكثر مرونة وقوة وبأسعار معقولة للمستخدمين. يمكن عرض التطبيقات كأداة مصغّرة في مركز الإشعارات وتقديم مرشحاتها للصور في الصور وعرض لوحة مفاتيح جديدة للنظام وأكثر من ذلك بكثير. في نفس الوقت ، تم الحفاظ على أمان بيانات المستخدم والنظام. سيتم مناقشة ميزات عمل ملحقات التطبيقات أدناه.

تسعى Apple دائمًا إلى عزل التطبيقات عن بعضها البعض بعناية. هذه هي أفضل طريقة لضمان سلامة المستخدمين وحماية بياناتهم. يتم إعطاء كل تطبيق مكان منفصل في نظام الملفات مع وصول محدود. مكّنت إضافات التطبيقات من التفاعل مع التطبيق دون تشغيله أو عرضها على الشاشة. وبالتالي ، سيكون جزءًا من وظائفها متاحًا للمستخدمين عند تفاعلهم مع التطبيقات الأخرى أو النظام.

امتدادات التطبيقات هي ملفات قابلة للتنفيذ تعمل بشكل مستقل عن التطبيق الذي يحتوي على التطبيق - تحتوي على التطبيق . في حد ذاتها ، لا يمكن نشرها على متجر التطبيقات ، فقط مع التطبيق المتضمن. تؤدي جميع امتدادات التطبيقات مهمة واحدة محددة وترتبط بمنطقة واحدة فقط من نظام التشغيل iOS ، اعتمادًا على نوعها. على سبيل المثال: ملحقات لوحة المفاتيح المخصصة مخصصة لاستبدال لوحة المفاتيح القياسية ، وتحرير امتدادات الصور مخصصة لتحرير الصور في الصور. يوجد حاليًا 25 نوعًا من ملحقات التطبيقات.

تمديد تطبيق تمديد الحياة


يُطلق على التطبيق الذي يستخدمه المستخدم لبدء تشغيل "ملحق التطبيق" تطبيق المضيف . يُطلق تطبيق المضيف دورة حياة ملحق التطبيق ، ويرسل طلبًا استجابةً لإجراء المستخدم:



  • يحدد المستخدم امتداد التطبيق من خلال تطبيق المضيف.
  • المضيف التطبيق يرسل طلب تمديد التطبيق.
  • تطلق iOS امتداد التطبيق في سياق تطبيق المضيف وتؤسس قناة اتصال بينهما.
  • يقوم المستخدم بإجراء في امتداد التطبيق.
  • ملحق التطبيق يكمل الطلب من تطبيق المضيف ، أو يؤدي مهمة ، أو يبدأ عملية خلفية لإكماله ؛ عند الانتهاء من المهمة ، يمكن إرجاع النتيجة إلى تطبيق المضيف.
  • بمجرد تنفيذ App Extension على الكود الخاص به ، يقوم النظام بإنهاء تطبيق App Extension هذا.

على سبيل المثال ، عند مشاركة صورة من الصور باستخدام Facebook Share Extension ، فإن Facebook هو التطبيق المتضمن والصور هي تطبيق المضيف. في هذه الحالة ، تبدأ الصور في دورة حياة ملحق Facebook Share عندما يحددها المستخدم في قائمة "مشاركة":



التفاعل مع التطبيق التمديد




  • يحتوي التطبيق - التطبيق المضيف
    لا تتفاعل مع بعضها البعض.
  • ملحق التطبيق - التطبيق المضيف
    التفاعل باستخدام IPC .
  • ملحق التطبيق - يحتوي على التطبيق
    التفاعل غير المباشر. يتم استخدام مجموعات التطبيقات لتبادل البيانات ، ويتم استخدام أطر العمل المدمجة للرمز العام. يمكنك تشغيل التطبيق المتضمن من امتداد التطبيق باستخدام مخططات عناوين URL .

الرمز العام: الأطر الديناميكية


إذا كان التطبيق المتضمن وإمتداد التطبيق يستخدمان نفس الكود ، فيجب وضعه في إطار ديناميكي.

على سبيل المثال ، قد يرتبط ملحق تحرير الصور بتطبيق مخصص لتحرير الصور يستخدم بعض المرشحات من التطبيق المتضمن. سيكون الحل الجيد هو إنشاء إطار ديناميكي لهذه المرشحات.

للقيام بذلك ، أضف هدفًا جديدًا وحدد Cocoa Touch Framework :



حدد اسمًا (على سبيل المثال ، ImageFilters ) ، وفي لوحة المستكشف يمكنك رؤية مجلد جديد باسم الإطار الذي تم إنشاؤه:

تحتاج إلى التأكد من أن إطار العمل لا يستخدم واجهات برمجة التطبيقات غير المتوفرة لامتدادات التطبيقات:

  • مشترك من UIApplication.
  • واجهات برمجة التطبيقات المميزة بوحدات عدم إمكانية الوصول.
  • الكاميرا والميكروفون (باستثناء امتداد iMessage).
  • أداء مهام خلفية طويلة (تختلف ميزات هذا التقييد وفقًا لنوع امتداد التطبيق).
  • تلقي البيانات باستخدام AirDrop.

سيؤدي استخدام أي من هذه القائمة في إضافات التطبيقات إلى رفضها عند نشرها في متجر التطبيقات.

في إعدادات إطار العمل بشكل عام ، تحتاج إلى تحديد المربع الموجود بجوار "السماح بواجهة برمجة تطبيقات امتداد التطبيق فقط" :



في رمز الإطار ، يجب أن تكون جميع الفئات والطرق والخصائص المستخدمة في التطبيق المتضمن وإضافات التطبيقات public . أينما كنت بحاجة إلى استخدام الإطار ، قم import :

 import ImageFilters 

تبادل البيانات: مجموعات التطبيقات


يحتوي التطبيق المتضمن و ملحق التطبيق على أقسام محدودة خاصة بهما من نظام الملفات ، ويمكنهما فقط الوصول إليها. من أجل امتلاك التطبيق المتضمن وإمتداد التطبيق حاوية مشتركة مع وصول للقراءة والكتابة ، تحتاج إلى إنشاء مجموعة تطبيقات لهم.

تم إنشاء مجموعة التطبيقات في Apple Developer Portal :



في الزاوية اليمنى العليا ، انقر فوق "+" ، في النافذة التي تظهر ، أدخل البيانات اللازمة:



متابعة التالي -> تسجيل -> تم .

في إعدادات التطبيق المتضمن ، انتقل إلى علامة تبويب القدرات ، وقم بتنشيط مجموعات التطبيقات وحدد المجموعة التي تم إنشاؤها:



وبالمثل بالنسبة لتطبيق ملحق:



الآن يحتوي التطبيق المتضمن و ملحق التطبيق على حاوية. بعد ذلك ، سنتحدث عن كيفية القراءة والكتابة إليها.

عيوب المستخدم


لتبادل كمية صغيرة من البيانات ، من المريح استخدام UserDefaults ، تحتاج فقط إلى تحديد اسم مجموعة التطبيقات:

 let sharedDefaults = UserDefaults(suiteName: "group.com.maxial.onemoreapp") 

NSFileCoordinator و NSFilePresenter


بالنسبة للبيانات الضخمة ، يعد NSFileCoordinator مناسبًا بشكل أفضل لضمان اتساق القراءة / الكتابة. سيؤدي ذلك إلى تجنب تلف البيانات ، نظرًا لوجود إمكانية أن تتمكن عدة عمليات من الوصول إليها في وقت واحد.

يتم الحصول على عنوان URL للحاوية المشتركة كما يلي:

 let sharedUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp") 

السجل:

 fileCoordinator.coordinate(writingItemAt: sharedUrl, options: [], error: nil) { [unowned self] newUrl in do { let data = try NSKeyedArchiver.archivedData(withRootObject: self.object, requiringSecureCoding: false) try data.write(to: newUrl, options: .atomic) } catch { print(error) } } 

قراءة:

 fileCoordinator.coordinate(readingItemAt: sharedUrl, options: [], error: nil) { newUrl in do { let data = try Data(contentsOf: newUrl) if let object = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSString.self, from: data) as String? { self.object = object } } catch { print(error) } } 

تجدر NSFileCoordinator أن NSFileCoordinator يعمل بشكل متزامن. على الرغم من أن بعض الملفات سوف تشغلها بعض العمليات ، إلا أنه سيتعين على الآخرين انتظار إصدارها.

إذا كنت ترغب في معرفة ملحق التطبيق عند تغيير التطبيق المتضمن لحالة البيانات ، NSFilePresenter استخدام NSFilePresenter . هذا بروتوكول قد يبدو تطبيقه كما يلي:

 extension TodayViewController: NSFilePresenter { var presentedItemURL: URL? { let sharedUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp") return sharedUrl?.appendingPathComponent("Items") } var presentedItemOperationQueue: OperationQueue { return .main } func presentedItemDidChange() { } } 

تقوم خاصية presentationItemOperationQueue بإرجاع قائمة انتظار يتم استخدامها لعمليات الاسترجاعات عند تغيير الملفات. يتم استدعاء الأسلوب presentedItemDidChange() عندما تغير العملية ، في هذه الحالة التطبيق المتضمن ، محتويات البيانات. إذا تم إجراء تغييرات مباشرة باستخدام مكالمات الكتابة ذات المستوى المنخفض ، فلن يتم presentedItemDidChange() . NSFileCoordinator التغييرات التي تستخدم NSFileCoordinator .

عند تهيئة كائن NSFileCoordinator ، يوصى بتمرير كائن NSFilePresenter ، خاصةً إذا بدأ أي عملية ملف:

 let fileCoordinator = NSFileCoordinator(filePresenter: self) 

وإلا ، NSFilePresenter كائن NSFilePresenter إعلامات حول هذه العمليات ، مما قد يؤدي إلى حالة توقف تام عند العمل في نفس مؤشر الترابط.

لبدء مراقبة حالة البيانات ، تحتاج إلى استدعاء الأسلوب addFilePresenter(_:) مع الكائن المقابل:

 NSFileCoordinator.addFilePresenter(self) 

أي كائنات NSFileCoordinator تم إنشاؤها لاحقًا NSFileCoordinator تلقائيًا حول كائن NSFilePresenter عن التغييرات في الدليل الخاص بها.

لإيقاف مراقبة حالة البيانات ، استخدم removeFilePresenter(_:) :

 NSFileCoordinator.removeFilePresenter(self) 

البيانات الأساسية


لمشاركة البيانات ، يمكنك استخدام SQLite ، وبالتالي ، البيانات الأساسية. يمكنهم إدارة العمليات التي تعمل مع البيانات المشتركة. لتكوين البيانات الأساسية المراد مشاركتها بين التطبيق المتضمن NSPersistentContainer التطبيق ، قم بإنشاء فئة فرعية من NSPersistentContainer وتجاوز طريقة defaultDirectoryURL ، والتي يجب أن تُرجع عنوان مخزن البيانات:

 class SharedPersistentContainer: NSPersistentContainer { override open class func defaultDirectoryURL() -> URL { var storeURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.maxial.onemoreapp") storeURL = storeURL?.appendingPathComponent("OneMoreApp.sqlite") return storeURL! } } 

في AppDelegate بتغيير الخاصية persistentContainer . يتم إنشاؤه تلقائيًا إذا ، عند إنشاء مشروع ، حدد خانة الاختيار استخدام البيانات الأساسية . الآن SharedPersistentContainer فئة SharedPersistentContainer :

 lazy var persistentContainer: NSPersistentContainer = { let container = SharedPersistentContainer(name: "OneMoreApp") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() 

كل ما تبقى هو إضافة .xcdatamodeld إلى امتداد التطبيق. حدد ملف .xcdatamodeld في لوحة المستكشف. في File Inspector ، أسفل قسم العضوية المستهدفة ، حدد المربع بجوار امتداد التطبيق:



وبالتالي ، سيكون بإمكان التطبيق المتضمن وإمتداد التطبيق قراءة البيانات وكتابتها على نفس وحدة التخزين واستخدام نفس الطراز.

إطلاق التطبيق المتضمن من امتداد التطبيق


عندما يرسل تطبيق المضيف طلب تمديد تطبيق ، فإنه يوفر extensionContext . يحتوي هذا الكائن على طريقة open(_:completionHandler:) ، والتي يمكنك من خلالها فتح التطبيق المتضمن. ومع ذلك ، لا تتوفر هذه الطريقة لجميع أنواع امتداد التطبيق. في نظام التشغيل iOS ، يتم دعمه بواسطة Today Extension و iMessage Extension. يمكن استخدام ملحق iMessage فقط لفتح التطبيق المتضمن. إذا فتحت Today Extension تطبيقًا آخر به ، فقد تكون هناك حاجة إلى تحقق إضافي للتقديم إلى متجر التطبيقات.

لفتح التطبيق من التطبيق الملحق ، تحتاج إلى تحديد مخطط URL في التطبيق المتضمن:



بعد ذلك ، اتصل بالطريقة open(_:completionHandler:) باستخدام هذا المخطط من امتداد التطبيق:

 guard let url = URL(string: "OneMoreAppUrl://") else { return } extensionContext?.open(url, completionHandler: nil) 

بالنسبة إلى أنواع ملحقات التطبيقات التي تستدعي طريقة open(_:completionHandler:) غير متاحة ، هناك أيضًا طريقة. ولكن هناك احتمال أن يتم رفض التطبيق عند إيداعه في متجر التطبيقات. يكمن جوهر الأسلوب في UIResponder عبر سلسلة كائنات UIResponder حتى يكون هناك تطبيق openURL يقبل استدعاء openURL :

 guard let url = URL(string: "OneMoreAppUrl://") else { return } let selectorOpenURL = sel_registerName("openURL:") var responder: UIResponder? = self while responder != nil { if responder?.responds(to: selectorOpenURL) == true { responder?.perform(selectorOpenURL, with: url) } responder = responder?.next } 

ملحقات التطبيقات المستقبلية


جلبت ملحقات التطبيق الكثير لتطوير دائرة الرقابة الداخلية. تدريجيا ، تظهر المزيد من أنواع امتدادات التطبيقات ، وقدراتها تتطور. على سبيل المثال ، مع إصدار iOS 12 SDK ، يمكنك الآن التفاعل مع منطقة المحتوى في الإشعارات ، والتي كانت مفقودة لفترة طويلة.

وبالتالي ، تواصل Apple تطوير هذه الأداة ، والتي تلهم التفاؤل بشأن مستقبلها.

روابط مفيدة:

الوثائق الرسمية
مشاركة البيانات بين تطبيقات iOS وملحقات التطبيقات
iOS 8 التطبيق نصائح التنمية التمديد

Source: https://habr.com/ru/post/ar441890/


All Articles