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

时间:2018-01-11 07:45:13

标签: uwp uwp-xaml windows-applications

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

myscheme

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

http//:192.168.1.25:8080/dummywebsite.html

打开App我正在使用win + r并输入 myscheme:// hello 并打开应用

我正在使用此网址处理关闭应用 myscheme://关闭

问题是我打电话给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没有注册。

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

  

必须从a导入传入AddWebAllowedObject的对象   与运行组件分开的Windows运行时组件。这个   必须为AllowForWeb属性标识属性   由WebView安全子系统。如果您使用应用中的课程   项目,AddWebAllowedObject不起作用。

有关详细信息,请参阅WebAllowedObject

2 个答案:

答案 0 :(得分:2)

问题是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

答案 1 :(得分: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

解决方案=&gt; Package.appxmanifest =&gt; ContentURIs标签

示例Uri:

http://192.168.0.105:8080