我已经为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
答案 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