Добавить запись в iOS.plist файл через Cordova config.XML

Я новичок в Cordova CLI.

Мне нужно выполнить следующие шаги программно через Cordova.

  1. в проект .plist добавить новую строку
  2. введите следующие значения в новую строку:
  3. ключ: GDLibraryMode тип: String (по умолчанию) стоимостью: GDEnterpriseSimulation

Я думаю, что мне нужно сделать это в конфиге.xml-файл в корне моего проекта (или, возможно, один в папке "платформы").

может кто-нибудь объяснить мне, как добавить запись через конфиг.xml, чтобы вышеупомянутая запись была добавлена во время компиляции?

Я использую Cordova 3.3.1-0.42 (я знаю, что это не последнее). Я уже сделал свой проект, и все в порядке,мне просто нужно добавить эту запись в pList.

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

см. раздел "элемент config-file". Вот догадка о том, что соответствующий раздел 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>


мне очень нравится @james решение используя крючок Cordova. Однако есть два вопроса. The docs состояние:

  • "мы настоятельно рекомендуем писать ваши крючки с помощью узел.js"
  • "/hooks каталог считается устаревшим в пользу элементов крючка в config.xml"

вот узел.реализация js с использованием исчезновение NPM пакет:

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

выберите тип крючка, а затем добавьте крючок в свой :

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

можно использовать 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 сообщит об ошибке сборки, если скрипт hook завершает работу со статусом ошибки. Лучшая обработка ошибок возможна, но боль для реализации.


Это шаги, которые я сделал, чтобы позволить моему приложению обмениваться файлами через itunes между устройствами.

1.В приложении перейдите к конфигурации.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 вы используете Xcode SDK от Apple, который генерируется в папке platform/ios. Там вы можете увидеть файл plist, созданный для вашего приложения, который помечен как " yourApp-info.файл plist". Там вы можете увидеть новый ключ и строку, созданные в макете xml, который выглядит следующим образом:

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

также слово предупреждения, моя компания уронила это приложение Ionic framework на мои колени пару недель назад (с очень коротким сроком). Все, что я говорю, основано на двухнедельном обучении. Так что это может быть не лучшая практика, но я надеюсь, что это поможет кому-то.


это кажется возможным теперь с помощью конфигурации.xml: по крайней мере, некоторые авторы основных плагинов так говорят. Например, в документах для Cordova Плагин Камеры, они обсуждают новое требование в 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>

который затем, кажется, коррелирует с новыми ключами в моей информации.plist, возможно, каким-то образом передает значения во время выполнения?

  <key>NSCameraUsageDescription</key>
  <string/>
  <key>NSPhotoLibraryUsageDescription</key>
  <string/>

UPDATE: для людей, которые хотят использовать камеру с 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>

но сейчас вы не можете config NSCameraUsageDescription и NSPhotoLibraryUsageDescription в плагин. Вам нужно настроить их в platform - > iOS project с помощью Xcode или в .

поскольку iOS 10 обязательно добавить NSCameraUsageDescription и NSPhotoLibraryUsageDescription в информации.файл plist.

узнать больше: https://www.npmjs.com/package/cordova-plugin-camera


вы можете установить отображаемое имя в plist приложения, непосредственно отредактировав ios.json в каталоге плагинов.

добавление следующего в config_munge.раздел файлы ios.файл json сделает трюк, и он будет поддерживаться даже при использовании CLI.

"*-Info.plist": {

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

здесь пример


@TachyonVortex решение кажется лучшим вариантом, но в моем случае он рушился. Проблема была вызвана пустым полем 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'] = '';

сценарий, наконец, выглядит так (скрипты / 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


Я использую следующее в ионная 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>

если вы пытаетесь изменить .plist в собственном плагине iOS с <config-file> тег в plugin.xml, вот что нужно сделать:

  1. убедитесь, что ваш .plist - это XML, а не двоичный! можно использовать plutil для преобразования двоичного .plist в xml и передайте его в управление версиями.

    plutil -convert xml1 Info.plist

  2. инструкции <config-file> указано, что target= относительно сгенерированного проекта xcode at 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>

Я предпочитаю крючок after_prepare для больших проектов или если у вас есть несколько плагинов с одинаковыми разрешениями. Но вы всегда можете пойти простым путем:

просто: - удалите плагин, который требует желаемого разрешения - снова добавить его-сохранить - в config.xml, плагин теперь имеет новую переменную с пустым описанием, которое вы можете заполнить - Теперь создайте ios с -- release, и они будут установлены.


вам просто нужны следующие шаги 1.

перейдите в проект "навигатор" Выберите цель Нажмите на info from tab option другие опции - это этап сборки настроек сборки вы увидите значение типа ключа Когда вы укажете на любое имя ключа, вы найдете + и-знак нажмите на знак"+" пиши Key: GDLibraryMode в раздел Type:Stringв разделе tyoe Value:GDEnterpriseSimulation в разделе Значение