الفرق بين المراجعتين لصفحة: «Cordova/plugins windows»

من موسوعة حسوب
لا ملخص تعديل
تحديث
 
(7 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:إضافات  ويندوز في كوردوفا}}</noinclude>
<noinclude>{{DISPLAYTITLE:تطوير الإضافات على منصة ويندوز في كوردوفا}}</noinclude>
[[تصنيف: Cordova]]
[[تصنيف: Cordova]]
[[تصنيف: plugins]]
يقدم هذا القسم تفاصيل عن كيفية تنفيذ إضافة لاستخدامها في متجر تطبيقات ويندوز للهواتف وسطح المكتب في ويندوز 8.1 للهاتف (Windows 8.1 phone)، ومنصة ويندوز الكونية (Universal Windows [ويندوز 10+]‎‎). قبل قراءة هذه الصفحة، يرجى قراءة صفحة [[Cordova/plugins|دليل تطوير الإضافات]] للحصول على نظرة عامة على بنية الإضافات وواجهة [[JavaScript|JavaScript]] الخاصة بها. يستمر هذا القسم في تطوير مثال [[Cordova/plugins#.D9.85.D8.AB.D8.A7.D9.84 JavaScript|الإضافة echo]] الوارد في [[Cordova/plugins|دليل تطوير الإضافات]]، والذي يربط الاتصال بين المعرض [[Cordova/webviews|webview]] الخاص بكوردوفا وبين المنصة الأصلية.
[[تصنيف: Windows]]
[[تصنيف: Cordova Plugin]]
يقدم هذا القسم تفاصيل عن كيفية تقديم (implement) إضافة لاستخدامها في متجر تطبيقات ويندوز للهواتف وسطح المكتب في ويندوز 8.ومنصة ويندوز الكونية (Universal Windows [ويندوز 10+]‎‎). قبل قراءة هذه الصفحة، المرجو مراجعة صفحة [[Cordova/plugins|دليل تطوير الإضافات]] .
==إنشاء إضافة ويندوز عبر جافاسكريبت==
 
إضافات ويندوز كوردوفا هي بالأساس أغلفة (wrapper) رقيقة حول دوال المكتبة WinJS، ولكن إن كنت تحتاج إلى تعريف واجهة [[JavaScript|JavaScript]] مشتركة بين عدة أجهزة، فستحتاج عادةً إلى ملف [[JavaScript|JavaScript]] واحد يوفر تلك الواجهة البرمجية (API):<syntaxhighlight lang="javascript">// echoplugin.js داخل الملف
للحصول على نظرة عامة على بنية الإضافات وواجهة [[JavaScript|جافاسكريبت]] الخاصة بها. يستمر هذا القسم في تطوير [[Cordova/plugins#.D9.85.D8.AB.D8.A7.D9.84 JavaScript|مثال الإضافة <code>echo</code>]] الوارد في دليل تطوير الإضافات، والذي يربط الاتصال بين المعرض [[Cordova/webviews|webview]] الخاص بكوردوفا وبين المنصة الأصلية.
 
== إنشاء إضافة ويندوز عبر جافاسكريبت ==  
 
إضافات ويندوز كوردوفا هي بالأساس أغلفة رقيقة (thin wrapper) حول دوال المكتبة WinJS، ولكن إن كنت تحتاج إلى تعريف واجهة [[JavaScript|جافاسكريبت]] مشتركة بين عدة أجهزة، فستحتاج عادةً إلى ملف [[JavaScript|جافاسكريبت]] واحد يوفر تلك الواجهة البرمجية (API):  
<syntaxhighlight lang="javascript">// inside file echoplugin.js
var EchoPlugin = {
var EchoPlugin = {
     // the echo function calls successCallback with the provided text in strInput
     // strInput مع النص المُوفّر في successCallback  تستدعي echo الدالة
     // if strInput is empty, it will call the errorCallback
     // errorCallback فارغة ستقوم باستدعاء strInput إن كانت
     echo:function(successCallback, errorCallback, strInput) {
     echo:function(successCallback, errorCallback, strInput) {
         cordova.exec(successCallback,errorCallback,"EchoPlugin","echo",[strInput]);
         cordova.exec(successCallback,errorCallback,"EchoPlugin","echo",[strInput]);
     }
     }
}‎</syntaxhighlight>  
}‎</syntaxhighlight>يختلف تعريف الدالة <code>cordova.exec</code> من منصة إلى أخرى، وذلك لأن لكل منصة طريقتها الخاصة في التواصل بين شيفرة [[JavaScript|JavaScript]]، والشيفرة الأصلية المُغلّفة (native wrapper code). ولكن في حالة ويندوز، لا يوجد غلاف أصلي، لذلك فاستدعاء <code>exec</code> هو مجرد اصطلاح لتوفير واجهة متناسقة. لذلك، على الرغم من أنه يمكنك كتابة الشيفرة البرمجية الخاصة بويندوز كجزء من ملف [[JavaScript|JavaScript]] المشترك (الخاص بالإضافة) مباشرةً، إلا أننا لا نوصي بذلك، فيجب على مطوري الإضافات استخدام نفس الواجهة البرمجية <code>exec</code> في ويندوز كما في بقية المنصات الأخرى. وبهذه الطريقة تصبح الواجهة البرمجية للإضافات متسقة، كما يمكنك أيضًا الاستفادة من أي فحص للمعاملات، أو الشيفرات الأخرى الشائعة التي يوفرها المطورون على المنصات الأخرى.


يختلف تعريف الدالة <code>cordova.exec</code> من منصة إلى أخرى، وذلك لأن لكل منصة طريقتها الخاصة في التواصل بين شيفرة ال[[JavaScript|جافاسكريبت]]، والشيفرة الأصلية المُغلّفة (native wrapper code). ولكن في حالة ويندوز، لا يوجد غلاف أصلي، لذلك فاستدعاء <code>exec</code> هو فقط لتوفير واجهة متناسقة. لذلك، على الرغم من أنه يمكنك كتابة الشيفرة البرمجية الخاصة بويندوز كجزء من ملف [[JavaScript|جافاسكريبت]] المشترك (الخاص بالإضافة) مباشرةً، إلا أننا لا نوصى بذلك، فيجب على مطوري الإضافات استخدام نفس الواجهة البرمجية <code>exec</code> في ويندوز كما في بقية المنصات الأخرى. وبهذه الطريقة تصبح الواجهة البرمجية للإضافات متسقة، كما يمكنك أيضًا الاستفادة من أي فحص للوسائط، أو أي الشيفرات الأخرى الشائعة التي يوفرها المطورون على المنصات الأخرى.  
على ويندوز، توفر كوردوفا خادمًا وسيطًا (proxy) يمكن استخدامه لتسجيل كائن معين يتكلّف بالتعامل مع جميع استدعاءات <code>cordova.exec</code> في الواجهة البرمجية (API). لذا، سنفترض في حالتنا أن الشيفرة الموجودة في الملف <code>echoplugin.js</code> ستعالج أكواد [[JavaScript|JavaScript]] العابرة للمنصات (cross platform)، وهكذا يمكننا ببساطة كتابة خادمٍ وسيط لنظام ويندوز.


على ويندوز، توفر كوردوفا خادمًا وسيطًا (proxy) يمكن استخدامه لتسجيل كائن معين يتكلّف بالتعامل مع جميع استدعاءات <code>cordova.exec</code> في الواجهة البرمجية (API). لذلك في حالتنا، سنفترض أن الشيفرة الموجودة في الملف <code>echoplugin.js</code> ستعالج أكواد [[JavaScript|جافاسكريبت]] العابرة للمنصات (cross platform)، وهكذا يمكننا ببساطة كتابة خادمٍ وسيطٍ لنظام ويندوز.
في الملف <code>echoplugin.js</code>:<syntaxhighlight lang="javascript">// echoplugin.js في الملف
<syntaxhighlight lang="javascript">// in file echoplugin.js
window.echo = function(str, callback) {
window.echo = function(str, callback) {
     cordova.exec(callback, function(err) {
     cordova.exec(callback, function(err) {
         callback('Nothing to echo.');
         callback('Nothing to echo.');
     }, "Echo", "echo", [str]);
     }, "Echo", "echo", [str]);
};‎</syntaxhighlight>
};‎</syntaxhighlight>وفي الملف <code>echopluginProxy.js</code>:<syntaxhighlight lang="javascript">// echopluginProxy.js في الملف
<syntaxhighlight lang="javascript">// in file echopluginProxy.js
cordova.commandProxy.add("Echo",{
cordova.commandProxy.add("Echo",{
     echo:function(successCallback,errorCallback,strInput) {
     echo:function(successCallback,errorCallback,strInput) {
سطر 38: سطر 30:
         }
         }
     }
     }
});‎</syntaxhighlight>  
});‎</syntaxhighlight>سيعيد الملف <code>echoplugin.js</code> توجيه استدعاء الدالة <code>echo</code> إلى الخادم الوسيط عبر الأمر <code>cordova.exec</code> ثم ينفّذ هذا التقديم (implementation).


سيعيد الملف <code>echoplugin.js</code> توجيه استدعاء الدالة <code>echo</code> إلى الخادم الوسيط عبر الأمر <code>cordova.exec</code> ثم ينفّذ هذا التقديم (implementation).
سيحتوي الملف <code>plugin.xml</code> على الإعدادات المطلوبة في الََإضافة. وفي هذه الحالة، نريد إضافة الملف <code>echoplugin.js</code> إلى المجلد <code>www</code>، وإضافة الملف <code>echopluginProxy.js</code> داخل الشيفرة المصدرية <code>windows</code> الخاصة بتطبيقنا. يمكن العثور على مزيد من التفاصيل حول هذه العناصر في المرجع <code>[https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html Plugin xml]</code>.<syntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8"?>
 
سيحتوي الملف <code>plugin.xml</code> على الإعدادات المطلوبة في الََإضافة. وفي هذه الحالة، نريد إضافة الملف <code>echoplugin.js</code> في المجلد <code>www</code>، وإضافة الملف <code>echopluginProxy.js</code> داخل الشيفرة المصدرية <code>windows</code> الخاصة بتطبيقنا. يمكن العثور على مزيد من التفاصيل حول هذه العناصر في المرجع <code>[https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html Plugin xml]</code>.  
<syntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
     id="echoplugin"
     id="echoplugin"
سطر 56: سطر 45:
         </js-module>
         </js-module>
     </platform>
     </platform>
     <!-- other platforms -->
     <!-- منصات أخرى -->
</plugin>‎c</syntaxhighlight>  
</plugin>‎c</syntaxhighlight>سينتج عن هذا إضافة ويندوز-[[JavaScript|جافاسكريبت]] جاهزة، والتي تستخدم ملفًا مشتركًا (هو echoplugin.js)، وخادمًا وسيطًا لتوفير الأجزاء المخصوصة بويندوز في الملف (echopluginProxy.js).


سينتج عن هذا إضافة ويندوز-[[JavaScript|جافاسكريبت]] جاهزة، والتي تستخدم ملفًا مشتركًا (<code>echoplugin.js</code>)، وخادمًا وسيطًا لتوفير الأجزاء المخصوصة بويندوز في الملف (<code>echopluginProxy.js</code>). إذن، كيف يمكننا إضافة شيفرة أصلية ومٌدارة (native/managed code) إلى هذا؟ حسنًا، سنعيد ما فعلناه من قبل، الفرق الوحيد هو ما سنفعله داخل توابع <code>echopluginProxy</code>.  
إذًا، كيف يمكننا إضافة شيفرة أصلية ومٌدارة (native/managed code) إلى هذا؟ حسنًا، سنعيد ما فعلناه من قبل، الفرق الوحيد هو ما سنفعله داخل توابع <code>echopluginProxy</code>.
 
==إنشاء إضافات ويندوز بلغة C++‎ أو الشيفرة المُدارة (managed code).==
== إنشاء إضافات ويندوز في C++‎ أو الشيفرة المُدارة (managed code).==  
في نظام ويندوز، يمكن لتطبيقات [[JavaScript|جافاسكريبت]] أن تتداخل مع اللغات الأصلية (مثل لغة C++‎) والشيفرات المُدارة (مثل لغة C#، و VB) عن طريق إنشاء مُركّبة في ويندوز تعمل وقت تشغيل. يمكنك تعلم الأساسيات والحصول على مزيد من التفاصيل في مراجع MSDN التالية:
 
*[https://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx انشاء مركبات ويندوز تعمل وقت التشغيل بلغة  C# و Visual Basic]
في نظام ويندوز، تستطيع تطبيقات [[JavaScript|جافااسكريبت]] أن تتداخل مع اللغات الأصلية (C++‎) والشيفرات المُدارة (C#، VB) عن طريق إنشاء مُركّبة (component) في ويندوز تعمل وقت تشغيل. يمكنك تعلم الأساسيات والحصول على مزيد من التفاصيل في مراجع MSDN:  
*[http://msdn.microsoft.com/en-us/library/windows/apps/hh441569.aspx انشاء مركبات ويندوز تعمل وقت التشغيل بلغة C++]
[https://msdn.microsoft.com/en-us/library/windows/apps/br230301.aspx Creating Windows Runtime Components in C# and Visual Basic]  
عندما تنشئ مركبة ويندوز تعمل وقت التشغيل (Windows Runtime Component)، فإن كل الأصناف التي عُرِّفت وفق الصيغة <code>public ref class sealed</code> ستُعد "أصنافًا قابلًة للتنشيط" (activatable class)، وستكون قابلة للاستدعاء من [[JavaScript|جافاسكريبت]].<syntaxhighlight lang="c++">// .h في الملف الرئيسي
[http://msdn.microsoft.com/en-us/library/windows/apps/hh441569.aspx Creating Windows Runtime Components in C++]  
 
عندما تقوم بإنشاء مركبة وقت التشغيل في ويندوز (Windows Runtime Component)، فإن كل الأصناف التي عُرِّفت وفق الصيغة <code>public ref class sealed</code> ستُعد "صنفًا فعالا" (activatable class)، وسيكون قابلًا للاستدعاء من [[JavaScript|جافااسكريبت]].  
<syntaxhighlight lang="javascript">// in your header file .h
namespace EchoRuntimeComponent
namespace EchoRuntimeComponent
{
{
سطر 77: سطر 62:
     }
     }
}
}
// in the implementation file .cpp
// .cpp في ملف التقديم
using namespace EchoRuntimeComponent;
using namespace EchoRuntimeComponent;
using namespace Platform;
using namespace Platform;
سطر 90: سطر 75:
         return input->ToString() + "echo";
         return input->ToString() + "echo";
     }
     }
}‎</syntaxhighlight>  
}‎</syntaxhighlight>ليتسنى لنا استدعاء الشيفرة الأصلية، سنستخدم اسم المجال (namespace)، واسم الصنف، والاسم بنمط سنام الجمل (lowerCamelCase) للتابع الذي نود استدعاءه، كما هو موضح أدناه:<syntaxhighlight lang="javascript">var res = EchoRuntimeComponent.EchoPluginRT.echo("boom");‎</syntaxhighlight>بنقل هذا إلى الملف <code>echopluginProxy.js</code>، سنحصل على ما يلي:<syntaxhighlight lang="c++">// echopluginProxy.js في الملف
 
الآن حتى يتسنى لنا استدعاء الشيفرة الأصلية، نستخدم اسم المجال (namespace)، واسم الصنف، و الاسم المُحدب (lowerCamelCase) للتابع الذي نستدعيه.
<syntaxhighlight lang="javascript">var res = EchoRuntimeComponent.EchoPluginRT.echo("boom");‎</syntaxhighlight>  
 
بنقل هذا إلى الملف echopluginProxy.js، سنحصل على:  
<syntaxhighlight lang="javascript">// in file echopluginProxy.js
cordova.commandProxy.add("EchoPlugin",{
cordova.commandProxy.add("EchoPlugin",{
     echo:function(successCallback, errorCallback, strInput) {
     echo:function(successCallback, errorCallback, strInput) {
سطر 107: سطر 86:
         }
         }
     }
     }
});‎</syntaxhighlight>  
});‎</syntaxhighlight>وهذا كل شيء، صارت لدينا إضافة ويندوز كوردوفا مع ملف [[JavaScript|جافاسكريبت]] قابل للاستدعاء ومربوط ومدعوم بلغة C++‎.
 
===أشياء يجب أخذها بالحسبان===
وهذا كل شيء، صارت لدينا إضافة ويندوز كوردوفا مع ملف [[JavaScript|جافااسكريبت]] قابل للاستدعاء ومربوط ومدعوم بملف C++‎.  
*عادةً ما يكون رد النداء (callback) غير متزامن، لذلك فقد لا يتوقع المُستدعي (caller) أن يكون الرد فوريًا. لكن إن لم يكن الاستدعاء غير متزامن، فعليك على الأقل استخدام مُهلة في [[JavaScript|جافاسكريبت]] (javascript timeout) لضمان أن يكون استدعاء رد النداء غير متزامن.
=== اعتبارات ===  
*يمكن استخدام الأصناف القابلة للتنشيط (Activatable classes) لإرسال الأحداث (event dispatching)، أو الردود المتزامنة، أو تمرير أنواع كائنات خاصة، أو المصفوفات، أو المجموعات، أو التوابع المُحمّلة (overloaded methods) وغير ذلك. ارجع إلى صفحة [http://msdn.microsoft.com/en-us/library/windows/apps/hh441569.aspx انشاء مركبات ويندوز تعمل وقت التشغيل بلغة C++ ] لمزيد من التفاصيل.
* عادة ما يكون الرد (callback ) غير متزامن، لذلك قد لا يتوقع المُستدعي (caller) أن يكون الرد فوريًا. لكن إن لم يكن الاستدعاء غير متزامن، فعليك على الأقل استخدام مهلة [[JavaScript|جافااسكريبت]] (javascript timeout) لضمان أن يكون استدعاء الرد غير متزامن.  
===تعريف الإضافة في الملف plugin.xml===
* يمكن استخدام الأصناف القابلة للتنشيط (Activatable classes) لإرسال الأحداث (event dispatching)، أو الردود المتزامنة، أو تمرير أنواع كائنات خاصة، أو المصفوفات، أو المجموعات، أو التوابع المُتحاملة (overloaded methods)، وغير ذلك. ارجع إلى [http://msdn.microsoft.com/en-us/library/windows/apps/hh441569.aspx Creating Windows Runtime Components in C++] لمزيد من التفاصيل.  
والآن بعد أن أصبحت إضافتنا جاهزة للعمل، سيكون علينا إعادة النظر في تعريف الإضافة السابق لأجل نشرها. يمكننا الآن إضافة مركبة تعمل وقت التشغيل (runtime component) كإطار عمل، من خلال الوسم <code><framework></code> داخل إعدادات منصتنا. لاحظ أنّ امتداد المخرجات <code>WindowsRuntimeComponent</code> قد يكون إما ‎<code>.winmd</code> أو <code>‎.‎dll</code>:<syntaxhighlight lang="xml"><?xml version="1.0" encoding="UTF-8"?>
=== تعريف الإضافة في الملف plugin.xml ===  
 
والآن بعد أن أصبحت إضافتنا جاهزة للعمل، سيكون علينا إعادة النظر في التعريف السابق للإضافة لكي ننشره. يمكننا الآن إضافة مركب وقت التشغيل (runtime component) كإطار عمل، من خلال الوسم <code><framework></code> داخل إعدادات منصتنا. لاحظ أن نوع مخرجات WindowsRuntimeComponent قد تكون إما ‎.winmd أو ‎.‎dll  
<syntaxhighlight lang="javascript"><?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
     id="echoplugin"
     id="echoplugin"
سطر 123: سطر 98:
         <clobbers target="window.echoplugin" />
         <clobbers target="window.echoplugin" />
     </js-module>
     </js-module>
     <!-- windows -->
     <!-- ويندوز-->
     <platform name="windows">
     <platform name="windows">
         <js-module src="src/windows/echopluginProxy.js" name="EchoProxy">
         <js-module src="src/windows/echopluginProxy.js" name="EchoProxy">
سطر 130: سطر 105:
         <framework src="src/windows/EchoRuntimeComponent.winmd" custom="true"/>
         <framework src="src/windows/EchoRuntimeComponent.winmd" custom="true"/>
     </platform>
     </platform>
     <!-- other platforms -->
     <!-- منصات أخرى -->
</plugin>‎</syntaxhighlight>  
</plugin>‎</syntaxhighlight>هذا كل شيء، إضافتك الآن صارت جاهزة لتشاركها مع العالم.
 
== انظر أيضًا ==
*[[Cordova/plugins android|إضافات أندرويد]]
*[[Cordova/plugins ios|إضافات ios]]


هذا كل شيء، إضافتك الآن صارت جاهزة لتشاركها مع العالم!
*[[Cordova/plugins|دليل تطوير الإضافات]]
==مصادر==
==مصادر==
*[https://cordova.apache.org/docs/en/latest/guide/platforms/windows/plugin.html قسم إضافات windows في التوثيق الرسمي لكوردوفا.]
*[https://cordova.apache.org/docs/en/latest/guide/platforms/windows/plugin.html صفحة Windows Plugins في توثيق كوردوفا الرسمي.]

المراجعة الحالية بتاريخ 11:27، 1 ديسمبر 2020

يقدم هذا القسم تفاصيل عن كيفية تنفيذ إضافة لاستخدامها في متجر تطبيقات ويندوز للهواتف وسطح المكتب في ويندوز 8.1 للهاتف (Windows 8.1 phone)، ومنصة ويندوز الكونية (Universal Windows [ويندوز 10+]‎‎). قبل قراءة هذه الصفحة، يرجى قراءة صفحة دليل تطوير الإضافات للحصول على نظرة عامة على بنية الإضافات وواجهة JavaScript الخاصة بها. يستمر هذا القسم في تطوير مثال الإضافة echo الوارد في دليل تطوير الإضافات، والذي يربط الاتصال بين المعرض webview الخاص بكوردوفا وبين المنصة الأصلية.

إنشاء إضافة ويندوز عبر جافاسكريبت

إضافات ويندوز كوردوفا هي بالأساس أغلفة (wrapper) رقيقة حول دوال المكتبة WinJS، ولكن إن كنت تحتاج إلى تعريف واجهة JavaScript مشتركة بين عدة أجهزة، فستحتاج عادةً إلى ملف JavaScript واحد يوفر تلك الواجهة البرمجية (API):

// echoplugin.js داخل الملف
var EchoPlugin = {
    // strInput مع النص المُوفّر في successCallback  تستدعي echo الدالة
    // errorCallback فارغة ستقوم باستدعاء strInput إن كانت
    echo:function(successCallback, errorCallback, strInput) {
        cordova.exec(successCallback,errorCallback,"EchoPlugin","echo",[strInput]);
    }
}

يختلف تعريف الدالة cordova.exec من منصة إلى أخرى، وذلك لأن لكل منصة طريقتها الخاصة في التواصل بين شيفرة JavaScript، والشيفرة الأصلية المُغلّفة (native wrapper code). ولكن في حالة ويندوز، لا يوجد غلاف أصلي، لذلك فاستدعاء exec هو مجرد اصطلاح لتوفير واجهة متناسقة. لذلك، على الرغم من أنه يمكنك كتابة الشيفرة البرمجية الخاصة بويندوز كجزء من ملف JavaScript المشترك (الخاص بالإضافة) مباشرةً، إلا أننا لا نوصي بذلك، فيجب على مطوري الإضافات استخدام نفس الواجهة البرمجية exec في ويندوز كما في بقية المنصات الأخرى. وبهذه الطريقة تصبح الواجهة البرمجية للإضافات متسقة، كما يمكنك أيضًا الاستفادة من أي فحص للمعاملات، أو الشيفرات الأخرى الشائعة التي يوفرها المطورون على المنصات الأخرى.

على ويندوز، توفر كوردوفا خادمًا وسيطًا (proxy) يمكن استخدامه لتسجيل كائن معين يتكلّف بالتعامل مع جميع استدعاءات cordova.exec في الواجهة البرمجية (API). لذا، سنفترض في حالتنا أن الشيفرة الموجودة في الملف echoplugin.js ستعالج أكواد JavaScript العابرة للمنصات (cross platform)، وهكذا يمكننا ببساطة كتابة خادمٍ وسيط لنظام ويندوز.

في الملف echoplugin.js:

// echoplugin.js في الملف
window.echo = function(str, callback) {
    cordova.exec(callback, function(err) {
        callback('Nothing to echo.');
    }, "Echo", "echo", [str]);
};

وفي الملف echopluginProxy.js:

// echopluginProxy.js في الملف
cordova.commandProxy.add("Echo",{
    echo:function(successCallback,errorCallback,strInput) {
        if(!strInput || !strInput.length) {
            errorCallback("Error, something was wrong with the input string. =>" + strInput);
        }
        else {
            successCallback(strInput + "echo");
        }
    }
});

سيعيد الملف echoplugin.js توجيه استدعاء الدالة echo إلى الخادم الوسيط عبر الأمر cordova.exec ثم ينفّذ هذا التقديم (implementation). سيحتوي الملف plugin.xml على الإعدادات المطلوبة في الََإضافة. وفي هذه الحالة، نريد إضافة الملف echoplugin.js إلى المجلد www، وإضافة الملف echopluginProxy.js داخل الشيفرة المصدرية windows الخاصة بتطبيقنا. يمكن العثور على مزيد من التفاصيل حول هذه العناصر في المرجع Plugin xml.

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="echoplugin"
    version="0.1.0">
    <js-module src="www/echoplugin.js" name="echoplugin">
        <clobbers target="window.echoplugin" />
    </js-module>
    <!-- windows -->
    <platform name="windows">
        <js-module src="src/windows/echopluginProxy.js" name="EchoProxy">
            <merges target="" />
        </js-module>
    </platform>
    <!-- منصات أخرى -->
</plugin>‎c

سينتج عن هذا إضافة ويندوز-جافاسكريبت جاهزة، والتي تستخدم ملفًا مشتركًا (هو echoplugin.js)، وخادمًا وسيطًا لتوفير الأجزاء المخصوصة بويندوز في الملف (echopluginProxy.js).

إذًا، كيف يمكننا إضافة شيفرة أصلية ومٌدارة (native/managed code) إلى هذا؟ حسنًا، سنعيد ما فعلناه من قبل، الفرق الوحيد هو ما سنفعله داخل توابع echopluginProxy.

إنشاء إضافات ويندوز بلغة C++‎ أو الشيفرة المُدارة (managed code).

في نظام ويندوز، يمكن لتطبيقات جافاسكريبت أن تتداخل مع اللغات الأصلية (مثل لغة C++‎) والشيفرات المُدارة (مثل لغة C#، و VB) عن طريق إنشاء مُركّبة في ويندوز تعمل وقت تشغيل. يمكنك تعلم الأساسيات والحصول على مزيد من التفاصيل في مراجع MSDN التالية:

عندما تنشئ مركبة ويندوز تعمل وقت التشغيل (Windows Runtime Component)، فإن كل الأصناف التي عُرِّفت وفق الصيغة public ref class sealed ستُعد "أصنافًا قابلًة للتنشيط" (activatable class)، وستكون قابلة للاستدعاء من جافاسكريبت.

// .h في الملف الرئيسي
namespace EchoRuntimeComponent
{
    public ref class EchoPluginRT sealed
    {
        public:
        static Platform::String^ Echo(Platform::String^ input);
    }
}
//  .cpp في ملف التقديم
using namespace EchoRuntimeComponent;
using namespace Platform;
Platform::String^ EchoPluginRT::Echo(Platform::String^ input)
{
    if(input->IsEmpty())
    {
        return "Error: input string is empty.";
    }
    else
    {
        return input->ToString() + "echo";
    }
}

ليتسنى لنا استدعاء الشيفرة الأصلية، سنستخدم اسم المجال (namespace)، واسم الصنف، والاسم بنمط سنام الجمل (lowerCamelCase) للتابع الذي نود استدعاءه، كما هو موضح أدناه:

var res = EchoRuntimeComponent.EchoPluginRT.echo("boom");

بنقل هذا إلى الملف echopluginProxy.js، سنحصل على ما يلي:

//  echopluginProxy.js في الملف
cordova.commandProxy.add("EchoPlugin",{
    echo:function(successCallback, errorCallback, strInput) {
        var res = EchoRuntimeComponent.EchoPluginRT.echo(strInput);
        if(res.indexOf("Error") == 0) {
            errorCallback(res);
        }
        else {
            successCallback(res);
        }
    }
});

وهذا كل شيء، صارت لدينا إضافة ويندوز كوردوفا مع ملف جافاسكريبت قابل للاستدعاء ومربوط ومدعوم بلغة C++‎.

أشياء يجب أخذها بالحسبان

  • عادةً ما يكون رد النداء (callback) غير متزامن، لذلك فقد لا يتوقع المُستدعي (caller) أن يكون الرد فوريًا. لكن إن لم يكن الاستدعاء غير متزامن، فعليك على الأقل استخدام مُهلة في جافاسكريبت (javascript timeout) لضمان أن يكون استدعاء رد النداء غير متزامن.
  • يمكن استخدام الأصناف القابلة للتنشيط (Activatable classes) لإرسال الأحداث (event dispatching)، أو الردود المتزامنة، أو تمرير أنواع كائنات خاصة، أو المصفوفات، أو المجموعات، أو التوابع المُحمّلة (overloaded methods) وغير ذلك. ارجع إلى صفحة انشاء مركبات ويندوز تعمل وقت التشغيل بلغة C++ ‎ لمزيد من التفاصيل.

تعريف الإضافة في الملف plugin.xml

والآن بعد أن أصبحت إضافتنا جاهزة للعمل، سيكون علينا إعادة النظر في تعريف الإضافة السابق لأجل نشرها. يمكننا الآن إضافة مركبة تعمل وقت التشغيل (runtime component) كإطار عمل، من خلال الوسم <framework> داخل إعدادات منصتنا. لاحظ أنّ امتداد المخرجات WindowsRuntimeComponent قد يكون إما ‎.winmd أو ‎.‎dll:

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="echoplugin"
    version="0.2.0">
    <js-module src="www/echoplugin.js" name="echoplugin">
        <clobbers target="window.echoplugin" />
    </js-module>
    <!-- ويندوز-->
    <platform name="windows">
        <js-module src="src/windows/echopluginProxy.js" name="EchoProxy">
            <merges target="" />
        </js-module>
        <framework src="src/windows/EchoRuntimeComponent.winmd" custom="true"/>
    </platform>
    <!-- منصات أخرى -->
</plugin>

هذا كل شيء، إضافتك الآن صارت جاهزة لتشاركها مع العالم.

انظر أيضًا

مصادر