web-dev-qa-db-ja.com

config.xmlで定義したバージョン文字列を取得する方法

Cordovaアプリのバージョンを確認するにはどうすればよいですか?バージョン情報画面に表示するには、その情報が必要です。

Config.xmlを読み取ってバージョン文字列を取得することは可能ですか?これはこのファイルで既に維持していますか?

<widget ... version="0.0.1" ...

コードのいくつかの場所でアプリのバージョン番号を維持する必要がないソリューションが欲しいのですが。また、ほとんどのプラグインはプラットフォームとしてAndroid、iOS、ブラウザをサポートしていないため、その目的のためのプラグインは必要ありません。

または、コアプラグイン属性を見落としていますか?

または、config.xmlではない1つのファイルを維持し、config.xmlがそのファイルからバージョン情報を取得するソリューションはありますか?

アプリのバージョン情報画面に「バージョン情報の表示」をどのように実装していますか?任意のヒントをいただければ幸いです。

私のCordovaバージョンは:

>cordova -v
4.2.0
15
Strubbl

これを達成するためにサードパーティのプラグインを使用することに興味がない場合は、Cordovaフックを使用する方法だと思います。 before_buildフックを考え出して、config.xmlファイルからバージョンを読み取り、同じものをアプリで利用できます。

幸いなことに、このフックは次の link で簡単に利用でき、config.xmlからバージョンを読み取り、必要に応じて依存関係として挿入します。

よりよく理解するために、 cordovaフック の公式ドキュメントも参照することをお勧めします。

実際、config.xmlからバージョン情報を読み取って、index.htmlに作成できるプレースホルダーに直接入れて、バージョン情報を表示することもできます。これは、コードをビルドする前にフックを使用して行うことができます。フックは、ファイル操作を行うWindowsバッチファイルを使用します。 github page のバッチファイルを使用するCordovaフックの作業サンプルをチェックアウトできます。

17
Gandhi

@Gandhiが彼の回答で指摘したスクリプトに基づいて、現在のCordova @ 8で機能するようにスクリプトを更新しました。「before_build」ではなく「after_prepareフックとして使用します。 、後者の場合のように、cordovaがすぐにプラットフォームディレクトリにコンテンツをコピーしたときに、変更されたファイルが再び上書きされましたafterフックが実行されました...

スクリプトはxml2jsを使用するため、必ずnpm i xml2js --save-devを実行してxml2jsを使用可能にします。

#!/usr/bin/env node

// taken from https://www.bram.us/2015/01/04/cordova-build-hook-script-for-displaying-build-version-in-your-app/
// see https://stackoverflow.com/a/42650842
// This plugin replaces text in a file with the app version from config.xml.

// be sure to exec `npm i xml2js --save-dev` to make xml2js available


var wwwFileToReplace = "js/config.js";

var fs = require('fs');
var path = require('path');
var xml2js = require('xml2js');

function loadConfigXMLDoc(filePath) {
    var json = "";
    try {
        var fileData = fs.readFileSync(filePath, 'ascii');
        var parser = new xml2js.Parser();
        parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
                           //console.log("config.xml as JSON", JSON.stringify(result, null, 2));
                           json = result;
                           });
        console.log("File '" + filePath + "' was successfully read.");
        return json;
    } catch (ex) {
        console.log(ex)
    }
}

function replace_string_in_file(filename, to_replace, replace_with) {
    var data = fs.readFileSync(filename, 'utf8');

    var result = data.replace(new RegExp(to_replace, "g"), replace_with);
    fs.writeFileSync(filename, result, 'utf8');
    //console.log("replaced in ", filename, "(", to_replace, " -> ", replace_with);
    var data2 = fs.readFileSync(filename, 'utf8');
    console.log(data2);
}

module.exports = function(context) {

    // var rootdir = process.argv[2]; // old cordova version
    var rootdir = context.opts.projectRoot;
    console.log("projectRoot=", rootdir);

    var configXMLPath = "config.xml";
    var rawJSON = loadConfigXMLDoc(configXMLPath);
    var version = rawJSON.widget.$.version;
    console.log("Version:", version);

    // var currentBuildPlatforms = process.env.CORDOVA_PLATFORMS.split(","); // old cordova version
    var currentBuildPlatforms = context.opts.cordova.platforms;
    //console.log(JSON.stringify(context));
    console.log("Current build platforms: ", currentBuildPlatforms);

    if (rootdir) {
        currentBuildPlatforms.forEach(function(val, index, array) {
            var wwwPath = "";
            switch(val) {
                case "ios":
                    wwwPath = "platforms/ios/www/";
                    break;
                case "Android":
                    wwwPath = "platforms/Android/assets/www/";
                    break;
                default:
                    console.log("Unknown build platform: " + val);
            }
            var fullfilename = path.join(rootdir, wwwPath + wwwFileToReplace);
            if (fs.existsSync(fullfilename)) {
                replace_string_in_file(fullfilename, "%%VERSION%%", version);
                console.log("Replaced version in file: " + fullfilename);
            }
        });
    }

}

このフックをconfig.xmlに含めます:

<hook src="scripts/after_prepare_read_app_version.js" type="after_prepare" />
3
Pedi T.

私は https://github.com/whiteoctober/cordova-plugin-app-version で説明されているプラ​​グインを使用します:コルドバプラグイン追加 https://github.com/whiteoctober/ cordova-plugin-app-version.git

2ステップ(カットアンドペースト)jQueryまたはAngularJSを使用している場合、promiseスタイルがサポートされます。次のようなものを使用してください:

cordova.getAppVersion.getVersionNumber().then(function (version) {
    $('.version').text(version);
});

そうでない場合は、コールバック関数を渡します。

cordova.getAppVersion.getVersionNumber(function (version) {

alert(version);
});

乾杯

1
alvaro562003

私はこのようなことをするだけです:

cordova.getAppVersion.getVersionNumber().then(function (version) {
   if (!window.localStorage['version'] || window.localStorage['version'] <    version) {
       window.localStorage['version'] = version;
   }
});

そうすれば、必要な場所でwindow.localStorage['version']を呼び出すことができます。

1
jonhairston