Плагины Windows Phone 8
Этот раздел содержит подробную информацию о том, как реализовать нативный код плагина на платформе Windows Phone. Прежде чем приступать к чтению, ознакомьтесь с Руководством по разработке плагинов для общего обзора структуры плагина и его общего интерфейса JavaScript. В этом разделе продолжается демонстрация примера плагина echo, который осуществляет взаимодействие между веб-вью Cordova и нативной платформой.
Для написания плагина для Cordova на Windows Phone необходимо базовое понимание архитектуры Cordova. Cordova-WP8 состоит из WebBrowser , который размещает код JavaScript приложения и управляет вызовами нативных API. Вы можете расширить класс C# BaseCommand (WPCordovaClassLib.Cordova.Commands.BaseCommand), который поставляется с большей частью необходимой функциональности:
Выберите свой проект и щелкните правой кнопкой мыши, чтобы выбрать Добавить → Новый элемент... Если хотите, вы можете добавить его в папку
Plugins.Выберите Класс и назовите его
Echo.cs. Это имя класса должно точно совпадать с тем, что вы указываете в качестве сервиса в вызовеcordova.exec()на стороне JavaScript.-
Включите реализацию базовых классов:
using WPCordovaClassLib.Cordova; using WPCordovaClassLib.Cordova.Commands; using WPCordovaClassLib.Cordova.JSON;
-
Расширьте свой класс от
BaseCommand.public class Echo : BaseCommand { // ... } -
Добавьте метод
echo, который можно вызывать из JavaScript:public class Echo : BaseCommand { public void echo(string options) { // all JS callable plugin methods MUST have this signature! // public, returning void, 1 argument that is a string } }
Обратитесь к классу BaseCommand.cs для получения методов, которые можно переопределить в плагине. Например, плагин может перехватывать события паузы и возобновления.
Пространства имён
По умолчанию пространство имён для неквалифицированных команд:
namespace Cordova.Extension.Commands
{
// ...
}
Если вы хотите указать собственное пространство имён, вам необходимо выполнить полностью квалифицированный вызов cordova.exec. Например, если вы хотите определить свой класс C# так:
namespace com.mydomain.cordovaExtensions
{
public class Echo : BaseCommand
{
// ...
}
}
JavaScript необходимо будет вызвать exec следующим образом:
cordova.exec(win, fail, "com.mydomain.cordovaExtensions.Echo", ...);
Интерпретация аргументов в C#
В примере, обсуждаемом в разделе Плагины приложения, данные, получаемые вашим плагином, — это строка, но что, если вы хотите передать массив строк? Предположим, что вызов JavaScript cordova.exec задан следующим образом:
cordova.exec(win, fail, "Echo", "echo", ["input string"]);
Значение строки options, переданной методу Echo.echo, представляет собой JSON:
"[\"input string\"]"
Все аргументы JavaScript exec кодируются в JSON перед передачей в C#, и поэтому их необходимо декодировать:
string optVal = JsonHelper.Deserialize<string[]>(options)[0]; // optVal now has the value of "input string"
Передача результатов из C# в JavaScript
Класс BaseCommand предоставляет методы для передачи данных обработчикам обратного вызова JavaScript. Если вы просто хотите сообщить об успехе без сопровождающего результата, вы можете просто вызвать:
DispatchCommandResult(); // calls back with an empty plugin result, considered a success callback
Для передачи данных необходимо вызвать DispatchCommandResult по-другому:
DispatchCommandResult(new PluginResult(PluginResult.Status.OK, "Everything went as planned, this is a result that is passed to the success handler."));
Используйте закодированную строку JSON для передачи структурированных данных объекта обратно в JavaScript:
DispatchCommandResult(new PluginResult(PluginResult.Status.OK, "{result:\"super awesome!\"}"));
Для сообщения об ошибке вызовите DispatchCommandResult с объектом PluginResult, статус которого ERROR.
DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Echo signaled an error"));
Обработка ошибок сериализации
При интерпретации аргументов блоки try/catch помогают отфильтровать некорректные входные данные. Этот шаблон встречается в коде Cordova на C#:
string optVal = null;
try
{
optVal = JsonHelper.Deserialize<string[]>(options)[0];
}
catch(Exception)
{
// simply catch the exception, we handle null values and exceptions together
}
if (optVal == null)
{
DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
}
else
{
// ... continue on to do our work
}
Жизненный цикл плагина
Плагины с долговременными запросами, фоновой деятельностью, такой как воспроизведение медиа, слушателями или сохранением внутреннего состояния, должны реализовать метод onReset для очистки этих действий. Метод выполняется при переходе веб-браузера CordovaView на новую страницу или при обновлении, что перезагружает JavaScript.
// defined in WPCordovaClassLib.Cordova.Commands.BaseCommand
public virtual void OnReset() { }
XML-файл плагина
Ниже показано, как использовать файл plugin.xml для указания исходных файлов плагина на платформе Windows Phone. См. Плагины приложения для обзора и Спецификацию плагина для получения подробной информации о доступных параметрах.
Элемент
<source-file>определяет все ресурсы плагина, такие как файлы .cs, .xaml, .xaml.cs и .dll, а также изображения.-
Элемент
<config-file>определяет элементы для вставки в файл конфигурации. В этом примере плагин добавляется в файлconfig.xmlплатформы:<config-file target="config.xml" parent="/*"> <feature name="PluginName"> <param name="wp-package" value="PluginName"/> </feature> </config-file>
Этот пример добавляет возможность контактов в файл WMAppManifest.xml:
<config-file target="Properties/WMAppManifest.xml" parent="/Deployment/App/Capabilities">
<Capability Name="ID_CAP_CONTACTS" />
</config-file>
Отладка плагинов
Используйте отладчик Visual Studio для отладки компонента C# плагина. Вы можете установить точку останова в любом из методов, предоставляемых вашим классом.
Отладка JavaScript на Windows Phone более сложная. Вам нужно использовать console.log для вывода состояния плагина или получения информации об ошибках.
Общие ошибки
-
Будьте внимательны, чтобы не передавать в нативную сторону аргументы из JavaScript, которые сложно десериализовать как JSON. Большинство платформ устройств ожидают, что аргумент, переданный в
cordova.exec(), будет массивом, например:cordova.exec(win, fail, "ServiceName", "MethodName", ["this is a string", 54, {literal:'trouble'}]);
Это может привести к слишком сложной строке значения для декодирования в C#:
"[\"this is a string\", 54, { literal:'trouble' }]"
Вместо этого рассмотрите возможность преобразования всех параметров в строки перед вызовом exec(), и декодирование каждого отдельно:
cordova.exec(win, fail, "ServiceName", "MethodName", ["this is a string", "54", "{literal:'trouble'}"]);
string[] optValues = JsonHelper.Deserialize<string[]>(options);
- Обычно лучше проверять параметры в JavaScript перед вызовом
exec(). Это позволяет повторно использовать больше кода и исключить ненужную функциональность из различных нативных реализаций плагина.
© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/7.x/guide/platforms/wp8/plugin.html