通过Cordova config.xml添加条目到iOS .plist文件
首先让我先说一下,我对Cordova CLI有点新鲜。 无论如何,这是我的问题:
我需要通过编程方式通过Cordova执行以下步骤。
- 在项目.plist中添加一个新行
- 在新行中input以下值:
- 键 :GDLibraryMode types :string(默认) 值 :GDEnterpriseSimulation
我想我需要在我的项目的根(也可能是“平台”文件夹)中的config.xml文件中执行此操作。
有人可以向我解释如何通过config.xml添加条目,以便在编译时添加上面的条目。
我正在使用cordova3.3.1-0.42(我知道这不是最新的)。 我已经做了我的项目,一切都很好,我只需要添加此项添加到pList。
非常感谢!
〜红
我不认为你可以通过直接的config.xml
修改。 至less,在文档中我没有看到任何提及: http : //cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html
我想你必须创build一个插件,因为他们可以插入plist条目: http : //docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification
请参阅“configuration文件元素”部分。 下面是关于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>
我真的很喜欢@詹姆斯的解决scheme使用Cordova钩子。 但是,有两个问题。 文档状态:
- “我们强烈build议使用Node.js编写你的钩子”
- “
/hooks
目录被认为不赞成config.xml
中的钩子元素”
这是一个使用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提供的所有钩子types中,与您的情况相关的钩子types是:
-
after_prepare
-
before_compile
select一个钩子types,然后将钩子添加到你的config.xml
文件中:
<platform name="ios"> <hook type="after_prepare" src="scripts/my-hook.js" /> </platform>
您可以使用Cordova钩子脚本中的PlistBuddy实用程序来修改* -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将报告构build错误。 更好的error handling是可能的,但实施起来很痛苦。
现在使用config.xml看起来是可能的:至less有一些核心插件作者这么说。 例如,在Cordova Camera Plugin的文档中,他们讨论了iOS 10中的新要求,即在plist中提供了许可消息string。 为了完成它,他们build议使用参数执行插件添加命令,从而:
cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."
这样做的结果是你不仅得到了一个新的<plugin>
添加到config.xml,但它有一个<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/>
如果我说我确切地知道它是如何工作的,我会撒谎,但似乎指明了方向。
这些是我最终做的使我的应用程序通过设备之间的iTunes共享文件的步骤。
1.在您的应用程序中导航到您的config.xml。 在平台标记<platform name="ios">
下input这个代码到你的configuration文件中。
<config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled"> <true/> </config-file>
2.然后转到您的命令行工具并input:cordova prepare
- 卸载并重新安装你的应用程序,你会看到你的应用程序出现在iTunes中,你可以在你的设备之间共享任何文件。
一些事情,确保cordova是最新的,并且你添加了平台的ios。
npm install -g cordova
这个命令安装cordova。
cordova platform add ios
这个命令为ios添加平台。
发生什么事是当您运行在platform / ios文件夹中生成的使用Apple的Xcode SDK的cordova prepare命令时。 在那里,您可以看到为您的应用程序生成的plist文件,标记为“yourApp-info.plist”。 在那里你可以看到在xml布局中生成的新键和string,如下所示:
<key>UIFileSharingEnabled</key> <true/>
也是警告,几个星期前,我的公司把这个ionic framework应用放到了我的腿上(截止时间很短)。 我告诉你的一切都是基于几个星期的学习。 所以这可能不是最好的做法,但我希望它能帮助别人。
您可以通过直接编辑插件目录中的ios.json来设置应用程序plist中的显示名称。
将以下内容添加到ios.json文件的config_munge.files部分即可实现,甚至在使用CLI时也会保留。
"*-Info.plist": { "parents": { "CFBundleDisplayName": [ { "xml": "<string>RevMob Ads Cordova Plugin Demo</string>", "count": 1 } ] } }
这是一个完整的例子
@TachyonVortex 解决scheme似乎是最好的select,但在我的情况下崩溃了。 这个问题是由一个空的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>
我已经使用这个插件来解决这个问题,也许它可以帮助你:
https://www.npmjs.com/package/cordova-plugin-queries-schemes
更新:对于人们想使用相机与iOS> = 10.这意味着,通过正常,你可以在插件configuration为:
<!-- 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>
但现在,您不能在插件中configurationNSCameraUsageDescription
和NSPhotoLibraryUsageDescription
。 你需要通过Xcode或者在*-Info.plist
文件中在平台 – > iOS项目中进行configuration。
从iOS 10开始,必须在info.plist中添加NSCameraUsageDescription和NSPhotoLibraryUsageDescription。
了解更多信息: https : //www.npmjs.com/package/cordova-plugin-camera
如果您试图在plugin.xml
使用<config-file>
标记在本机iOS插件中修改.plist
,则需要执行以下操作:
-
确保你的
.plist
是xml,而不是二进制的! 您可以使用plutil
将二进制.plist
转换为xml,并将其提交给版本控制。plutil -convert xml1 Info.plist
-
<config-file>
说明指出target=
是相对于在platforms/ios/<project>/
生成的xcode项目,但是我发现我需要在我的path上加一个通配符来使它工作: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>
我更喜欢更大项目的after_prepare钩子,或者如果您有多个使用相同权限的插件。 但是你总是可以用简单的方式:
简单地说: – 删除需要所需权限的插件 – 在config.xml文件中再次添加 – 插件现在有一个新的variables,可以填写一个空白的描述 – 现在用 – 版本创buildios他们将被设置。
你只需要以下步骤1。
转到项目导航器select目标点击信息从选项卡选项其他选项是build立设置构build阶段,你会看到键types值当您指向任何键名称,你会发现+和 – 签名点击+符号写
Key: GDLibraryMode
in关键部分Type:String
tyoe部分中的Type:String
Value:GDEnterpriseSimulation
in value部分