【问题标题】:In Cordova, how can I specify different package names for ios and android? [duplicate]在 Cordova 中,如何为 ios 和 android 指定不同的包名称? [复制]
【发布时间】:2017-01-19 01:18:37
【问题描述】:

由于遗留因素,我的 Android 和 iOS 应用程序的包名称不同。目前,Cordova 似乎在构建时将 config.xml 中的小部件 id 属性注入到两者中。有没有办法自定义这个?如果我直接编辑 AndroidManifest.xml,我希望它很快就会被覆盖。

谢谢。

【问题讨论】:

    标签: android cordova cordova-3


    【解决方案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

    编辑:(Cordova-Lib 已被移动)

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

    【讨论】:

    • windows 平台是否有任何等价物?
    【解决方案2】:

    一种自动化的方法是添加一个 after prepare 钩子。我从这里的如何根据环境替换文本的示例开始: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 目录,其中包含一个 replace_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's specific configuration/properties files
        update_app_id(rootdir, "android", configobj);
        update_app_id(rootdir, "ios", configobj);
    }
    

    请确保将 括号中的值替换为与您的应用/项目相关的值。

    【讨论】:

    【解决方案3】:

    注意: 这还没有经过测试,但我认为它应该可以工作。

    在 Cordova CLI 中创建新的 IOS 平台后,在以下文件中编辑包名称。

    app/platforms/ios/&lt;APP_NAME&gt;/config.xml app/platforms/ios/www/config.xml

    为避免出现丑陋的复杂情况,我建议您先在项目的不同 Git 分支中尝试此操作。

    【讨论】:

    • 谢谢,但我尽量避免编辑 platforms 目录,因为我没有将它们签入回购。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多