Я просто разработал приложение с WebWorks 2,1/Кордова и столкнулся с той же проблемой.
Во-первых, моя цель состояла в том, чтобы пройти кросс-платформу, поэтому я использую плагин InAppBrowser (хотя, честно говоря, я не уверен, что это должно быть включено вручную).
BlackBerry 10 WebView, похоже, не поддерживает события загрузки и выхода, поэтому вам необходимо использовать таймер для проверки состояния WebView вручную. Что-то вроде этого:
var VIEWER = window.open('http://myauthenticationpage/login.html', '_blank', 'location=no,menubar=no,titlebar=no,toolbar=no,status=no');
//Start a timer to check for a URL change in the WebView
var AuthTimer = setInterval(function() {
//Handle your failure case your own way, but stopping this loop is a good idea if the WebView isn't open
if ((typeof VIEWER === 'undefined') || (typeof VIEWER.document === 'undefined')) {
clearInterval(AuthTimer);
return;
}
//Get the current URL of the WebView
var url = VIEWER.document.URL;
//Process the URL in some way, like to extract a token
//You can also access the DOM of the loaded page, as another option
if (url.indexOf('authorizedUser=') > 0) {
//Extract the username, which my server appends in the query string
var user = url.substring(url.indexOf('authorizedUser=') + 15);
//I store the user token in localStorage
localStorage.setItem('user', user);
//Close the viewer and stope this timer
clearInterval(AuthTimer);
VIEWER.close();
}
}, 20);
После этого, возможно, придется сделать вызов Ajax на сервер, чтобы получить маркера пользователя или какой-либо другой информации ... зависит от реализации.
Итак, когда ваше приложение запускается, ваша первая страница должна немедленно выполнить проверку: есть ли у меня сохраненный токен пользователя? Если нет, отпустите описанный выше процесс. Продолжайте пинать, пока у меня не будет сохраненный токен пользователя. Когда у меня есть токен, начните загружать данные пользователя с сервера или загрузите index.html из www /, или что бы вы ни делали.
Это хорошо работает для меня, и устройства хорошо его обрабатывают.
Примечание для Android/IOS
Если вы решили взять это кросс-платформенный для Android или IOS, вы можете сделать это, используя события вместо:
var VIEWER = window.open('http://myauthenticationpage/login.html', '_blank', 'location=no,menubar=no,titlebar=no,toolbar=no,status=no');
VIEWER.addEventListener('exit', function(e) {
//The webview closed!
if (user == null) {
//We still don't have a username
setTimeout(function() {
//Kick open the webview again, to try again for a username for example
//(Might want to wrap all this in a function)
VIEWER = window.open('http://myauthenticationpage/login.html', '_blank', 'location=no,menubar=no,titlebar=no,toolbar=no,status=no');
}, 50);
}
});
VIEWER.addEventListener('loadstart', function(e) {
//The webview has started loading a new page
var url = e.url;
var user = null;
if (url.indexOf('authorizedUser=') > 0) {
user = url.substring(url.indexOf('authorizedUser=') + 15);
localStorage.setItem('user', user);
VIEWER.close();
}
});
Используя эту технику, веб-страницы необходимо будет «отследить» некоторые данные в строке запроса или DOM ответа при успешном входе в систему. Я думаю, что для большинства реализаций авторизации просто установите фиктивный URL-адрес обратного вызова в свой запрос, а затем просто посмотрите URL-адрес обратного вызова в URL-адресе WebView.
Надеюсь, это поможет!
John