通过Cordova config.xml添加条目到iOS .plist文件

首先让我先说一下,我对Cordova CLI有点新鲜。 无论如何,这是我的问题:

我需要通过编程方式通过Cordova执行以下步骤。

  1. 在项目.plist中添加一个新行
  2. 在新行中input以下值:
  3. :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

  1. 卸载并重新安装你的应用程序,你会看到你的应用程序出现在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> 

但现在,您不能在插件中configurationNSCameraUsageDescriptionNSPhotoLibraryUsageDescription 。 你需要通过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 ,则需要执行以下操作:

  1. 确保你的.plist是xml,而不是二进制的! 您可以使用plutil将二进制.plist转换为xml,并将其提交给版本控制。

    plutil -convert xml1 Info.plist

  2. <config-file>说明指出target=是相对于在platforms/ios/<project>/生成的xcode项目,但是我发现我需要在我的path上加一个通配符来使它工作:

    target="*/Resources/MyResources.bundle/Info.plist"

  3. 如果要在.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部分