PhoneGap - navigator.app.exitApp() 不起作用

6

我正在使用Phonegap制作一个小应用程序,但是navigator.app.exitApp()?根本不起作用。

  • 这是我的第一个混合应用程序。
  • 我的目标平台是Android 5。
  • 我在Windows上使用Cordova CLI进行开发。

我使用以下代码调用JavaScript函数:

<input type='button' onclick='exitApp();'/>

JavaScript:

function exitApp() { navigator.app.exitApp(); }

有什么想法?


你安装了通知插件吗? - User6006
这个?cordova插件添加https://github.com/katzer/cordova-plugin-local-notifications - Thomas Fifield
这个命令:cordova plugin install org.apache.cordova.dialogs - User6006
请在您的帖子中回答以下问题。由于这似乎是您在此主题上的第一篇帖子。这是您的第一个混合应用程序吗?您的目标平台及其目标版本是什么?Android 4、5、6?iOS 7、8、9?您正在哪个平台上开发?Windows、MacOS? 您是否使用CLI、SDK或Build?请不要假设答案,请阅读链接。一旦您已经在帖子中回答了问题,请在评论中回复,以便我知道您已经添加了信息到帖子中。 - user3255670
你需要在我的名字前面使用@符号,否则我看不到回复。我是偶然发现的。这是你的第一个混合应用程序吗? - user3255670
显示剩余3条评论
4个回答

6

以前只需要调用 navigator.app.exitApp(),但现在谷歌和苹果都为开发者添加了重大障碍。

  1. 确保在调用 exit 前等待 deviceready 事件。您可以考虑添加启动画面或将按钮变灰(禁用)等操作,直到 deviceready 触发并加载 Cordova 库。
  2. 这就是 *障碍*。现在,您需要添加一个 whitelist 插件,并为 Android 添加 CSP。插件对于 CSP 是必需的。您可以通过将所有 JavaScript(包括任何 on*=)和 <style>(以及 style=)放入单独的文件中来规避此问题。例外情况是 CSP - 使用任何在线资源。

关于第一点,

请将以下内容添加到您的 JavaScript 代码中:

// Wait for PhoneGap to load
document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
    // alert("deviceready");
    document.getElementById('exitApp').addEventListener('click', function() {
        navigator.app.exitApp();
    });
}

将以下内容添加到您的index.html文件中:

<button id="exitApp">Exit</button>

在第二点,简短的答案是:将此添加到您的config.xml文件中。
<plugin name="cordova-plugin-whitelist" source="npm" spec="1.1.0" />
<allow-navigation href="*" />
<allow-intent href="*" />
<access origin="*" /> <!-- Required for iOS9 -->

注意:您的应用当前存在安全风险。需要您自行确保应用的安全性。
请将以下内容添加到您的index.html文件中:

<meta http-equiv="Content-Security-Policy" 
         content="default-src *; 
                  style-src * 'self' 'unsafe-inline' 'unsafe-eval'; 
                  script-src * 'self' 'unsafe-inline' 'unsafe-eval';">

注意:您的应用程序现在不安全。需要您自己来保护您的应用程序。
当您准备好更加安全时,这个白名单工作表可以帮助您。
如何:应用 Cordova/Phonegap 白名单系统


2
请使用以下内容:
function backKeyDown() {
    navigator.notification.confirm("Are you sure you want to exit?", onConfirm, "Please Confirm", "Yes,No"); 
}
function onConfirm(button) {
    if(button==2){//If User selected No, then we just do nothing
        return;
    }else{
        navigator.app.exitApp();// Otherwise we quit the app.
    }
}

您需要安装以下插件:

cordova plugin install org.apache.cordova.dialogs

今天(2020年)是否需要对话框窗口才能回答主要问题?提前致谢。 - Bernard

1
你也可以在设备准备就绪的回调函数中添加监听器。
onDeviceReady: function () {

    document.addEventListener('backbutton', function(e){
        e.preventDefault();
        //TODO: throw up your dialog here!
    }, true);

    //other stuff here
}

没成功,我尝试了最简单的想法,但失败了 @weagle08 - Thomas Fifield
你觉得很奇怪,因为同样的代码片段在生产代码中使用navigator.app.exitApp();时却能正常工作。你有一个非常简单的项目来重现这个问题吗? - weagle08
我用那个创建了一个新项目并且运行正常...但是在我的电脑上却无法工作...很奇怪 @weagle08 - Thomas Fifield
你有捕获到任何异常吗?我在想你的对象原型是否被破坏了,或者你可能有一个监听器在某个地方捕获它并阻止应用程序退出? - weagle08

0

只需在此行中按需要使用(适用于Ionic 3)

navigator.app.exitApp();

就这些。祝你编程愉快...


这只是将应用最小化而不是终止进程。 - Mimouni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接