|
|
|||||||||||||||||||||||||||||
|
Разработка гибридных веб-приложений, способных использовать аппаратные средства мобильных устройствИсточник: msdn Шейн Черч
Продукты и технологии: ASP.NET MVC 3, Windows Phone В статье рассматриваются:
Исходный код можно скачать по ссылке code.msdn.microsoft.com/mag201203MobileWeb. Вы хотите создать мобильное приложение, но пребываете в растерянности от изобилия существующих устройств и API, которые надо изучать. Какую мобильную платформу следует предпочесть? Apple iOS (iPhone и iPad) использует Objective C, Google Android - Java, а Windows Phone - Silverlight, и в то же время каждый из этих вариантов имеет свой API и свою рыночную нишу. Решив сосредоточиться только на одном конкретном стеке технологий, вы потеряете 50% рынка (или более) - остальные не смогут пользоваться вашим приложением. Если вы попытаетесь поддерживать все эти платформы, вам придется иметь дело, как минимум, с тремя совершенно разными кодовыми базами, что значительно увеличит ваши затраты на разработку и сопровождение. Но есть другой вариант: вы могли бы создать мобильное веб-приложение - оно будет работать на любом из этих устройств. Однако у такого подхода есть свои проблемы. Самое большое препятствие для разработки всего бизнес-приложения на HTML и JavaScript - отсутствие доступа ко многим аппаратным средствам мобильных устройств, например к камере, GPS или акселерометру. Очевидно, рынок мобильных устройств будет развиваться и дальше, а значит, возникает вопрос: как поддерживать все эти аппаратные платформы и обеспечить максимальное удобство использования ваших приложений? В этой статье я покажу, как создать мобильное приложение, способное задействовать преимущества из двух миров, и для этого оберну мобильное веб-приложение в оболочку родных приложений (native application shell). Концепция гибридного приложенияБазовая концепция гибридного приложения заключается в обертывании веб-приложения, оптимизированного под мобильные устройства, в специфическую для конкретного устройства оболочку родных приложений. Такая оболочка выступает в роли хоста для элемента управления "веб-браузер" (Web browser control), который конфигурируется на запуск мобильного приложения по определенному URL при запуске программы оболочки. (В родной оболочке при необходимости могут быть предоставлены и другие UI-элементы, но обязательным является лишь элемент управления "веб-браузер".) Далее по мере навигации пользователя по сайту родной элемент управления "веб-браузер" прослушивает запрашиваемые URL. Когда пользователь запрашивает определенный URL, требующий задействовать аппаратные функции данного устройства, этот элемент управления прерывает событие навигации и вместо него запускает аппаратные функции. Когда пользователь завершает родной процесс, приложение указывает элементу управления "веб-браузер" вернуться в соответствующее место веб-сайта. Чтобы проиллюстрировать, как это делается, я подробно расскажу вам, как я - вместе с коллегами из EffectiveUI - создавал приложение для одного клиента. Это приложение предназначено для мобильных сотрудников, обрабатывающих заказы на техническое обслуживание и ремонт различного муниципального имущества, такого как рекламные щиты, скамейки и пожарные гидранты. Для определения текущего местонахождения сотрудника оно использует преимущества функций, поддерживаемых браузером, а для получения снимков муниципального имущества и их последующей загрузки на сервер - доступ к аппаратным средствам конкретного устройства. Основное меню этого приложения показано на рис. 1.
Создание веб-приложенияПри создании этого мобильного приложения я последовал ряду предложений, высказанных в статье Стива Сендерсона (Steve Sanderson) "Build a Better Mobile Browsing Experience" (msdn.microsoft.com/magazine/hh288079) в номере "MSDN Magazine" за июль 2011 г. В дополнение к рекомендациям из этой статьи я дам на основе своего опыта еще несколько советов.
Базовая концепция гибридного приложения заключается в обертывании веб-приложения, оптимизированного под мобильные устройства, в специфическую для конкретного устройства оболочку родных приложений.
Одно из технических требований моего клиента к создаваемому приложению заключалось в демонстрации совместного использования логики контроллера между настольными и мобильными версиями представлений сайта. Это требование выдвигается многими заказчиками, но на него должны обращать внимание и сами разработчики, так как это значительно упрощает процесс создания приложения, поддерживающего пользователей как настольных компьютеров, так и мобильных устройств. ASP.NET MVC 3 позволяет переключать представления на основе элементов запроса, например информации о запрашивающем браузере, в то же время обеспечивая совместное использование контроллеров и моделей несколькими представлениями. Она также дает возможность тонко управлять внешним видом и интерфейсом сайта для каждой платформы, причем разработчику достаточно лишь раз написать прикладную логику, а затем адаптировать представление для конкретной платформы. На рис. 2 показана вспомогательная функция, определяющая, какое представление следует выводить. Рис. 2. Вспомогательная функция, определяющая, какое представление следует выводить
Эта функция позволила мне соблюсти требование использовать один и тот же код для принятия решения о том, какое представление следует передавать пользователю на основе входящего запроса. Если входящий запрос является скриптом, который запрашивает JSON вместо HTML, контроллер отреагирует, установив соответствующее значение для параметра outputType. Я также использую выражение препроцессора для проверки символа условной компиляции MOBILE, включающего отладку мобильных представлений с применением настольных браузеров. Значение этого символа устанавливается с применением дополнительной мишени компиляции "Mobile" в проекте ASP.NET MVC 3, и это позволяет мне пропускать проверку для Request.Browser.IsMobileDevice в настольной отладочной конфигурации, что значительно ускоряет создание и отладку мобильной версии приложения. Создавая приложение, я также использовал раздельные эталонные страницы (master pages) для мобильной и настольной версий сайта. Настольная и мобильная версии эталонной страницы сильно различаются из-за необходимости учитывать расхождения в отображении на этих платформах. Мобильная версия эталонной страницы включает специфичные для мобильного устройства CSS-файлы и упрощенную структуру разметки, что облегчает разработку индивидуальных представлений с применением разметки и синтаксиса jQuery Mobile Framework. Все современные мобильные платформы обеспечивают доступ к GPS-модулю устройства для определения текущего местоположения пользователя через API геопозиционирования, соответствующий W3C-спецификации HTML5. Как использовать этот API, подробно обсуждалось в статье Брэндона Сэтрома (Brandon Satrom) "Integrating Geolocation into Web Applications" (msdn.microsoft.com/magazine/hh580735) в декабрьском номере за 2011 г. Хотя в той статье говорилось об использовании поли-заполнений JavaScript для HTML5 с целью поддержки геопозиционирования в браузерах, которые не поддерживают HTML5 API геопозиционирования, большинство нынешних мобильных браузеров изначально поддерживает этот API, поэтому методика поли-заполнений вам скорее всего не потребуется. Оценивая необходимость использования методики поли-заполнений, вы должны принять во внимание возможности устройств и браузеров, на которые вы ориентируетесь. В случае Android следует учесть, что параметр enableHighAccuracy должен быть установлен в true при вызовах API геопозиционирования для успешного доступа к функциональности GPS в эмуляторе Android, как показано на рис. 3. Рис. 3. Геопозиционирование через HTML5
Использование jQuery MobileИнфраструктура jQuery Mobile Framework - это "унифицированная система UI на основе HTML5 для всех популярных мобильных платформ", как сказано на веб-сайте этого проекта (jquerymobile.com). Он содержит ряд виджетов, оптимизированных под сенсорное взаимодействие, и значительно упрощает создание мобильных веб-приложений, интерфейсы которых по своему духу и букве полностью соответствуют родным приложениям мобильных устройств. jQuery Mobile можно добавить в ваш проект ASP.NET MVC 3 через NuGet, используя интерфейсNuGet Package Manager, или из Package Manager Console, выполнив команду "Install-Package jquery.mobile" (без кавычек). Эта команда добавит в ваш проект файлы jQuery Mobile JavaScript и CSS. Однако вам все равно потребуется добавить ссылки на файлы jQuery Mobile JavaScript и CSS в мобильную версию эталонной страницы, как показано на рис. 4. Рис. 4. Мобильная версия эталонной страницы
jQuery Mobile вносит некоторые существенные изменения в шаблоны, привычные любому разработчику на jQuery. Процитирую документацию на jQuery Mobile: Первое, чему вы учитесь вjQuery, - вызывать код внутри функции $(document).ready(), чтобы все выполнялось, как только загружаетсяDOM. Однако вjQueryMobile для загрузки контента каждой страницы вDOM в процессе навигации используется [AJAX], и обработчик готовностиDOM (readyhandler) выполняется только для первой страницы. Чтобы выполнять код всякий раз, когда загружается и создается новая страница, вы можете подключиться к событиюpageinit. Я использовал событие pageinit во всех страницах приложения, которые содержали элемент управления Google Maps, чтобы инициализировать карту, когда страница преобразуется в представление через AJAX. Дополнительная функциональность мобильной версии эталонной страницы - строка @RenderSection("PreJQueryMobileInit", false), приведенная на рис. 4, которая позволяет выполнять скрипты до инициализации jQuery Mobile в данной странице. В этом приложении-примере я задействовал данную функциональность для подключения события mobileinit, чтобы установить собственный обратный вызов по окончании работы фильтра listview в jQuery Mobile. Я также добавит две строки кода в библиотеку jQuery Mobile, чтобы включить метод filterCompleteCallback в прототип listview для получения уведомления о завершении фильтрации встроенного списка (built-in list filtering). Это позволило обновлять элементы на карте, соответствующие элементам отфильтрованного списка. Функцию обратного вызова нужно добавлять в jQuery Mobile listview до применения jQuery Mobile к любой разметке; этот код выполняется в обработчике события mobileinit, показанном на рис. 5. Рис. 5. Подключение к событию mobileinit
jQuery Mobile интенсивно использует новые средства HTML5, такие как теги header и footer и атрибуты data-*. Атрибуты data-role определяют поведение, которое нужно подключить к данному элементу. Например, в представлении MapMobile.cshtml на рис. 6 у меня есть два тега div, определенных с атрибутом data-role="page". Рис. 6. Разметка MapMobile.cshtml
Этот атрибут сообщает jQuery Mobile, что каждый из этих div должен интерпретироваться как отдельная страница на мобильном устройстве и что переход между ними должен осуществляться с помощью AJAX без навигации по страницам, происходящей в браузере. Это создает эффект, продемонстрированный на экранных снимках на рис. 7. Другие рекомендации и более подробное описание того, как использовать каждый из атрибутов data-* в контексте jQuery Mobile, вы найдете на веб-сайте jQuery Mobile.
Создание оболочки родных мобильных приложенийБазовый шаблон в разработке каждой оболочки родных приложений заключается в проектировании приложения, которое просто содержит полноэкранный элемент управления "веб-браузер". Внутри этого элемента я захватываю событие, срабатывающее, когда пользователь запрашивает новую страницу, и сравниваю запрошенный URL со списком известных URL, которые должны запускать аппаратную ("родную") функциональность. Именно здесь творится вся магия веб-приложения в оболочке родных приложений. В своем приложении я сравниваю URL с адресом внутри моего сайта для "Home/Image", чтобы задействовать функциональность встроенной камеры. Когда пользователь попадает на страницу подробных сведений Work Order, он видит значок камеры в правом верхнем углу экрана, как показано на рис. 8. Щелчок этой кнопки запускает встроенную камеру.
Windows PhoneWindows Phone для работы со всей встроенной функциональностью использует Silverlight. В некоторых отношения это делает Windows Phone самой удобной платформой для поддержки мобильных веб-приложений, если разработчик знаком с ASP.NET. Базовая XAML-разметка для оболочки родных приложений весьма проста:
Здесь следует отметить, что IsScriptEnabled устанавливается в true, потому что по умолчанию элемент управления "веб-браузер" в Windows Phone не поддерживает скрипт; кроме того, я обрабатываю событие Navigating. В MainPage.xaml.cs, показанном на рис. 9, я обрабатываю событие webBrowser1_Navigating. Если URL навигации совпадает с искомым URL, выбирается идентификатор подряда на работы, с которым я работаю, и вызывается родная функция CameraCaptureTask с одновременной отменой навигации в веб-браузере. После того как пользователь делает снимок с помощью камеры, вызывается метод Рис. 9. MainPage.xaml.cs для Windows Phone
Windows Phone ведет себя несколько иначе при взаимодействии с веб-версией элемента управления Google Maps или Bing Maps по сравнению с Android или iOS. Из-за того, что мобильный браузер Internet Explorer 9 захватывает жесты касания, смещения и разведения без передачи их через ядро JavaScript, веб-карты нельзя масштабировать или панорамировать с помощью жестов - нужно использовать элементы управления масштабирования и панорамирования, предоставляемые самой картой. Учитывая это ограничение, было бы неплохо, если бы данный проект усовершенствовали для запуска родного элемента управления Bing Maps в Windows Phone, когда требуется функциональность интерактивной карты, и последующего возврата в веб-приложение на экранах, где такая функциональность не нужна. AndroidJava-код для Android был написан моим коллегой, Шоном Кристманном (Sean Christmann), и он аналогичен коду для Windows Phone. Следующий XML-код определяет полноэкранную разметку для элемента управления WebView в Android:
В файле EffectiveUIActivity.java, показанном на рис. 10, переопределенная версия onCreate настраивает WebViewClient на переопределение методов onLoadResource и shouldOverrideUrlLoading элемента управления WebView, чтобы искать ту же совпадающую строку, как это делалось в Windows Phone, и, если таковая найдена, активизировать камеру и отменять навигацию. Этот код также переопределяет onGeolocationPermissionsShowPrompt, чтобы подавлять приглашение пользователю, появляющееся каждый раз, когда приложение выдает разрешение элементу управления WebView на доступ к функциональности геопозиционирования GPS. По завершении операций с камерой функция onActivityResult передает снимок на веб-сервер, используя тот же метод, что и в предыдущем примере с Windows Phone, а затем возвращает пользователя в веб-приложение. Рис. 10. EffectiveUIActivity.java для Android
iOSКод на Objective-C для iOS также был написан моим коллегой, Шоном Кристманном, и он тоже аналогичен коду, использовавшемуся для Windows Phone и Android. В файле WebCameraViewController.m, показанном на рис. 11, элемент управления UIWebView выполняет метод shouldStartLoadWithRequest, чтобы сравнить запрошенный URL с шаблоном. Если строка URL совпадает с шаблоном, код возвращает "NO" для отмены навигации и вызывает родной метод UIImagePickerController. Это дает возможность пользователю выбрать какое-нибудь изображение из библиотеки снимков или сделать новый снимок с помощью встроенной камеры. После выбора код отправляет снимок на веб-сервер, используя библиотеку ASIFormDataRequest (allseeing-i.com/ASIHTTPRequest) до возврата UIWebView в обычное "русло" приложения. Рис. 11. Код для iOS
Корректное сокращение функциональности для мобильных устройствА что произойдет, если посетитель мобильного веб-сайта не пользуется оболочкой родных приложений для доступа к камере? В этом случае важно предусматривать корректное сокращение функциональности. Эта концепция требует создавать приложение так, чтобы оно корректно работало, даже если оно просматривается с помощью не оптимизированного программного обеспечения. Это не означает, что каждая функция должна работать точно так же или что она должна выглядеть идентично, но приложение должно гарантировать, что и в такой ситуации все фундаментальные цели пользователя будут достигнуты. Чтобы корректно сокращать функциональность, я создал контроллер и представление ASP.NET MVC 3 для URL захвата изображения - "Home/Image", - которое было получено через оболочку родных приложений, и предоставляю простую форму для загрузки файла на сервер (рис. 12). Эта форма позволяет тем, кто не использует расширенные мобильные оболочки, выполнять ту же задачу добавления снимка в подряд на работы, хотя в этом случае интеграция отсутствует. Форма отправляет изображение той же операции контроллера, что и в случае применения оболочек родных приложений, и это способствует повторному использованию кода на разных платформах.
Гибридное приложение может обеспечить существенную экономию расходов по сравнению с уникальными родными приложениями. Значительная экономияГибридное приложение может обеспечить существенную экономию расходов по сравнению с уникальными родными приложениями - как в краткосрочной перспективе, так и в долгосрочной. Такие средства, как jQuery Mobile, сокращают различия в удобстве использования, что может дать значительные бизнес-преимущества, когда доступ к встроенным аппаратным средствам мобильных устройств не требуется. В случае мобильных устройств, число которых быстро растет, у вас есть несколько вариантов при создании мобильного приложения.
Важно отметить, что ни один из этих подходов не является принципиально лучшим других - все они имеют свои сильные и слабые стороны. Глубокий анализ соотношения "цены/выгоды" по каждому варианту поможет определить, какой из них будет лучше для ваших пользователей и вашего бизнеса. При принятии решения важно учитывать удобство в использовании, затраты на разработку и последующие расходы на сопровождение, а также более тонкие факторы вроде маркетинга и признания среди пользователей. Для многих бизнес-сценариев я предпочитаю вариант с гибридным или мобильным веб-приложением, так как дополнительные усилия и расходы на создание уникальных родных приложений для каждой мобильной платформы могут перевесить все выгоды для бизнеса. Мобильные приложения никуда уже не денутся и будут лишь набирать все большую значимость по мере переноса вычислений с традиционных настольных ПК на разнообразные мобильные устройства. Рассматривая вопрос о создании приложений для мобильных устройств, помните о том, что компромисс не всегда плох и что он может принести вам лучшее из обоих миров. Шейн Черч (Shane Church) - директор EffectiveUI по технологиям (Денвер, штат Колорадо). Занимается разработками в Microsoft .NET Framework с упором на ASP.NET и мобильные технологии Microsoft с 2002 г. Его блог находится по ссылке s-church.net. Узнать больше об EffectiveUI можно на сайте effectiveui.com . Выражаю благодарность за рецензирование статьи эксперту Джеймсу Маккафри (Dr.James McCaffrey). Ссылки по теме
|
|