使用URL方案关闭UWP应用程序

使用URL方案关闭UWP应用程序,uwp,uwp-xaml,windows-applications,Uwp,Uwp Xaml,Windows Applications,我已经为Windows创建了一个示例应用程序(UWP),并注册了一个URL方案 myscheme 它有一个WebView,其源代码与我的自定义URL类似 http//:192.168.1.25:8080/dummywebsite.html 要打开应用程序,我使用win+r并键入myscheme://hello然后应用程序打开 我正在使用此URL处理close应用程序 myscheme://close 问题是当我调用window.location=”时myscheme://close"; 它会询

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

myscheme

它有一个WebView,其源代码与我的自定义URL类似

http//:192.168.1.25:8080/dummywebsite.html
要打开应用程序,我使用win+r并键入myscheme://hello然后应用程序打开

我正在使用此URL处理close应用程序 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>
编辑1:

正如Martin Zikmund所建议的,我也尝试过这样做,但javascript抛出了错误

我认为AppCommunicator没有注册

下面的链接可能有助于它的工作

传递到AddWebAllowedObject的对象必须从 与应用程序集分离的Windows运行时组件。这 是标识AllowForWeb属性所必需的 通过WebView安全子系统。如果您使用应用程序中的类 项目,AddWebAllowedObject不工作


有关更多详细信息,请参阅问题在于
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网站。有关更多信息,请参阅。

我添加了WebView1\u ScriptNotify方法,该方法在window.external.notify(参数)时调用;从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
    }
}
WebView 1_ScriptNotify在WebView中定义为

ScriptNotify="WebView1_ScriptNotify"
注意:只有通过添加ContentURI,才能在javascript中访问window.external.notify

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

示例Uri:

http://192.168.0.105:8080

感谢您的建议,但在同一解决方案中添加AppCommunicator不起作用。AppCommunicator在Javascript中不可用。根据这个链接,它必须在单独的项目。您好,我已经用Windows运行时组件的信息更新了我的答案
http://192.168.0.105:8080