Статьи

Приложения Магазина Windows — JavaScript и передача данных в элемент управления WebView

В последние несколько недель в свободное время я работал над созданием приложения для Магазина Windows, которое обернет созданное мной HTML-веб-приложение. 

Чтобы использовать веб-приложение, введите токен в текстовое поле на странице приветствия и нажмите кнопку «Подтвердить». 

Если токен действителен, пользователю предоставляется URI, который затем можно использовать для отслеживания своего времени с помощью представления таймера запуска / остановки в веб-приложении. 

Проблема, которую мы собираемся решить в этом блоге, заключается в следующем: 


Когда пользователь нажимает кнопку «Подтвердить» на странице приветствия и генерируется URI, я бы хотел, чтобы JavaScript вызывал код, содержащий элемент управления WebView, для сохранения URI. 

Это избавит пользователя от необходимости копировать URI, открывать всплывающее окно настроек и вставлять новый URI.

Я знаю, что с помощью JavaScript страница, загруженная в элемент управления WebBrowser, может взаимодействовать с кодом C #, когда включена опция ObjectForScripting, но есть ли у нас доступ к аналогичной функции в приложении Магазина Windows при использовании элемента управления WebView? 

ScriptNotify и AllowedScriptNotifyUris

Оказывается, что JavaScript-код страницы, загруженной в элемент управления WebView, может вызывать код C # страницы, если вы установили событие ScriptNotify. 

В соответствии с документацией Microsoft о событии ScriptNotify (
http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify
), в зависимости от того, какой метод вы используете для Чтобы отобразить страницу в элементе управления WebView, вам может потребоваться указать или не указать URI, которым разрешено вызывать обработчик событий. 


Если вы используете метод Navigate в WebView, вы должны указать список URI, которым разрешено вызывать обработчик событий ScriptNotify. 

Если вы используете метод NavigateToString WebView, то список URI не нужен.

Я просто устанавливал свойство «Источник» WebView с желаемым URI, поэтому возникает вопрос: нужно ли мне указывать список URI или нет? 

Как выясняется, если я не указываю список URI при использовании свойства Source WebView, событие ScriptNotify не инициируется. 

Вы можете указать список разрешенных URI следующим образом:

List<Uri> lstAllowedUris = new List<Uri>(); 
lstAllowedUris.Add(new Uri("http://apps.dovico.net")); 
wvBrowser.AllowedScriptNotifyUris = lstAllowedUris;

Примечание . Свойство AllowedScriptNotifyUris почти предполагает, что можно сказать, что одна страница может вызывать обработчики событий ScriptNotify, но ни одна из других страниц сайта не может. 


На самом деле, основываясь на моем тестировании, даже если вы указали URI для конкретной страницы, любая страница в этом домене может вызывать обработчик событий. 

Свойство AllowedScriptNotifyUris на самом деле представляет собой список разрешенных доменов, страницам которых разрешено вызывать обработчик событий ScriptNotify.

Ниже приведен пример подключения обработчика событий ScriptNotify:

public MainPage() 
{
// Only allow the following domain's pages to call our ScriptNotify 
// event handler 
List<Uri> lstAllowedUris = new List<Uri>(); 
lstAllowedUris.Add(new Uri("http://apps.dovico.net")); 
wvBrowser.AllowedScriptNotifyUris = lstAllowedUris; 

// Attach our ScriptNotify event handler 
wvBrowser.ScriptNotify += wvBrowser_ScriptNotify;
}

Ниже приведен пример самого обработчика событий:

void wvBrowser_ScriptNotify(object sender, NotifyEventArgs e) 
{
// The string received from the JavaScript code can be found 
// in e.Value
}

Что касается JavaScript, то код аналогичен тому, что вы написали бы при вызове кода C # элемента управления WebBrowser, за исключением того, что вызываемая функция называется «уведомлять», где с помощью элемента управления WebBrowser вы можете определить собственное имя функции обратного вызова. , 

Ниже приведен пример кода JavaScript, который вызывает код C #:

// We have a couple of checks to make sure the 'external' 
// object and 'notify' method exist before we try using them 
// because our project is a web application and might not be 
// running in a WebView control (the checks prevent 
// JavaScript errors if the method doesn't exist) 
if ((typeof (window.external) !== "undefined") && 
(typeof (window.external.notify) !== "undefined")) 
{
window.external.notify(sURI);
}

В заключении

Несмотря на то, что JavaScript может передавать строку только в обработчик событий ScriptNotify, настоятельно рекомендуется проверить строку в ожидаемом формате, прежде чем пытаться использовать ее, даже если строка получена из источника, который вы включили в список разрешенные URI. 

Дополнительные ресурсы

Если вас интересуют подробности о том, как реализовать всплывающее окно «Параметры», особенно если вы используете элемент управления WebView, у меня есть предыдущая статья, которая может быть интересна: 
Windows 8: приложения Магазина Windows и элемент управления WebView
 (мы обсуждали, как отобразить всплывающее окно настроек и сфокусированное в основном на том, чтобы сделать элемент управления WebView приятным во всплывающем окне). 

Если вас интересуют RoamingSettings и событие DataChanged, может также оказаться полезной следующая статья: 
Windows 8: приложения Магазина Windows — RoamingSettings и событие DataChanged
. Ниже приведена копия моего проекта на данный момент (C #, созданная с использованием Visual Studio). Express 2012 для Windows 8):  https://github.com/downloads/dovicoapi/DOVICOTimerForWindowsStore/DOVICOTimerForWindowsStore.zip 



 

Примечание. Этот проект все еще находится в стадии разработки, поэтому он может не соответствовать всем ограничениям Магазина Windows. Я буду обновлять этот проект на GitHub по мере продвижения.