Навигация WebView в пользовательский протокол - программирование
Подтвердить что ты не робот

Навигация WebView в пользовательский протокол

Я работаю с WebView в приложении xaml для Windows 8.1 и должен обрабатывать навигацию по пользовательскому протоколу, т.е. "Приложение://12345".

У меня есть WebView, который переходит на веб-сайт для аутентификации, который затем перенаправляет на этот настраиваемый протокол в качестве ответа.

Ни одно из событий навигации WebView не запускается, и Windows выбирает это и пытается открыть с ним приложение ( "Ищите приложение в диалоговом окне" Магазин ").

Можно ли поймать, когда WebView переходит к этому протоколу?

4b9b3361

Ответ 1

У меня была аналогичная проблема, и я решил ее с помощью этого кода, введенного в HTML. Или вы можете запустить этот код непосредственно в WebView.

for (var i = 0; i < document.links.length; i++) { 
    if(document.links[i].href.indexOf('app') === 0){
        var currentHref = document.links[i].href;
        document.links[i].setAttribute('href', 'javascript:window.external.notify(\'' + currentHref + '\')');   
        document.links[i].removeAttribute('target');
    }       
}

После этого вы можете поймать window.external.notify в коде С# и делать то, что хотите.

private void WebView_OnScriptNotify(object sender, NotifyEventArgs e)
{
     if (e.Value.StartsWith("app"))
     {
         DoAction(e.Value);
         return;
     }
}

Ответ 2

Может быть, это решение переполнения, но вы можете использовать IUriToStreamResolver с помощью метода NavigateToLocalStreamUri: https://msdn.microsoft.com/library/windows/apps/dn299344. Это решение позволяет создать пользовательский резольвер, который реализует IUriToStreamResolver. Получатель будет уведомлен для каждого ресурса, требуемого WebView. В преобразователе вы должны вернуть поток для каждого запрошенного запроса. Но вы можете обрабатывать собственный протокол таким образом.

Ответ 3

Я просто нашел этот вопрос при попытке сделать что-то подобное, и похоже, что Windows внедрила UnsupportedUriSchemeIdentified (на основе @dkarzon выше комментарий), поэтому теперь это должно работать корректно!