【问题标题】:InvokeScriptAsync not launching scriptInvokeScriptAsync 不启动脚本
【发布时间】:2018-02-25 09:03:35
【问题描述】:

我有一个 UWP 应用程序,我正在尝试获取从 WebView 调用的脚本。 NavigationCompleted 事件引发并且我的 javascript 包含在页面中(我认为),但脚本没有执行。

这是我的 C# 代码

public sealed partial class MainPage : Page
{
    readonly WebView _webView = new WebView();
    public MainPage()
    {
        this.InitializeComponent();
        Facebook.Navigate(new Uri("http://www.facebook.com/"));
        _webView.NavigationCompleted += WebView_OnNavigationCompleted;
        _webView.ScriptNotify += WebView_OnScriptNotify;
    }

    private async void WebView_OnNavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
    {
        await _webView.InvokeScriptAsync("eval", new[]
        {
            "alert('HEY');" + 
            "window.external.notify('%%' + location.href);"
        });
    }

    private void WebView_OnScriptNotify(object sender, NotifyEventArgs e)
    {
        var url = e.Value;
    }
}

另外,我将 http://www.facebook.comhttps://www.facebook.com 添加到我的包清单内容 Uris 列表(包括所有 WinRT 访问权限)。

我无法弹出警报,通知也是如此。

谢谢

【问题讨论】:

    标签: webview uwp


    【解决方案1】:

    WebView docs 中所述,alert 在 WebView 控件中不起作用。

    要使 Script Notify 正常工作,您还需要将页面添加到应用清单中:

    要使外部网页能够在调用 window.external.notify 时触发 ScriptNotify 事件,您必须在应用清单的 ApplicationContentUriRules 部分中包含页面的统一资源标识符 (URI)。

    还有:

    此列表中的 URI 必须使用 HTTPS

    因此,请尝试导航到 https 站点。

    在最坏的情况下,您可以使用网络允许的对象来与您的应用进行通信,因为它可以在所有情况下注入。

    【讨论】:

    • 这样,如果网站不支持https,就不行了?
    • 如果不是https,则需要使用AddWebAllowedObject 方法添加具有AllowForWeb 属性的类。然后,您可以使用 eval 注入调用 C# 类上的方法的代码,并让它调用您在主应用程序代码中注册的事件。
    • 谢谢,我会检查这种可能性,尽管它似乎比在页面中注入一些 javascript 更复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多