【问题标题】:Check Cordova Version from Javascript从 Javascript 检查 Cordova 版本
【发布时间】:2015-08-13 22:19:06
【问题描述】:

有什么方法可以从 Javascript 中检查应用程序正在运行哪个版本的 Cordova?

我为什么要问:

我们已将 Cordova 从 2.8 升级到 4.0.2,new Cordova JS 文件不适用于 old Cordova Android 代码。我们希望强制用户升级他们的应用程序(进而更新他们的 Cordova Android 版本),但是,我们需要首先检测他们使用的是旧版本。

为什么 device.cordova 不起作用:

似乎旧的 Cordova JS 代码从未初始化,因为它无法与新的 Cordova Android 代码通信。所以插件,例如 device plugin 永远不会被加载。我们在控制台中收到一条消息:

deviceready has not fired after 5 seconds

【问题讨论】:

    标签: javascript java cordova


    【解决方案1】:

    编辑:现在最简单的解决方案是:https://stackoverflow.com/a/65476892/1243247

    手动方式

    我制作了一个功能挂钩脚本,存储在hooks/setVersion.js。我现在刚刚对其进行了测试,它可以工作(仅在 Android 中,对于 iOS,您只需要复制 wwwDir)

    #!/usr/bin/env node
    var wwwFileToReplace = 'index.html'
    
    var fs = require('fs')
    var path = require('path')
    
    module.exports = function (context) {
      var projectRoot = context.opts.projectRoot
      const wwwDir = path.join(projectRoot, 'platforms', 'android', 'app', 'src', 'main', 'assets', 'www')
    
      var configXMLPath = 'config.xml'
      loadConfigXMLDoc(configXMLPath, (rawJSON) => {
        var version = rawJSON.widget.$.version
        console.log('Version:', version)
    
        var fullfilename = path.join(wwwDir, wwwFileToReplace)
        if (fs.existsSync(fullfilename)) {
          replaceStringInFile(fullfilename, '%%VERSION%%', version)
          console.log(context.hook + ': Replaced version in file: ' + path.relative(projectRoot, fullfilename))
        } else {
          console.error('File does not exist: ', path.relative(projectRoot, fullfilename))
          process.exit(1)
        }
      })
    }
    
    function loadConfigXMLDoc (filePath, callback) {
      var fs = require('fs')
      var xml2js = require('xml2js')
      try {
        var fileData = fs.readFileSync(filePath, 'ascii')
        var parser = new xml2js.Parser()
        parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
          if (err) {
            console.error(err)
            process.exit(1)
          } else {
            // console.log("config.xml as JSON", JSON.stringify(result, null, 2))
            console.log("File '" + filePath + "' was successfully read.")
            callback(result)
          }
        })
      } catch (ex) {
        console.log(ex)
        process.exit(1)
      }
    }
    
    function replaceStringInFile (filename, toReplace, replaceWith) {
      var data = fs.readFileSync(filename, 'utf8')
    
      var result = data.replace(new RegExp(toReplace, 'g'), replaceWith)
      fs.writeFileSync(filename, result, 'utf8')
    }
    

    您还必须在 config.xml 中添加

    <hook src="hooks/setVersion.js" type="after_prepare"/>
    

    此脚本将文件中的文本 %%VERSION%% 替换为 config.xml 中的应用版本,因此您可以在 index.html 文件中包含类似的内容

    <html data-appversion="%%VERSION%%">
    

    在你的 JS 中

    const version = document.documentElement.getAttribute("data-appversion");
    

    【讨论】:

      【解决方案2】:

      您可以使用device.cordova 获取当前版本的 Cordova。

      Appropriate documentation

      【讨论】:

      • 抱歉,我现在意识到我应该添加更多信息,说明为什么这个解决方案不适合我...我现在会更新问题。
      • 出于兴趣,您使用的是默认 webview 还是 Crosswalk(或类似的东西)?
      • 我们使用的是默认的 Cordova webview,是的。
      • 好的,你是在模拟器上测试吗?如果是这样,您是否使用 livereload 插件来执行此操作。
      • 不,我们正在部署到设备并使用 weinre 远程调试它。
      猜你喜欢
      • 2014-11-29
      • 2019-02-18
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多