我是Cordova CLI的新手。
我需要通过Cordova以编程方式执行以下步骤。
我想我需要在项目根目录的config.xml文件中执行此操作(或者可能是" platforms"文件夹中的那个)。
有人可以向我解释如何通过config.xml添加条目,以便在编译时添加上述条目吗?
我正在使用Cordova 3.3.1-0.42(我知道它不是最新的)。我已经完成了我的项目,一切都很好,我只需要将这个条目添加到pList中。
答案 0 :(得分:60)
我认为你不能通过直接config.xml
修改来做到这一点。至少,我在文档中没有看到任何提及:http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html
我认为你必须创建一个插件,因为他们可以插入plist条目:http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification
请参阅“config-file element”部分。以下是对plugin.xml
的相关部分的看法:
<platform name="ios">
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
<dict>
<key>GDLibraryMode</key>
<string>GDEnterpriseSimulation</string>
</dict>
</array>
</config-file>
</platform>
然后您可以安装插件:cordova plugin add <your plugin name or file location>
答案 1 :(得分:40)
我非常喜欢使用Cordova钩子的@ james&#39; solution。但是,有两个问题。 docs州:
/hooks
目录被视为已弃用,以支持config.xml
&#34; 这是使用plist NPM包的Node.js实现:
var fs = require('fs'); // nodejs.org/api/fs.html
var plist = require('plist'); // www.npmjs.com/package/plist
var FILEPATH = 'platforms/ios/.../...-Info.plist';
module.exports = function (context) {
var xml = fs.readFileSync(FILEPATH, 'utf8');
var obj = plist.parse(xml);
obj.GDLibraryMode = 'GDEnterpriseSimulation';
xml = plist.build(obj);
fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' });
};
在Cordova提供的所有钩子类型中,与您的情况相关的是:
after_prepare
before_compile
选择一个钩子类型,然后将钩子添加到config.xml
文件中:
<platform name="ios">
<hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
答案 2 :(得分:32)
您可以使用PlistBuddy脚本中的Cordova hook实用程序来修改* -Info.plist文件。
例如,我在<project-root>/hooks/after_prepare/010_modify_plist.sh
下面有以下脚本,它添加了一个字典属性并在该字典中添加了一个条目:
#!/bin/bash
PLIST=platforms/ios/*/*-Info.plist
cat << EOF |
Add :NSAppTransportSecurity dict
Add :NSAppTransportSecurity:NSAllowsArbitraryLoads bool YES
EOF
while read line
do
/usr/libexec/PlistBuddy -c "$line" $PLIST
done
true
确保脚本可执行(chmod +x
)。
脚本末尾的true
是因为PlistBuddy
返回错误退出代码,如果添加的密钥已经存在,并且没有提供检测密钥的方法已经存在。如果钩子脚本以错误状态退出,Cordova将报告构建错误。更好的错误处理是可能的,但实施起来很痛苦。
答案 3 :(得分:18)
这些是我最终要做的步骤,以使我的应用程序能够通过设备之间的iTunes共享文件。
1.在您的应用程序中,导航到您的config.xml。在平台标记 <config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
<true/>
</config-file>
下的此配置中输入此项。
npm install -g cordova
2。然后转到命令行工具并键入:cordova prepare
一些事情,确保cordova是最新的,并且您为ios添加了平台。
cordova platform add ios
此命令安装cordova。
<key>UIFileSharingEnabled</key>
<true/>
此命令为ios添加平台。
当您运行cordova prepare命令时,您正在使用在platform / ios文件夹中生成的Apple的Xcode SDK。在那里,您可以看到为您的应用程序生成的plist文件,标记为“yourApp-info.plist”。在那里,您可以看到xml布局中生成的新键和字符串,如下所示:
{{1}}
同样警告,我公司几周前将这种离子骨架应用程序放入了我的膝盖(截止日期非常短)。我告诉你的一切都是基于几个星期的学习。所以这可能不是最好的做法,但我希望它可以帮助别人。
答案 4 :(得分:13)
现在似乎可以使用config.xml:至少有一些核心插件作者这样说。例如,在Cordova Camera Plugin的文档中,他们讨论了iOS 10中您在plist中提供权限消息字符串的新要求。为了实现它,他们建议用参数执行plugin add命令,因此:
cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."
这样,您不仅可以在config.xml中添加新的<plugin>
,而且还有一个<variable>
子项:
<plugin name="cordova-plugin-camera" spec="~2.3.0">
<variable name="CAMERA_USAGE_DESCRIPTION" value="My App would like to access your camera, to take photos of your documents." />
</plugin>
然后它似乎与我的info.plist中的新键相关联,也许以某种方式在运行时传递值?
<key>NSCameraUsageDescription</key>
<string/>
<key>NSPhotoLibraryUsageDescription</key>
<string/>
如果我说我确切地知道它是如何工作的,我会撒谎,但它似乎指明了方向。
答案 5 :(得分:9)
更新:对于想要使用iOS&gt; = 10的相机的人。 这意味着,通常情况下,您可以在插件中配置为:
<!-- ios -->
<platform name="ios">
<config-file target="*-Info.plist" parent="NSLocationWhenInUseUsageDescription">
<string></string>
</config-file>
<config-file target="*-Info.plist" parent="NSCameraUsageDescription">
<string></string>
</config-file>
<config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
<string></string>
</config-file>
</platform>
但就目前而言,您无法在插件中配置NSCameraUsageDescription
和NSPhotoLibraryUsageDescription
。您需要在平台中配置它们 - &gt; Xcode或*-Info.plist
文件中的iOS项目。
从iOS 10开始,必须添加NSCameraUsageDescription和 info.plist中的NSPhotoLibraryUsageDescription。
答案 6 :(得分:7)
我在 ionic 3 中使用了以下内容,而没有任何其他插件或导入,我认为这可能对其他人有帮助:
<platform name="ios">
<edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
<string>Location is required so we can show you your nearby projects to support.</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
<string>Camera accesss required in order to let you select profile picture from camera.</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
<string>Photo library accesss required in order to let you select profile picture from gallery / library.</string>
</edit-config>
</platform>
答案 7 :(得分:4)
您可以直接编辑插件目录中的ios.json,在app的plist中设置显示名称。
将以下内容添加到ios.json文件的config_munge.files部分将会起到作用,即使使用CLI也会保留它。
"*-Info.plist": {
"parents": {
"CFBundleDisplayName": [
{
"xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
"count": 1
}
]
}
}
答案 8 :(得分:3)
@TachyonVortex solution似乎是最好的选择,但在我的情况下崩溃了。该问题是由一个空的NSMainNibFile字段引起的,该字段未被plist NPM包正确转换。在 .plist 文件
中 <key>NSMainNibFile</key>
<string></string>
<key>NSMainNibFile~ipad</key>
<string></string>
转换为:
<key>NSMainNibFile</key>
<string>NSMainNibFile~ipad</string>
我通过添加到脚本来修复它:
obj.NSMainNibFile = '';
obj['NSMainNibFile~ipad'] = '';
脚本最终看起来像(scripts / my-hook.js):
var fs = require('fs'); // nodejs.org/api/fs.html
var plist = require('plist'); // www.npmjs.com/package/plist
var FILEPATH = 'platforms/ios/***/***-Info.plist';
module.exports = function (context) {
var xml = fs.readFileSync(FILEPATH, 'utf8');
var obj = plist.parse(xml);
obj.GDLibraryMode = 'GDEnterpriseSimulation';
obj.NSMainNibFile = '';
obj['NSMainNibFile~ipad'] = '';
xml = plist.build(obj);
fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' });
};
和config.xml:
<platform name="ios">
<hook type="before_build" src="scripts/my-hook.js" />
</platform>
答案 9 :(得分:2)
我使用此插件来解决问题,也许它可以帮助您:
https://www.npmjs.com/package/cordova-plugin-queries-schemes
答案 10 :(得分:2)
是的,有可能!
我正在使用Cordova 9.0.0(cordova-lib@9.0.1)。
例如,这是我用来将新字符串值插入Info.plist的配置文件:
time_out
之后,请不要忘记通过在终端中运行以下两个命令来重建登台文件:
<platform name="ios">
<edit-config file="*-Info.plist" mode="merge" target="NSMicrophoneUsageDescription">
<string>My awesome app wish to hear your awesome voice through Microphone. Not for fancy stuff, just want to hear you.</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="---Key configuration---">
<string>---string value---</string>
</edit-config>
</platform>
要确认更改,可以使用xCode打开新生成的.plist文件。
-Info.plist文件位于:
cordova platform rm ios
cordova platform add ios
答案 11 :(得分:0)
如果您尝试在.plist
中使用<config-file>
标记修改原生iOS插件中的plugin.xml
,则需要执行以下操作:
确保您的.plist
是xml,而非二进制!您可以使用plutil
将二进制.plist
转换为xml,然后提交版本控制。
plutil -convert xml1 Info.plist
<config-file>
的说明表明target=
与platforms/ios/<project>/
生成的xcode项目相关,但我发现我需要在我的路径前加一个通配符让它工作:
target="*/Resources/MyResources.bundle/Info.plist"
如果要在.plist
的顶层添加密钥,则需要将父级设置为等于密钥名称,然后使用该值嵌套<string>
标记。使用<array>
或<dict>
作为示例显示将导致这些键嵌套在 parent
下。
以下是一个完整的示例,可用于添加多个顶级属性:
<platform name="ios">
<config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyDistribution">
<string>Cordova</string>
</config-file>
<config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyVersion">
<string>3.2.0</string>
</config-file>
</platform>
答案 12 :(得分:0)
我更喜欢更大项目的after_prepare挂钩,或者如果你有多个使用相同权限的插件。但你可以随时采用简单的方法:
简单地: - 删除需要所需权限的插件 - 使用--save再次添加它 - 在config.xml中,插件现在有一个新变量,其中包含可以填写的空白描述 - 现在用 - 发布构建ios,它们将被设置。
答案 13 :(得分:0)
几天前,我的IONIC 4项目也遇到了同样的问题。当我上传IPA时,我从App Store Connect收到此警告。
我尝试通过“ Config.xml”文件修复此问题。但是我没有找到合适的解决方案。
我以其他方式解决了这个问题。我把值放在“ XCODE”中。它已经回答了以下链接: NSPhotoLibraryUsageDescription key must be present in Info.plist to use camera roll
谢谢。
答案 14 :(得分:-4)
您只需要执行以下步骤即可 1.
转到Project导航器 选择目标 单击选项卡选项中的信息其他选项是构建设置构建阶段 你会看到关键的类型值 当您指向任何键名时,您将找到+和 - 符号 点击+号 在关键部分写下
Key: GDLibraryMode
在tyoe部分Type:String
值部分中的Value:GDEnterpriseSimulation