В Кордове, как я могу указать разные имена пакетов для ios и android?

Из-за устаревших факторов имена пакетов моих приложений для Android и iOS различны. В настоящее время Кордова, кажется, вводит атрибут id widget из config.xml в оба при создании. Нет ли способа настроить это? Если я отредактирую файл AndroidManifest.xml напрямую, я ожидаю, что он скоро будет перезаписан.

Спасибо.

Ответы

Ответ 1

Теперь это встроено в CLI (наконец):

В вашем файле config.xml -

Пример:

<widget
    android-packageName="com.example.android"
    ios-CFBundleIdentifier="com.example.ios">

Источник:

https://github.com/apache/cordova-lib/blob/master/cordova-lib/src/configparser/ConfigParser.js#L92

Изменить: (Кордова-Lib с тех пор перемещена)

https://github.com/apache/cordova-lib/blob/master/cordova-common/src/ConfigParser/ConfigParser.js#L109

Ответ 2

Способом автоматизации этого является добавление в hook после завершения. Я начал с примера того, как здесь можно заменить текст в зависимости от среды: http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/.

У меня есть project.json в моем проекте, который указывает, какой id я хочу использовать для каждой платформы:

{ 
    "android": 
    {
        "app_id": "<my Android Package name>"
    },
    "ios": 
    {
        "app_id": "<my iOS Bundle Identifier>"
    }
}

Затем в каталоге /hooks у меня есть каталог /after _prepare с заменой_text.js следующим образом:

#!/usr/bin/env node

// this plugin replaces arbitrary text in arbitrary files
//

var fs = require("fs");
var path = require("path");

var rootdir = process.argv[2];

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

    var result = data.replace(to_replace, replace_with);
    fs.writeFileSync(filename, result, "utf8");
}

function update_app_id(rootdir, platform, configobj) {
    var appId = configobj[platform].app_id,
        stringToReplace = "<value of the widget id property in the config.xml>";

    if (platform === "android") {

        replace_string_in_file(path.join(rootdir, "platforms/android/AndroidManifest.xml"), stringToReplace, appId);
        replace_string_in_file(path.join(rootdir, "platforms/android/res/xml/config.xml"), stringToReplace, appId);

    } else if (platform === "ios") {

        replace_string_in_file(path.join(rootdir, "platforms/ios/<app name>/<app name>-Info.plist"), stringToReplace, appId);
        replace_string_in_file(path.join(rootdir, "platforms/ios/<app name>/config.xml"), stringToReplace, appId);

    }
}

if (rootdir) {
    var ourconfigfile = path.join(rootdir, "project.json");
    var configobj = JSON.parse(fs.readFileSync(ourconfigfile, "utf8"));

    // Update each platform specific configuration/properties files
    update_app_id(rootdir, "android", configobj);
    update_app_id(rootdir, "ios", configobj);
}

Пожалуйста, не забудьте заменить значения, обозначенные < > скобки со значениями, которые относятся к вашему приложению/проекту.

Ответ 3

Примечание: Это не было протестировано, но я думаю, что он должен работать.

После создания новой платформы IOS в CLI Cordova, отредактируйте имя пакета в файлах ниже.

app/platforms/ios/<APP_NAME>/config.xml app/platforms/ios/www/config.xml

Чтобы избежать уродливого осложнения, я предлагаю вам попробовать это сначала в другой ветке Git вашего проекта.