الفرق بين المراجعتين لصفحة: «Cordova/plugins ios»
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:إضافات iOS في كوردوفا}}</noinclude> تصنيف: Cordova تصنيف: plugins ios تصنيف: ios يقدم هذ...' |
لا ملخص تعديل |
||
سطر 2: | سطر 2: | ||
[[تصنيف: Cordova]] | [[تصنيف: Cordova]] | ||
[[تصنيف: plugins ios]] | [[تصنيف: plugins ios]] | ||
[[تصنيف: ios]] | [[تصنيف: ios]] | ||
يقدم هذا القسم تفاصيل عن كيفية تقديم (implement) شيفرات الإضافات الأصلية (native plugin code) على منصة iOS. قبل قراءة هذه الصفحة، راجع صفحة دليل تطوير الإضافات | يقدم هذا القسم تفاصيل عن كيفية تقديم (implement) شيفرات الإضافات الأصلية (native plugin code) على منصة iOS. قبل قراءة هذه الصفحة، راجع صفحة [[Cordova/plugins|دليل تطوير الإضافات]] للحصول على نظرة عامة على بنية الإضافات وواجهة [[JavaScript|جافاسكريبت]] الخاصة بها. يواصل هذا القسم تطوير [[Cordova/plugins#.D9.85.D8.AB.D8.A7.D9.84 JavaScript|مثال الإضافة <code>echo</code>]] الوارد في دليل تطوير الإضافات، والذي يربط الاتصال من المعرض [[Cordova/webviews|webview]] إلى المنصة الأصلية (native platform)، والعكس بالعكس. | ||
يتم تقديم (implement) إضافات iOS على هيئة صنف من لغة Objective-C، والذي يوسع الصنف <code>CDVPlugin | يتم تقديم (implement) إضافات iOS على هيئة صنف من لغة Objective-C، والذي يوسع الصنف <code>CDVPlugin</code>. | ||
== إعداد صنف الإضافة == | لكي يُربط الوسيط <code>service</code> المُمرر إلى التابع <code>exec</code> مع صنف في لغة Objective-C، فيجب تسجيل كل أصناف الإضافة على هيئة وسم <code><feature></code> في الملف <code>config.xml</code>. | ||
==إعداد صنف الإضافة== | |||
يستخدم جزء [[JavaScript|الجافاسكريبت]] من الإضافة التابعَ <code>cordova.exec</code> على النحو التالي:<syntaxhighlight lang="javascript">exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);</syntaxhighlight>هذا سيُرسل طلبية (request) من <code>UIWebView</code> إلى الجانب الأصلي (native side) من منصة iOS، ثم يستدعي التابع <code>action</code> على الصنف <code>service</code> فعلياً، مع تمرير الوسائط المعطاة في المصفوفة <code>args</code>. | |||
قم بحديد الإضافة على هيئة وسم <code><feature></code> في الملف <code>config.xml</code> الخاص بتطبيق Cordova-iOS، مع استخدام الملف <code>plugin.xml</code> لإدراج هذا الوسم تلقائيًا، كما هو موضح في [[Cordova/plugins|دليل تطوير الإضافات]]:<syntaxhighlight lang="xml"><feature name="LocalStorage"> | |||
قم بحديد الإضافة على هيئة وسم <code><feature></code> في الملف <code>config.xml</code> الخاص بتطبيق Cordova-iOS، مع استخدام الملف <code>plugin.xml</code> لإدراج هذا الوسم تلقائيًا، كما هو موضح في [ | |||
<syntaxhighlight lang=" | |||
<param name="ios-package" value="CDVLocalStorage" /> | <param name="ios-package" value="CDVLocalStorage" /> | ||
</feature></syntaxhighlight> | </feature></syntaxhighlight>يجب أن تتطابق الخاصية <code>name</code> في الوسم <code>feature</code> مع قيمة الوسيط <code>service</code> الذي مررته سابقا إلى دالة [[JavaScript|جافاسكريبت]] <code>exec</code> . كما يجب أن تتطابق الخاصية <code>value</code> مع اسم صنف الإضافة في Objective-C. ويجب أن تساوي الخاصية <code>name</code> في الوسم <code><param></code> دائمًا القيمة "<code>ios-package"</code>. | ||
يجب أن تتطابق الخاصية <code>name</code> في الوسم feature مع قيمة الوسيط <code> | |||
يتم إنشاء نسخة (instance) واحدة من كائن الإضافة خلال دورة حياة المعرض <code>UIWebView</code>. لا يتم إنشاء نسخ للإضافات حتى تتم الإشارة إليها أولاً عبر استدعاء من [[JavaScript| | إذا لم تتبع هذه الإرشادات، فقد يتم تصريف (compile) الإضافة، ولكن قد لا تتمكن كوردوفا من الوصول إليها. | ||
<syntaxhighlight lang="javascript"><feature name="Echo"> | ==تهيئة الإضافات ودورة الحياة (Plugin Initialization and Lifetime)== | ||
يتم إنشاء نسخة (instance) واحدة من كائن الإضافة خلال دورة حياة المعرض <code>UIWebView</code>. لا يتم إنشاء نسخ للإضافات حتى تتم الإشارة إليها أولاً عبر استدعاء من [[JavaScript|جافاسكريبت]]، إلا في حال إضافة الوسم <code><param></code>، مع الخاصيتين <code>name="onload"</code> و <code>value="true"</code>في الملف <code>config.xml</code>. على النحو التالي:<syntaxhighlight lang="javascript"><feature name="Echo"> | |||
<param name="ios-package" value="Echo" /> | <param name="ios-package" value="Echo" /> | ||
<param name="onload" value="true" /> | <param name="onload" value="true" /> | ||
</feature></syntaxhighlight> | </feature></syntaxhighlight>يجب أن تستخدم الإضافات التابع <code>pluginInitialize</code> في مرحلة الانطلاق. | ||
يجب أن | لإضافات الطلبيات الطويلة (long-running requests)، أو النشاطات الخلفية (background activity)، مثل قارئات الوسائط، أو المستمعات (listeners)، أو النشاطات ذات الحالة الداخلية (internal state) يجب أن تقدِّم (implement) التابع <code>onReset</code> لأجل إلغاء تلك الطلبيات الطويلة، أو للتنظيف بعد تلك الأنشطة. يتم تشغيل التابع <code>onReset</code> عند انتقال <code>UIWebView</code> إلى صفحة جديدة أو عند تحديث الصفحة، وهو ما يؤدي إلى إعادة تحميل [[JavaScript|جافاسكريبت]]. | ||
==كتابة إضافات iOS== | |||
يرسل استدعاء من [[JavaScript|جافاسكريبت]] طلبية إضافة (plugin request) إلى الجانب الأصلي (native side)، ويُعيّن إضافة Objective-C المقابلة في الملف <code>config.xml</code>. أي شيء يتم إرساله إلى الإضافة عبر الدالة <code>exec</code> سيُمرّر إلى التابع <code>action</code> الخاص بصنف بالإضافة. | |||
فيما يلي إمضاء (signature) تابع الإضافة:<syntaxhighlight lang="javascript">- (void)myMethod:(CDVInvokedUrlCommand*)command | |||
<syntaxhighlight lang="javascript">- (void)myMethod:(CDVInvokedUrlCommand*)command | |||
{ | { | ||
CDVPluginResult* pluginResult = nil; | CDVPluginResult* pluginResult = nil; | ||
سطر 46: | سطر 36: | ||
} | } | ||
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | ||
}</syntaxhighlight> | }</syntaxhighlight>لمزيد من التفاصيل، راجع الصفحات [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h CDVInvokedUrlCommand.h] و [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVPluginResult.h CDVPluginResult.h] و [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVCommandDelegate.h CDVCommandDelegate.h]. | ||
==أنواع الرسائل CDVPluginResult في منصة iOS== | |||
لمزيد من التفاصيل، راجع الصفحات [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h | يمكنك استخدام <code>CDVPluginResult</code> لإعادة مجموعة متنوعة من أنواع النتائج إلى استدعاءات [[JavaScript|جافاسكريبت]]، باستخدام توابع تتبع هذا النمط:<syntaxhighlight lang="c">+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAs...</syntaxhighlight>يمكنك إنشاء الأنواع <code>String</code> و <code>Int</code> و <code>Double</code> و <code>Bool</code> و <code>Array</code> و <code>Dictionary</code> و <code>ArrayBuffer</code> و <code>Multipart</code>. يمكنك أيضًا استبعاد أي وسيط لأجل إرسال حالة، أو لإعادة خطأ، أو يمكنك حتى اختيار عدم إرسال أي نتيجة للإضافة، وفي هذه الحالة لن يُطلق أيٌّ من تلك الاستدعاءات. | ||
== أنواع الرسائل CDVPluginResult في | |||
يمكنك استخدام <code>CDVPluginResult</code> لإعادة مجموعة متنوعة من أنواع النتائج إلى استدعاءات [[JavaScript| | |||
<syntaxhighlight lang=" | |||
يمكنك إنشاء الأنواع <code>String</code> و <code>Int</code> و <code>Double</code> و <code>Bool</code> و <code>Array</code> و <code>Dictionary</code> و <code>ArrayBuffer</code> و <code>Multipart</code>. يمكنك أيضًا استبعاد أي وسيط | |||
<code>messageAsMultipart</code> تتوقع مصفوفة <code>NSArray*</code> تحتوي على أي من الأنواع المدعومة الأخرى، وترسل المصفوفة بأكملها باعتبارها <code>arguments</code> إلى استدعاء [[JavaScript| | تذكر ما يلي عند التعامل مع القيم المعادة المعقدة: | ||
* <code>messageAsArrayBuffer</code> تتوقع <code>NSData*</code>، وتحوله إلى <code>ArrayBuffer</code> في استدعاء [[JavaScript|جافاسكريبت]]. وبالمثل، أي كائن <code>ArrayBuffer</code> ترسله [[JavaScript|جافاسكريبت]] إلى الإضافة سيُحوّل إلى <code>NSData*</code>. | |||
* <code>messageAsMultipart</code> تتوقع مصفوفة <code>NSArray*</code> تحتوي على أي من الأنواع المدعومة الأخرى، وترسل المصفوفة بأكملها باعتبارها الوسيط<code>arguments</code> إلى استدعاء [[JavaScript|جافاسكريبت]] (JavaScript callback). بهذه الطريقة، تُسلسل (serialized) كل الوسائط أو تُفلّ (deserialized) بحسب الضرورة، لذلك من الآمن إعادة <code>NSData*</code> كسلسلة متعددة (multipart)، ولكن ليس على هيئة مصفوفة أو قاموس. | |||
== مثال لإضافة iOS == | ==مثال لإضافة iOS== | ||
لمطابقة واجهة [[Cordova/plugins#.D9.85.D8.AB.D8.A7.D9.84 JavaScript|الميزة echo]] المقدمة في صفحة [[Cordova/plugins|الإضافات]]، استخدم الملف <code>plugin.xml</code> لإدراج مواصفات <code>feature</code> في الملف <code>config.xml</code> الخاص بالمنصة المحلية:<syntaxhighlight lang="javascript"><platform name="ios"> | |||
لمطابقة | |||
<syntaxhighlight lang="javascript"><platform name="ios"> | |||
<config-file target="config.xml" parent="/*"> | <config-file target="config.xml" parent="/*"> | ||
<feature name="Echo"> | <feature name="Echo"> | ||
سطر 72: | سطر 51: | ||
</feature> | </feature> | ||
</config-file> | </config-file> | ||
</platform></syntaxhighlight> | </platform></syntaxhighlight>ثم أضف الملفين <code>Echo.h</code> و <code>Echo.m</code> إلى المجلد <code>Plugins</code> الموجود في مجلد تطبيق Cordova-iOS:<syntaxhighlight lang="javascript">/********* Echo.h Cordova Plugin Header *******/ | ||
ثم | |||
<syntaxhighlight lang="javascript">/********* Echo.h Cordova Plugin Header *******/ | |||
#import <Cordova/CDVPlugin.h> | #import <Cordova/CDVPlugin.h> | ||
سطر 97: | سطر 73: | ||
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | ||
} | } | ||
@end</syntaxhighlight> | @end</syntaxhighlight>تُوسّع عمليات الاستيراد في الجزء العلوي من الملف الصنف <code>CDVPlugin</code>. في هذه الحالة، لا تدعم الإضافة سوى إجراء (action) واحد، وهي<code>echo</code>. تستخلص السلسلة النصية echo عن طريق استدعاء التابع <code>objectAtIndex</code> للحصول على الوسيط الأول الموجود في المصفوفة <code>arguments</code>، والذي يتوافق مع الوسائط المُمررة من قبل دالة [[JavaScript|جافاسكريبت]] <code>exec()</code>. | ||
تُوسّع عمليات الاستيراد في الجزء العلوي من الملف الصنف | |||
تتحقق الشيفرة من أن الوسيط لا يساوي القيمة <code>nil</code> أو سلسلة نصية فارغة، ثم تعيد <code>PluginResult</code> مع الحالة <code>ERROR</code> إن كان الأمر كذلك. أما إذا اجتاز الوسيط الاختبار، فسيُعاد <code>PluginResult</code> مع حالة تساوي <code>OK</code>، ثم يُمرر إلى السلسلة النصية الأصلية <code>echo</code>. وأخيرًا، تُرسل النتيجة إلى التابع <code>self.commandDelegate</code>، والذي ينفذ دوال النجاح أو الإخفاق (success or failure callbacks) الخاصة بالتابع <code>exec</code> على جانب [[JavaScript|جافاسكريبت]]. في حال استدعاء دالة النجاح، فسيُمرر إليها الوسيط <code>echo</code>. | |||
==التكامل مع منصة iOS== | |||
== التكامل مع منصة iOS == | يوفر الصنف <code>CDVPlugin</code> توابع أخرى يمكن إعادة تعريفها من قبل الإضافة. على سبيل المثال، يمكنك إمساك الأحداث <code>[https://cordova.apache.org/docs/en/latest/cordova/events/events.html#pause pause]</code> و <code>[https://cordova.apache.org/docs/en/latest/cordova/events/events.html#resume resume]</code> و إنهاء التطبيق (app terminate) و <code>handleOpenURL</code>. راجع الصنفين [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVPlugin.h CDVPlugin.h] و [https://github.com/apache/cordova-ios/blob/master/CordovaLib/Classes/Public/CDVPlugin.m CDVPlugin.m] لأجل الإرشادات. | ||
==المهام الفرعية (Threading)== | |||
يوفر الصنف <code>CDVPlugin</code> توابع أخرى يمكن | تنفّذ توابع الإضافة عادةً في نفس المهمة الفرعية التي تشتغل عليها الواجهة الرئيسية. إن كانت الإضافة تتطلب قدرًا كبيرًا من المعالجة، أو تتطلب القيام باستدعاء مُعطِّل (blocking call)، فعليك استخدام مهمة فرعية خلفية (background thread). مثلا:<syntaxhighlight lang="javascript">- (void)myPluginMethod:(CDVInvokedUrlCommand*)command | ||
== المهام الفرعية (Threading) == | |||
تنفّذ توابع الإضافة عادةً في نفس المهمة الفرعية التي تشتغل عليها الواجهة الرئيسية. إن كانت الإضافة تتطلب قدرًا كبيرًا من المعالجة، أو تتطلب القيام باستدعاء | |||
<syntaxhighlight lang="javascript">- (void)myPluginMethod:(CDVInvokedUrlCommand*)command | |||
{ | { | ||
// | // هنا command.arguments تحقق من | ||
[self.commandDelegate runInBackground:^{ | [self.commandDelegate runInBackground:^{ | ||
NSString* payload = nil; | NSString* payload = nil; | ||
// Some blocking logic... | // Some blocking logic... | ||
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; | CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; | ||
// | // آمن في المهام الفرعية sendPluginResult استخدام | ||
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; | ||
}]; | }]; | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
==تصحيح إضافات iOS (Debugging iOS Plugins)== | |||
== تصحيح إضافات iOS (Debugging iOS Plugins) == | لتصحيح الأخطاء في شيفرة Objective-C، سيكون عليك استخدام المُصحِّح المدمج في Xcode. أما بالنسبة إلى [[JavaScript|جافاسكريبت]]، فيمكنك ربط Safari بالتطبيق عبر محاكي أو جهاز iOS. | ||
==أخطاء شائعة== | |||
لتصحيح الأخطاء | * لا تنسَ إدراج خريطة الإضافة (plugin's mapping) إلى الملف <code>config.xml</code>. وإلا فسيُسجّل خطأ في وحدة تحكم Xcode. | ||
* لا تنس إضافة كل المضيفات التي تتصل بها في [[Cordova/whitelist|القائمة البيضاء]]. وإلا فسيُسجّل خطأ في وحدة تحكم Xcode. | |||
== أخطاء شائعة == | |||
== انظر أيضا== | |||
*[[Cordova/plugins android|إضافات أندرويد]] | |||
*[[plugins windows|إضافات ويندوز]] | |||
*صفحة [[Cordova/plugins|دليل تطوير الإضافات]] | |||
==مصادر== | ==مصادر== | ||
*[https://cordova.apache.org/docs/en/latest/guide/platforms/ios/plugin.html | *[https://cordova.apache.org/docs/en/latest/guide/platforms/ios/plugin.html صفحة iOS Plugin Development Guide في توثيق كوردوفا الرسمي.] |
مراجعة 23:20، 22 نوفمبر 2018
يقدم هذا القسم تفاصيل عن كيفية تقديم (implement) شيفرات الإضافات الأصلية (native plugin code) على منصة iOS. قبل قراءة هذه الصفحة، راجع صفحة دليل تطوير الإضافات للحصول على نظرة عامة على بنية الإضافات وواجهة جافاسكريبت الخاصة بها. يواصل هذا القسم تطوير مثال الإضافة echo
الوارد في دليل تطوير الإضافات، والذي يربط الاتصال من المعرض webview إلى المنصة الأصلية (native platform)، والعكس بالعكس.
يتم تقديم (implement) إضافات iOS على هيئة صنف من لغة Objective-C، والذي يوسع الصنف CDVPlugin
.
لكي يُربط الوسيط service
المُمرر إلى التابع exec
مع صنف في لغة Objective-C، فيجب تسجيل كل أصناف الإضافة على هيئة وسم <feature>
في الملف config.xml
.
إعداد صنف الإضافة
يستخدم جزء الجافاسكريبت من الإضافة التابعَ cordova.exec
على النحو التالي:
exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);
هذا سيُرسل طلبية (request) من UIWebView
إلى الجانب الأصلي (native side) من منصة iOS، ثم يستدعي التابع action
على الصنف service
فعلياً، مع تمرير الوسائط المعطاة في المصفوفة args
.
قم بحديد الإضافة على هيئة وسم <feature>
في الملف config.xml
الخاص بتطبيق Cordova-iOS، مع استخدام الملف plugin.xml
لإدراج هذا الوسم تلقائيًا، كما هو موضح في دليل تطوير الإضافات:
<feature name="LocalStorage">
<param name="ios-package" value="CDVLocalStorage" />
</feature>
يجب أن تتطابق الخاصية name
في الوسم feature
مع قيمة الوسيط service
الذي مررته سابقا إلى دالة جافاسكريبت exec
. كما يجب أن تتطابق الخاصية value
مع اسم صنف الإضافة في Objective-C. ويجب أن تساوي الخاصية name
في الوسم <param>
دائمًا القيمة "ios-package"
.
إذا لم تتبع هذه الإرشادات، فقد يتم تصريف (compile) الإضافة، ولكن قد لا تتمكن كوردوفا من الوصول إليها.
تهيئة الإضافات ودورة الحياة (Plugin Initialization and Lifetime)
يتم إنشاء نسخة (instance) واحدة من كائن الإضافة خلال دورة حياة المعرض UIWebView
. لا يتم إنشاء نسخ للإضافات حتى تتم الإشارة إليها أولاً عبر استدعاء من جافاسكريبت، إلا في حال إضافة الوسم <param>
، مع الخاصيتين name="onload"
و value="true"
في الملف config.xml
. على النحو التالي:
<feature name="Echo">
<param name="ios-package" value="Echo" />
<param name="onload" value="true" />
</feature>
يجب أن تستخدم الإضافات التابع pluginInitialize
في مرحلة الانطلاق.
لإضافات الطلبيات الطويلة (long-running requests)، أو النشاطات الخلفية (background activity)، مثل قارئات الوسائط، أو المستمعات (listeners)، أو النشاطات ذات الحالة الداخلية (internal state) يجب أن تقدِّم (implement) التابع onReset
لأجل إلغاء تلك الطلبيات الطويلة، أو للتنظيف بعد تلك الأنشطة. يتم تشغيل التابع onReset
عند انتقال UIWebView
إلى صفحة جديدة أو عند تحديث الصفحة، وهو ما يؤدي إلى إعادة تحميل جافاسكريبت.
كتابة إضافات iOS
يرسل استدعاء من جافاسكريبت طلبية إضافة (plugin request) إلى الجانب الأصلي (native side)، ويُعيّن إضافة Objective-C المقابلة في الملف config.xml
. أي شيء يتم إرساله إلى الإضافة عبر الدالة exec
سيُمرّر إلى التابع action
الخاص بصنف بالإضافة.
فيما يلي إمضاء (signature) تابع الإضافة:
- (void)myMethod:(CDVInvokedUrlCommand*)command
{
CDVPluginResult* pluginResult = nil;
NSString* myarg = [command.arguments objectAtIndex:0];
if (myarg != nil) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
لمزيد من التفاصيل، راجع الصفحات CDVInvokedUrlCommand.h و CDVPluginResult.h و CDVCommandDelegate.h.
أنواع الرسائل CDVPluginResult في منصة iOS
يمكنك استخدام CDVPluginResult
لإعادة مجموعة متنوعة من أنواع النتائج إلى استدعاءات جافاسكريبت، باستخدام توابع تتبع هذا النمط:
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAs...
يمكنك إنشاء الأنواع String
و Int
و Double
و Bool
و Array
و Dictionary
و ArrayBuffer
و Multipart
. يمكنك أيضًا استبعاد أي وسيط لأجل إرسال حالة، أو لإعادة خطأ، أو يمكنك حتى اختيار عدم إرسال أي نتيجة للإضافة، وفي هذه الحالة لن يُطلق أيٌّ من تلك الاستدعاءات.
تذكر ما يلي عند التعامل مع القيم المعادة المعقدة:
messageAsArrayBuffer
تتوقعNSData*
، وتحوله إلىArrayBuffer
في استدعاء جافاسكريبت. وبالمثل، أي كائنArrayBuffer
ترسله جافاسكريبت إلى الإضافة سيُحوّل إلىNSData*
.messageAsMultipart
تتوقع مصفوفةNSArray*
تحتوي على أي من الأنواع المدعومة الأخرى، وترسل المصفوفة بأكملها باعتبارها الوسيطarguments
إلى استدعاء جافاسكريبت (JavaScript callback). بهذه الطريقة، تُسلسل (serialized) كل الوسائط أو تُفلّ (deserialized) بحسب الضرورة، لذلك من الآمن إعادةNSData*
كسلسلة متعددة (multipart)، ولكن ليس على هيئة مصفوفة أو قاموس.
مثال لإضافة iOS
لمطابقة واجهة الميزة echo المقدمة في صفحة الإضافات، استخدم الملف plugin.xml
لإدراج مواصفات feature
في الملف config.xml
الخاص بالمنصة المحلية:
<platform name="ios">
<config-file target="config.xml" parent="/*">
<feature name="Echo">
<param name="ios-package" value="Echo" />
</feature>
</config-file>
</platform>
ثم أضف الملفين Echo.h
و Echo.m
إلى المجلد Plugins
الموجود في مجلد تطبيق Cordova-iOS:
/********* Echo.h Cordova Plugin Header *******/
#import <Cordova/CDVPlugin.h>
@interface Echo : CDVPlugin
- (void)echo:(CDVInvokedUrlCommand*)command;
@end
/********* Echo.m Cordova Plugin Implementation *******/
#import "Echo.h"
#import <Cordova/CDVPlugin.h>
@implementation Echo
- (void)echo:(CDVInvokedUrlCommand*)command
{
CDVPluginResult* pluginResult = nil;
NSString* echo = [command.arguments objectAtIndex:0];
if (echo != nil && [echo length] > 0) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end
تُوسّع عمليات الاستيراد في الجزء العلوي من الملف الصنف CDVPlugin
. في هذه الحالة، لا تدعم الإضافة سوى إجراء (action) واحد، وهيecho
. تستخلص السلسلة النصية echo عن طريق استدعاء التابع objectAtIndex
للحصول على الوسيط الأول الموجود في المصفوفة arguments
، والذي يتوافق مع الوسائط المُمررة من قبل دالة جافاسكريبت exec()
.
تتحقق الشيفرة من أن الوسيط لا يساوي القيمة nil
أو سلسلة نصية فارغة، ثم تعيد PluginResult
مع الحالة ERROR
إن كان الأمر كذلك. أما إذا اجتاز الوسيط الاختبار، فسيُعاد PluginResult
مع حالة تساوي OK
، ثم يُمرر إلى السلسلة النصية الأصلية echo
. وأخيرًا، تُرسل النتيجة إلى التابع self.commandDelegate
، والذي ينفذ دوال النجاح أو الإخفاق (success or failure callbacks) الخاصة بالتابع exec
على جانب جافاسكريبت. في حال استدعاء دالة النجاح، فسيُمرر إليها الوسيط echo
.
التكامل مع منصة iOS
يوفر الصنف CDVPlugin
توابع أخرى يمكن إعادة تعريفها من قبل الإضافة. على سبيل المثال، يمكنك إمساك الأحداث pause
و resume
و إنهاء التطبيق (app terminate) و handleOpenURL
. راجع الصنفين CDVPlugin.h و CDVPlugin.m لأجل الإرشادات.
المهام الفرعية (Threading)
تنفّذ توابع الإضافة عادةً في نفس المهمة الفرعية التي تشتغل عليها الواجهة الرئيسية. إن كانت الإضافة تتطلب قدرًا كبيرًا من المعالجة، أو تتطلب القيام باستدعاء مُعطِّل (blocking call)، فعليك استخدام مهمة فرعية خلفية (background thread). مثلا:
- (void)myPluginMethod:(CDVInvokedUrlCommand*)command
{
// هنا command.arguments تحقق من
[self.commandDelegate runInBackground:^{
NSString* payload = nil;
// Some blocking logic...
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
// آمن في المهام الفرعية sendPluginResult استخدام
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}];
}
تصحيح إضافات iOS (Debugging iOS Plugins)
لتصحيح الأخطاء في شيفرة Objective-C، سيكون عليك استخدام المُصحِّح المدمج في Xcode. أما بالنسبة إلى جافاسكريبت، فيمكنك ربط Safari بالتطبيق عبر محاكي أو جهاز iOS.
أخطاء شائعة
- لا تنسَ إدراج خريطة الإضافة (plugin's mapping) إلى الملف
config.xml
. وإلا فسيُسجّل خطأ في وحدة تحكم Xcode. - لا تنس إضافة كل المضيفات التي تتصل بها في القائمة البيضاء. وإلا فسيُسجّل خطأ في وحدة تحكم Xcode.
انظر أيضا
- صفحة دليل تطوير الإضافات