Вот ссылка на
часть 1 этой серии.
В этом совете я собираюсь показать вам, как отправить SMS-сообщение из PhoneGap на Windows Phone с помощью члена SMSCompose пространства имен Microsoft.Phone.Tasks . В этом пространстве имен много полезных программ запуска и выбора, и о некоторых из них я напишу в следующем посте. Я также использую задачу SMSCompose, чтобы представить другой способ взаимодействия между вашим приложением PhoneGap и базовой платформой, а именно через плагин PhoneGap.
В предыдущем совете я показал, как можно написать некоторый код в приложении Silverlight, в котором размещено приложение PhoneGap, и вызывать его из PhoneGap через интерфейс сценариев. Плагины — это просто другой механизм вызова кода, специфичного для платформы. Этот метод уже хорошо известен разработчикам PhoneGap, поэтому имеет смысл изучить, как использовать его в Windows Phone.
PhoneGap имеет довольно много кроссплатформенных API-интерфейсов для взаимодействия с каждой платформой в таких областях, как местоположение, хранение, звуки и т. Д. Они очень полезны, поскольку позволяют писать код, который использует эти функции только один раз, и запускать его на любом устройство, которое поддерживает PhoneGap. Но иногда есть вещи, специфичные для платформы, которыми вы хотите воспользоваться (а в случае с Windows Phone их много), поэтому плагины — это удобный способ сделать это. Джесси МакФейден также написал отличный пост в блоге, чтобы вы начали писать плагины PhoneGap для Windows Phone.
Мы собираемся написать плагин, который позволит нам отправлять SMS-сообщения с JavaScript в PhoneGap с помощью Windows Phone. Во-первых, давайте посмотрим на код в C # для отправки SMS-сообщения.
SmsComposeTask smsTask = new SmsComposeTask();
smsTask.To = "4045551212";
smsTask.Body = "Message for you, sir!";
smsTask.Show();
Довольно просто. Обратите внимание на то, что в этом API он запускается и забывается, поскольку мы не получаем возвращаемое значение. Теперь мы хотели бы предоставить функцию JavaScript, которую мы можем вызвать из нашего приложения PhoneGap, которая может вызвать это. Может быть, мы хотим, чтобы это выглядело так:
sendSMS.send (‘4045551212’, ‘Hello’);
Давайте соединим эти два конца. Прежде всего, нам нужно поместить приведенный выше код C # в метод класса, который может быть вызван средой выполнения PhoneGap. Эти классы могут быть удобно размещены в папке плагинов в вашем проекте PhoneGap.
Чтобы добавить класс, щелкните правой кнопкой мыши папку «Плагины» и выберите « Добавить новый элемент» . Выберите класс и назовите его как хотите. Я назвал этот SendSMS.cs . У класса есть много дополнительных операторов использования в верхней части, которые нам не нужны, поэтому не стесняйтесь удалять их для простоты.
Далее нам нужно изменить пространство имен. По умолчанию пространство имен — это наш проект Visual Studio. Однако мы хотим, чтобы этот класс был частью пространства имен библиотеки времени выполнения PhoneGap, поэтому измените пространство имен в верхней части кода на WP7GapClassLib.PhoneGap.Commands . Нам также нужно изменить наш класс, чтобы он наследовал от класса BaseCommand среды выполнения PhoneGap, чтобы в нем был весь механизм, который можно вызывать из нашего JavaScript. Поэтому после имени класса поставьте : BaseCommand .
Затем внутри класса нам нужен метод для хранения кода SMS Compose. Я создал один с именем send, но вы можете называть его как хотите. Теперь мы можем поместить код сверху в этот метод. Чтобы ссылаться на задачу SmsCompose, нам нужно перенести ссылку на его пространство имен в наш класс, добавив с помощью Microsoft.Phone.Tasks верхнюю часть класса. К настоящему времени у вас должно быть что-то похожее на это:
using Microsoft.Phone.Tasks;
namespace WP7GapClassLib.PhoneGap.Commands
{
public class SendSMS : BaseCommand
{
public void send(string args)
{
SmsComposeTask smsTask = new SmsComposeTask();
smsTask.To = "(678) 555-1212”;
smsTask.Body = "Hello";
smsTask.Show();
}
}
}
Хотя получатель и тело сообщения жестко запрограммированы, давайте пока оставим это, чтобы мы могли заставить его работать.
Следующим шагом является настройка способа вызова этого метода отправки из JavaScript в приложении PhoneGap. Способ реализации этого метода зависит от вас, но большинство разработчиков PhoneGap согласятся с тем, что важно обеспечить согласованный способ вызова плагинов на разных платформах. С этой целью я вышел и посмотрел список плагинов PhoneGap, разработанных сообществом , и нашел один, который обрабатывает отправку SMS-сообщений на iPhone . Поэтому я создам подпись метода в JavaScript, которая совпадает с сигнатурой для iOS. JavaScript ниже (внутри файла .js в вашем каталоге www в проекте).
function SMSComposer(){
this.resultCallback = null;
}
SMSComposer.prototype.showSMSComposer = function(toRecipients, body)
{
var args = {};
if(toRecipients)
args.toRecipients = toRecipients;
if(body)
args.body = body;
PhoneGap.exec(null, null, "SendSMS", "send", args);
}
PhoneGap.addConstructor(function () {
if (!window.plugins) {
window.plugins = {};
}
window.plugins.smsComposer = new SMSComposer();
}
);
Это немного отличается от iPhone. Поскольку SmsComposeTask не возвращает результат, нам не нужны никакие обратные вызовы в JavaScript. Здесь точка подключения находится в вызове PhoneGap.exec . Первые два параметра (в настоящее время нулевые) будут именами функций, которые вы будете писать для обработки обратного вызова и исключения, возникающего из этого вызова метода. Третий параметр — это имя класса C #, а четвертый — имя метода C #. Пятый параметр — это объект JavaScript, содержащий любую информацию, которую мы хотим отправить в вызываемую нами функцию. На данный момент помните, что мы игнорируем их в нашем коде C #.
Имея API подключаемого модуля , просто укажите этот файл .js в теге <script> и напишите некоторый JavaScript- код для вызова window.plugins.smsComposer.showSMSComposer (получатели, сообщение) с одним или несколькими получателями и сообщением. Это тот же JavaScript, который вы написали бы для вызова версии iOS с помощью этого плагина на этой платформе. Кстати, именно так будет выглядеть экран SMS-композитора для ваших конечных пользователей, и если вы запустите свой проект в эмуляторе, вы увидите то же самое.
Единственное, что мы должны здесь закончить, — это использовать список получателей и сообщения, которые отправляются в функцию C # через параметр args . Поскольку аргументы поступают в виде строки JSON, мы можем использовать библиотеку десериализации .NET, чтобы справиться с этим за нас. Мы создаем класс с полями данных, которые соответствуют графу объектов JSON (получатели и сообщение), а затем десериализуем параметр args в экземпляр этого класса. Десериализация происходит автоматически при условии, что члены класса соответствуют именам и типам данных графа объектов JSON. Вот полная версия класса C # с этими изменениями:
using Microsoft.Phone.Tasks;
using System.Runtime.Serialization;
namespace WP7GapClassLib.PhoneGap.Commands
{
public class sendSMSargs
{
[DataMember]
public string toRecipients;
[DataMember]
public string body;
}
public class SendSMS : BaseCommand
{
public void send(string args)
{
sendSMSargs myargs = JSON.JsonHelper.Deserialize<sendSMSargs>(args);
SmsComposeTask smsTask = new SmsComposeTask();
smsTask.To = myargs.toRecipients;
smsTask.Body = myargs.body;
smsTask.Show();
this.DispatchCommandResult();
}
}
}
Если вы хотите использовать этот плагин в других PhoneGap в проектах Windows Phone 7, вам просто понадобится файл класса C # и JavaScript, который вызывает PhoneGap.exec . Как я уже упоминал, существует множество API-интерфейсов Windows Phone, которые можно обернуть в плагины для использования в PhoneGap, и некоторые из них я расскажу в следующих публикациях в блоге.
Определенно бывают моменты, когда вы захотите использовать плагины, и времена, когда вы захотите использовать интерфейс скрипта, и я расскажу об этом более подробно в следующем посте. Удачного кодирования!