84

我是 Cordova CLI 的新手。

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

  1. 在项目 .plist 添加一个新行
  2. 在新行中输入以下值:
  3. :GDLibraryMode类型:字符串(默认):GDEnterpriseSimulation

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

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

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


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

对于迟到的任何人, Cordova CLI 7 及更高版本现在支持在项目 plist 中设置值

4

14 回答 14

68

我不认为你可以通过直接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 <your plugin name or file location>

于 2014-04-01T14:44:10.253 回答
44

我真的很喜欢@james使用 Cordova 钩子的解决方案。但是,有两个问题。文档状态:

这是使用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>
于 2015-10-26T10:11:26.150 回答
32

您可以在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 将报告构建错误。更好的错误处理是可能的,但实施起来很痛苦。

于 2015-08-06T02:24:23.600 回答
25

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

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

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

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

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

一些事情,确保科尔多瓦是最新的,并且你为 ios 添加了平台。

npm install -g cordova

此命令安装科尔多瓦。

cordova platform add ios

此命令为 ios 添加平台。

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

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

还有一句警告,我的公司几周前把这个离子框架应用程序丢到了我的腿上(截止日期很短)。我告诉你的一切都是基于几周的学习。所以这可能不是最佳做法,但我希望它可以帮助某人。

编辑

链接到文档

于 2016-04-22T16:28:55.410 回答
14

现在使用 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."

这样做的结果是,您不仅会<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/>

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

于 2016-10-06T04:06:22.000 回答
10

更新:对于想要在 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 开始,必须在 info.plist 中添加 NSCameraUsageDescription 和 NSPhotoLibraryUsageDescription。

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

于 2017-07-14T11:04:08.310 回答
9

我在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>
于 2018-07-03T10:55:02.497 回答
5

您可以通过直接编辑插件目录中的 ios.json 来设置应用程序的 plist 中的显示名称。

将以下内容添加到 ios.json 文件的 config_munge.files 部分就可以解决问题,即使使用 CLI 也会得到维护。

"*-Info.plist": {

    "parents": {
        "CFBundleDisplayName": [
            {
                "xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
                "count": 1
            }
        ]
    }
}

这是一个完整的例子

于 2015-01-06T06:58:21.417 回答
4

对的,这是可能的!

我正在使用 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
于 2019-09-03T03:37:48.160 回答
3

@TachyonVortex解决方案似乎是最好的选择,但在我的情况下崩溃了。该问题是由 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>
于 2016-09-26T18:57:49.780 回答
2

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

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

于 2016-04-11T16:04:47.330 回答
1

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

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

    plutil -convert xml1 Info.plist

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

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

  3. 如果要在 的顶层添加一个键,则.plist需要将 parent 设置为等于键名,然后嵌套一个<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>
于 2016-08-10T23:31:00.933 回答
0

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

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

于 2017-03-25T00:13:07.790 回答
-4

您只需要执行以下步骤 1。

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

于 2014-03-31T18:31:04.367 回答