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

时间:2014-03-31 18:15:24

标签: ios cordova phonegap-plugins cordova-3 cordova-plugins

我是Cordova CLI的新手。

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

  1. 在项目.plist中添加新行
  2. 在新行中输入以下值:
  3. :GDLibraryMode 类型:字符串(默认):GDEnterpriseSimulation
  4. 我想我需要在项目根目录的config.xml文件中执行此操作(或者可能是" platforms"文件夹中的那个)。

    有人可以向我解释如何通过config.xml添加条目,以便在编译时添加上述条目吗?

    我正在使用Cordova 3.3.1-0.42(我知道它不是最新的)。我已经完成了我的项目,一切都很好,我只需要将这个条目添加到pList中。

15 个答案:

答案 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州:

  • &#34;我们强烈建议您使用Node.js&#34;
  • 编写挂钩
  • &#34; /hooks目录被视为已弃用,以支持config.xml&#34;
  • 中的hook元素

这是使用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

  1. 在您的设备上卸载并重新安装您的应用程序,您将看到您的应用程序显示在iTunes中,以便您在设备之间共享任何文件。
  2. 一些事情,确保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>

但就目前而言,您无法在插件中配置NSCameraUsageDescriptionNSPhotoLibraryUsageDescription。您需要在平台中配置它们 - &gt; Xcode或*-Info.plist文件中的iOS项目。

  

从iOS 10开始,必须添加NSCameraUsageDescription和   info.plist中的NSPhotoLibraryUsageDescription。

了解详情:https://www.npmjs.com/package/cordova-plugin-camera

答案 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
            }
        ]
    }
}

这里是complete example

答案 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,则需要执行以下操作:

  1. 确保您的.plist是xml,而非二进制!您可以使用plutil将二进制.plist转换为xml,然后提交版本控制。

    plutil -convert xml1 Info.plist

  2. <config-file>的说明表明target=platforms/ios/<project>/生成的xcode项目相关,但我发现我需要在我的路径前加一个通配符让它工作:

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

  3. 如果要在.plist的顶层添加密钥,则需要将父级设置为等于密钥名称,然后使用该值嵌套<string>标记。使用<array><dict>作为示例显示将导致这些键嵌套在 parent

  4. 以下是一个完整的示例,可用于添加多个顶级属性:

    <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收到此警告。

enter image description here

我尝试通过“ 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