如何关闭具有自定义 URL 方案的 UWP 应用?

问题描述 投票:0回答:2

我已经创建了一个适用于 Windows (UWP) 的示例应用程序并注册了 URL 方案

我的方案

它有一个 WebView,其源作为我的自定义 URL

http://192.168.1.25:8080/dummywebsite.html

要打开应用程序,我使用 win+r 并输入 myscheme://hello 然后应用程序就会打开

我正在使用此 URL 处理关闭应用程序 myscheme://关闭

问题是当我打电话时

window.location = "myscheme://close";
它询问您想切换应用程序吗,然后当我单击“是”时,它正在关闭应用程序。当我已经在该应用程序中时,为什么它要求切换应用程序

如何直接从外部 JavaScript 关闭应用程序或删除切换应用程序的确认

主页.xaml

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
        <WebView x:Name="WebView1" Source="http//:192.168.1.25:8080/dummywebsite.html" ScriptNotify="WebView1_ScriptNotify" />
    </Grid>

App.xaml.cs(关闭逻辑)

protected override void OnActivated(IActivatedEventArgs args)
    {
        // calls when qlicket url is fired 
        if (args.Kind == ActivationKind.Protocol)
        {
            ProtocolActivatedEventArgs eventArgs = args as ProtocolActivatedEventArgs;
            System.Diagnostics.Debug.WriteLine("App Activated");
           
            /// Close App
            if (eventArgs.Uri.AbsoluteUri.Contains("close"))
            {
                global::Windows.UI.Xaml.Application.Current.Exit();
            }
        }
    }

编辑1:

按照 Martin Zikmund 的建议,我尝试做同样的事情,但 javascript 抛出错误。

我认为 AppCommunicator 没有注册。

以下链接可能有助于使其工作

传入 AddWebAllowedObject 的对象必须从 与应用程序集分离的 Windows 运行时组件。这 对于要识别的属性来说,AllowForWeb 属性是必需的 由 WebView 安全子系统。如果您使用应用程序中的类 项目中,AddWebAllowedObject 不起作用。

请参阅 WebAllowedObject 了解更多详细信息

uwp uwp-xaml windows
2个回答
3
投票

问题在于

WebView
控件运行
Edge
的嵌入式版本,“技术上”这不是同一个应用程序,并且会导致弹出窗口。

更好的解决方案是直接从 JS 调用 C# 代码。您可以使用 Web 允许的对象来做到这一点。这是一个特殊的 Windows 运行时类的实例,将允许进入 JS,并且您将能够使用该实例进行通信。因为首先您需要创建一个新的 Windows 运行时组件项目。在那里你定义一个带有

[AllowForWeb]
属性的类,然后可以从 JS 调用:

[AllowForWeb] 
public sealed class AppCommunicator
{
    public void CloseApp()
    {
        Application.Current.Exit();
    }
}

现在从主 UWP 应用项目添加对此新项目的引用,然后您需要将该类的实例注入到网页中:

private void MainWebView_NavigationStarting(WebView sender, 
                WebViewNavigationStartingEventArgs args)
{ 
   sender.AddWebAllowedObject("AppCommunicator", new AppCommunicator());
}

现在你可以从 JS 调用对象的方法:

AppCommunicator.CloseApp();

脚本通知

还有一种从 JS 通知 C# 代码的替代方法,即

ScriptNotify
,但仅支持 HTTPS 网站。有关更多信息,请参阅文档


0
投票

我添加了 WebView1_ScriptNotify 方法,每当 window.external.notify(param); 时都会调用该方法;从 UI 调用

// Add in MainPage.xaml.cs
void WebView1_ScriptNotify(object sender, NotifyEventArgs e)
{
    if (e.Value != null && e.Value.Contains("close"))
    {
        global::Windows.UI.Xaml.Application.Current.Exit(); // closing App if close is passed as arg
    }
    else
    {
        /// Other stuffs
    }
}

WebView1_ScriptNotify 在 WebView 中定义为

ScriptNotify="WebView1_ScriptNotify"

注意:仅当您通过

添加 ContentURI 时,才能在 javascript 中访问 window.external.notify

解决方案 => Package.appxmanifest => ContentURIs 选项卡

示例 Uri:

http://192.168.0.105:8080
© www.soinside.com 2019 - 2024. All rights reserved.