【发布时间】:2017-01-19 01:18:37
【问题描述】:
由于遗留因素,我的 Android 和 iOS 应用程序的包名称不同。目前,Cordova 似乎在构建时将 config.xml 中的小部件 id 属性注入到两者中。有没有办法自定义这个?如果我直接编辑 AndroidManifest.xml,我希望它很快就会被覆盖。
谢谢。
【问题讨论】:
由于遗留因素,我的 Android 和 iOS 应用程序的包名称不同。目前,Cordova 似乎在构建时将 config.xml 中的小部件 id 属性注入到两者中。有没有办法自定义这个?如果我直接编辑 AndroidManifest.xml,我希望它很快就会被覆盖。
谢谢。
【问题讨论】:
现在已内置到 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 已被移动)
【讨论】:
windows 平台是否有任何等价物?
一种自动化的方法是添加一个 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);
}
请确保将 括号中的值替换为与您的应用/项目相关的值。
【讨论】:
注意: 这还没有经过测试,但我认为它应该可以工作。
在 Cordova CLI 中创建新的 IOS 平台后,在以下文件中编辑包名称。
app/platforms/ios/<APP_NAME>/config.xml
app/platforms/ios/www/config.xml
为避免出现丑陋的复杂情况,我建议您先在项目的不同 Git 分支中尝试此操作。
【讨论】:
platforms 目录,因为我没有将它们签入回购。