使用URL方案关闭UWP应用程序
我已经为Windows创建了一个示例应用程序(UWP),并注册了一个URL方案 myscheme 它有一个WebView,其源代码与我的自定义URL类似使用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"; 它会询
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