【问题标题】:Add entry to iOS .plist file via Cordova config.xml通过 Cordova config.xml 向 iOS .plist 文件添加条目
【发布时间】:2014-05-11 05:41:14
【问题描述】:

我是 Cordova CLI 的新手。

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

  1. 在项目 .plist 中添加新行
  2. 在新行中输入以下值:
  3. Key:GDLibraryMode Type:String(默认)Value:GDEnterpriseSimulation

我认为我需要在项目根目录(或者“平台”文件夹中的那个)的 config.xml 文件中执行此操作。

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

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


编辑:2/8/21 根据对此问题的评论:

对于迟到的人,Cordova CLI 7 and above 现在支持在项目 plist 中设置值

【问题讨论】:

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


【解决方案1】:

这些是我最终执行的步骤,以使我的应用程序能够通过 iTunes 在设备之间共享文件。

1.在您的应用程序中导航到您的 config.xml。在平台标签 <platform name="ios"> 下将此片段输入到您的配置中。

 <config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
      <true/>
  </config-file>

2。然后转到您的命令行工具并输入:cordova prepare

  1. 在您的设备上卸载并重新安装您的应用程序,您将看到您的应用程序出现在 iTunes 中,以便您在设备之间共享任何文件。

一些事情,确保cordova是最新的,并且你添加了ios平台。

npm install -g cordova

此命令安装cordova。

cordova platform add ios

此命令为 ios 添加平台。

当您运行 cordova prepare 命令时,您使用的是在 platform/ios 文件夹中生成的 Apple 的 Xcode SDK。在那里您可以看到为您的应用程序生成的 plist 文件,该文件标记为“yourApp-info.plist”。在那里您可以看到在 xml 布局中生成的新键和字符串,如下所示:

 <key>UIFileSharingEnabled</key>
 <true/>

另外警告一下,我的公司在几周前放弃了这个离子框架应用程序(截止日期非常短)。我告诉你的一切都是基于几周的学习。所以这可能不是最佳做法,但我希望它可以帮助某人。

编辑

Link to the docs

【讨论】:

  • 这个工作还需要其他什么吗?我正在使用 Cordova 6.2(最新产品),即使我将条目添加到 config.xml 中,我也没有在 plist 中看到它。您是否有可能拥有 Cordova 自定义配置插件 (github.com/dpa99c/cordova-custom-config)?
  • 像魅力一样工作。谢谢。
  • &lt;config-file&gt; 元素是在 Cordova CLI 版本 7 中添加的,因此使用最新版本的 Cordova CLI 可以正常工作(请参阅 this github issue for a reproducible proof from the author of cordova-custom-config)。
  • 这对我有用!但是,将平台指定为标签上的属性似乎是多余的,尤其是因为它已经放置在 iOS 平台下。它在我的身上没有它。
【解决方案2】:

是的,有可能!

我正在使用 Cordova 9.0.0 (cordova-lib@9.0.1)。

例如,这是我用来将新字符串值插入 Info.plist 的配置文件:

<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>

之后,不要忘记通过在终端中运行这两个命令来重建暂存文件:

cordova platform rm ios
cordova platform add ios

要确认更改,您可以使用 xCode 打开新生成的 .plist 文件。

-Info.plist 文件位于:

./platform/ios/[your app name]/[your app name]-Info.plist

【讨论】:

  • edit-config 假定目标已存在于您的 plist 中。需要明确的是,如果你想添加一个新的键/字符串对,你应该使用config-file,它将新的子元素添加到 xml 树中
【解决方案3】:

我在 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>

【讨论】:

  • mode 属性上,我使用overwrite 而不是merge,然后运行cordova prepare ios 以成功地将我的config.xml 文件的edit-config 标签应用于我的xCode 项目的@987654328 @.
【解决方案4】:

更新:对于想要在 iOS >= 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。您需要通过 Xcode 在平台 -> iOS 项目或*-Info.plist 文件中配置它们。

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

了解更多:https://www.npmjs.com/package/cordova-plugin-camera

【讨论】:

    【解决方案5】:

    对于较大的项目,或者如果您有多个使用相同权限的插件,我更喜欢 after_prepare 挂钩。但你总是可以走简单的路:

    简单地说: - 删除需要所需权限的插件 - 使用 --save 再次添加 - 在 config.xml 中,插件现在有一个带有空白描述的新变量,您可以填写 - 现在使用 --release 构建 ios,它们将被设置。

    【讨论】:

      【解决方案6】:

      @TachyonVortex solution 似乎是最好的选择,但在我的情况下却崩溃了。该问题是由 plist NPM 包未正确转换的空 NSMainNibFile 字段引起的。在 .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>
      

      【讨论】:

      • 我用这段代码在hooks/after_platform_add目录中写了一个patch_plist.js。但我仍然在我的 plist 文件中得到&lt;key&gt;NSMainNibFile&lt;/key&gt;&lt;string&gt;NSMainNibFile~ipad&lt;/string&gt;。请问有什么办法可以解决这个问题吗?
      【解决方案7】:

      现在使用 config.xml 似乎可以做到这一点:至少一些核心插件作者是这样说的。例如,在 Cordova Camera Plugin 的文档中,他们讨论了 iOS 10 中的新要求,即您在 plist 中提供权限消息字符串。为了完成它,他们建议执行带有参数的插件添加命令,因此:

      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 中添加一个新的 &lt;plugin&gt;,而且还会有一个 &lt;variable&gt; 子级:

      <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/>
      

      如果我说我确切地知道它是如何工作的,那我就是在撒谎,但它似乎指明了方向。

      【讨论】:

      • CAMERA_USAGE_DESCRIPTION 被传递给 NSCameraUsageDescription。如果要为 NSPhotoLibraryUsageDescription 添加值,还需要添加 &lt;variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="whatever" /&gt;
      • 如果您使用的是 PhoneGap Build 服务,这是设置这些值的推荐方法
      • 我必须在 &lt;key&gt;NSCameraUsageDescription&lt;/key&gt; 的键下方添加一个 &lt;string&gt;Random camera usage text&lt;/string&gt; 才能让我的构建被接受。配置不加文字
      【解决方案8】:

      如果您尝试在您的plugin.xml 中使用&lt;config-file&gt; 标签修改原生iOS 插件中的.plist,您需要执行以下操作:

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

        plutil -convert xml1 Info.plist

      2. &lt;config-file&gt; 的说明表明target= 与在platforms/ios/&lt;project&gt;/ 处生成的xcode 项目相关,但我发现我需要在路径前添加一个通配符才能使其工作:

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

      3. 如果你想在.plist的顶层添加一个key,你需要设置parent等于key的名字,然后嵌套一个&lt;string&gt;标签和value。如任何示例所示,使用&lt;array&gt;&lt;dict&gt; 将导致这些键嵌套在 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>
      

      【讨论】:

      • 这对我不起作用。我尝试添加上面的内容,但我的 plist 中没有任何变化
      • 先把plist放到根目录试试缩小原因?不幸的是,据我所知,这个功能默默地失败了。
      【解决方案9】:

      我已经使用这个插件解决了这个问题,也许它可以帮助你:

      https://www.npmjs.com/package/cordova-plugin-queries-schemes

      【讨论】:

        【解决方案10】:

        我真的很喜欢 @james 的 solution 使用 Cordova 钩子。但是,有两个问题。 docs 状态:

        • “我们强烈建议使用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 提供的所有钩子类型中,与您的情况相关的是:

        • after_prepare
        • before_compile

        选择一个挂钩类型,然后将挂钩添加到您的config.xml 文件中:

        <platform name="ios">
            <hook type="after_prepare" src="scripts/my-hook.js" />
        </platform>
        

        【讨论】:

        • 节点 plist 库在解析我的 plist 文件时遇到了一些问题,因此我无法使用此解决方案并选择了 James',它使用 Mac 上包含的 PListBuddy 可执行文件。这是一个很好的解决方案,如果 plist 库更可靠的话。我确实按照您的建议从config.xml 文件中引用了我的脚本。
        • 不错!无需使用任何额外的插件,就像一个魅力!对于这样一个简单的问题,所有其他解决方案似乎都已过时或变得复杂。
        • plist npm 模块严重损坏。当源文件包含空值时,它将产生无效的 .plist 文件。请改用 simple-plist。
        • 我在使用 cordova@8 添加本地插件时遇到了很多麻烦,这个解决方案在我的情况下效果更好并且更简单
        【解决方案11】:

        您可以在Cordova hook 脚本中使用PlistBuddy 实用程序来修改*-Info.plist 文件。

        例如,我在&lt;project-root&gt;/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 将报告构建错误。更好的错误处理是可能的,但实施起来很痛苦。

        【讨论】:

        • 有效!我尝试了您和 TachyonVortex 的解决方案。 TachyonVortex 的解决方案使用的 node.js 库没有正确解析我的 PList 文件,而在您的答案中使用的 Mac 包含的 PListBuddy 可以。我确实按照 TachyonVortex 的建议引用了 config.xml 的钩子。
        • 如果你想每次都更新 plist,即使密钥已经存在,然后在 add 语句之前添加 Remove : NSAppTransportSecurity ,它将首先删除 NSAppTransportSecurity 然后添加它。这应该不会导致任何崩溃。
        【解决方案12】:

        您可以通过直接编辑plugins目录下的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

        【讨论】:

        • 请注意,从 Visual Sutdio Tools for Cordova 运行时这不起作用,因为 ios.json 会被工具覆盖。
        • 这个答案有两个问题。首先,在运行cordova platform remove ios 后跟cordova platform add ios 时,对/plugins/ios.json 的任何手动编辑都将丢失。其次,@Red2678 要求解决方案“通过 Cordova 以编程方式执行编辑......以便在编译时添加新条目。”
        【解决方案13】:

        我认为你不能通过直接的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

        请参阅“配置文件元素”部分。以下是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 &lt;your plugin name or file location&gt;

        【讨论】:

        • @mooreds 抱歉,我没理解您的回答……我以为您的解决方案是使用 gap:config-file。现在,我了解了您的方法(为特定的 plist 修改创建专用插件),我会尝试一下。谢谢!
        • @mooreds,Cordova/PhoneGap 文档具有误导性。我发现 key 应该在parent 中指定,而 value 部分应该是内部 XML。在这种特殊情况下,它应该如下所示: GDEnterpriseSimulation
        • 感谢@rjhilgefort,轻松多了! :)
        • 作为参考,从 Cordova CLI 7+ 开始,它可以通过 config.xml 元素在 config.xml 中完成 - 有关如何操作的详细信息,请参阅其他答案那个。
        【解决方案14】:

        您只需要以下步骤 1.

        转到项目导航器 选择目标 单击选项卡选项中的信息其他选项是构建设置构建阶段 您将看到键类型值 当您指向任何键名时,您会发现 + 和 - 号 点击+号 在关键部分写Key: GDLibraryMode Type:String在tyoe部分 Value:GDEnterpriseSimulation 在值部分

        【讨论】:

        • 我完全想这样做,但是当我从 CLI 编译 Cordova 应用程序时,项目的文件夹基本上被删除并重新制作。然后我每次编译时都必须执行上述操作(这并不难),但我希望只使用 Cordova 的 config.xml 来为我完成。
        • 你能告诉我为什么需要编译通过你通过xcode运行应用程序然后这个解决方案适合你
        • 嗨@Nitin,这不是一个“要求”,因为它是使用Cordova CLI 的标准方式。如果我使用“命令 Cordova build”,则每次运行该命令时都会删除并重新创建项目文件夹。
        猜你喜欢
        • 1970-01-01
        • 2015-09-29
        • 2016-09-08
        • 1970-01-01
        • 2014-02-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多