使用 URL 方案关闭 UWP 应用

Posted

技术标签:

【中文标题】使用 URL 方案关闭 UWP 应用【英文标题】:Close an UWP app with URL scheme 【发布时间】:2018-06-20 11:42:30 【问题描述】:

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

我的计划

它有一个 WebView,其源代码是我的自定义 URL,例如

http//:192.168.1.25:8080/dummywebsite.html

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

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

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

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

MainPage.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

【问题讨论】:

【参考方案1】:

问题在于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 网站。欲了解更多信息,请参阅the documentation。

【讨论】:

感谢您的建议,但在同一解决方案中添加 AppCommunicator 无效。 AppCommunicator 在 Javascript 中不可用。根据此链接它必须在单独的项目中。 social.msdn.microsoft.com/Forums/netframework/en-US/… 嗨,我已经用 Windows 运行时组件的信息更新了我的答案【参考方案2】:

我添加了 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"

注意:window.external.notify 仅当您通过

添加 ContentURIs 时才能在 javascript 中访问

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

示例 Uri:

http://192.168.0.105:8080

【讨论】:

以上是关于使用 URL 方案关闭 UWP 应用的主要内容,如果未能解决你的问题,请参考以下文章

UWP ComboBox 不再具有打开/关闭动画(内部版本 14393)

从屏幕底部滑动时,任务栏应该可见 - UWP [关闭]

关闭 UWP 应用后,具有完全信任进程的 Windows 应用程序打包项目保持运行

切换到其他应用时不会触发 UWP Flyout 的关闭事件

UWP 多个视图未关闭

如何在按钮单击时关闭 uwp 中的吐司