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


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

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

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

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

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

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

13 75

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

мне очень нравится @james решение С помощью крючка Кордова. Однако есть два вопроса. Элемент docs состояние:

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

вот узел.реализация js с использованием plist 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

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

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

The true В конце скрипта, потому что PlistBuddy возвращает с кодом выхода ошибки, если ключ добавляется уже существует, и не предоставляет способ определить, если ключ уже существует. Cordova сообщит об ошибке сборки, если сценарий hook завершится со статусом ошибки. Лучшая обработка ошибок возможна, но боль для реализации.

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

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

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

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

это, кажется, возможно теперь с помощью конфигурации.xml: по крайней мере, некоторые авторы основных плагинов так говорят. Например, в документах для Cordova Camera Plugin, они обсуждают новое требование в iOS 10, что вы предоставляете строку сообщения разрешения в plist. Для этого они предлагают выполнить команду плагина 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."

это приводит к тому, что вы не только получаете новый <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/>

Я бы солгал, если бы сказал, что точно знаю, как это работает, но это, кажется, указывает путь.

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

С 10 прошивкой это необходимо, чтобы добавить NSCameraUsageDescription и NSPhotoLibraryUsageDescription в информации.файл plist.

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

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

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

"*-Info.plist": {

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

здесь пример

@TachyonVortex решение кажется, самый лучший вариант, но был сбой в моем случае. Проблема была вызвана пустым полем NSMainNibFile, которое неправильно преобразовано пакетом plist NPM. В .файл plist file

    <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 в platforms/ios/<project>/, но я обнаружил, что мне нужно добавить подстановочный знак к моему пути, чтобы заставить его работать:

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

  3. если вы хотите добавить ключ на верхнем уровне .plist, вам нужно установить parent равным имени ключа, а затем вложить a <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.

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