【问题标题】:WebView capture navigation to a custom protocolWebView 捕获导航到自定义协议
【发布时间】:2013-10-21 14:17:40
【问题描述】:

我正在使用 Windows 8.1 xaml 应用程序中的 WebView,并且需要处理到自定义协议的导航,即。 “应用程序://12345”。

我让 WebView 导航到一个网站进行身份验证,然后重定向到这个自定义协议作为响应。

没有任何 WebView 导航事件被触发,Windows 正在选择它并尝试使用它打开一个应用程序(“在商店中查找应用程序”对话框)。

当 WebView 导航到这个协议时是否可以捕捉到?

【问题讨论】:

  • 请问您解决了吗?我正在处理类似的问题。
  • 不幸的是,这是不可能的。至少在 Windows 10 之前会带来 MSWebViewUnsupportedUriSchemeIdentified 事件 - msdn.microsoft.com/library/windows/apps/… 不过我还没有测试过。
  • 感谢您的回答。我希望 Windows 10 能够解决 Windows 商店开发中的更多问题。我通过注入脚本解决了这种情况,请参阅下面的评论

标签: c# windows-runtime winrt-xaml windows-8.1


【解决方案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');
    }       
}

在此之后,您可以在 C# 代码中捕获 window.external.notify 并执行您想要的操作。

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

【讨论】:

  • 只有当您可以访问页面源并且到协议的链接是实际的a 标记而不是来自 JavaScript 的东西时,这才是一个解决方案
【解决方案2】:

也许这是一个矫枉过正的解决方案,但您可以使用带有 NavigateToLocalStreamUri 方法的 IUriToStreamResolver :https://msdn.microsoft.com/library/windows/apps/dn299344。 此解决方案允许您创建一个自定义解析器来实现 IUriToStreamResolver。 WebView 所需的每个资源都会通知解析器。在解析器中,您必须为请求的每个资源返回一个 Stream。但是您可以通过这种方式处理自定义协议。

【讨论】:

    【解决方案3】:

    我刚刚在尝试做类似的事情时发现了这个问题,看起来 Windows 已经实现了UnsupportedUriSchemeIdentified(基于@dkarzon 的上述评论)所以现在应该可以正常工作了!

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多