我已经创建了一个适用于 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 了解更多详细信息
问题在于
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_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