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

Я новичок в CLI в Кордове.

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

  • В проекте .plist добавьте новую строку
  • Введите следующие значения в новую строку:
  • Ключ: GDLibraryMode Тип: String (по умолчанию) Значение: GDEnterpriseSimulation

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

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

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

Ответ 1

Я не думаю, что вы можете сделать это с помощью прямой модификации 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>

Ответ 2

Мне действительно нравится @james решение, используя крючок Кордовы. Однако есть два вопроса. Состояние docs:

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

Здесь реализована реализация Node.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' });

};

Из всех типов крюков, предлагаемых Кордовой, для вашей ситуации важны следующие:

  • after_prepare
  • before_compile

Выберите тип крюка, а затем добавьте к нему файл config.xml:

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

Ответ 3

Вы можете использовать утилиту PlistBuddy внутри крюк Кордовы script, чтобы изменить файл * -Info.plist.

Например, у меня есть следующий script под <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

Обязательно создайте исполняемый файл script (chmod +x).

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

Ответ 4

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

1. В вашем приложении перейдите в свой файл config.xml. Введите этот фрагмент в свою конфигурацию под тегом платформы <platform name="ios">.

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

2. Затем перейдите к инструменту командной строки и введите: cordova подготовить

  1. Удалите и переустановите приложение на своем устройстве, и вы увидите, что ваше приложение появилось в itunes для обмена файлами между вашими устройствами.

Несколько вещей, убедитесь, что кордова обновлена, и что вы добавили платформу для ios.

npm install -g cordova

Эта команда устанавливает кордову.

cordova platform add ios

Эта команда добавляет платформу для ios.

Что происходит, когда вы запускаете команду подготовки кордоны, вы используете Apple Xcode SDK, который создается в папке платформы /ios. Там вы можете увидеть файл plist, созданный для вашего приложения, который помечен как "yourApp-info.plist". Там вы можете увидеть новый ключ и строку, созданную в макете xml, которая выглядит так:

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

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

Ответ 5

Теперь это возможно, используя 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> child:

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

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

Ответ 6

ОБНОВЛЕНИЕ: для людей, которые хотят использовать камеру с 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>

Но сейчас вы не можете конфигурировать NSCameraUsageDescription и NSPhotoLibraryUsageDescription в плагине. Вам необходимо настроить их в платформе → iOS-проект с помощью Xcode или в файле *-Info.plist.

Начиная с iOS 10 обязательно добавьте NSCameraUsageDescription и NSPhotoLibraryUsageDescription в списке info.plist.

Учить больше: https://www.npmjs.com/package/cordova-plugin-camera

Ответ 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>

Ответ 8

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

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

"*-Info.plist": {

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

Здесь полный пример

Ответ 9

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

    <key>NSMainNibFile</key>
    <string></string>
    <key>NSMainNibFile~ipad</key>
    <string></string>

преобразуется в:

    <key>NSMainNibFile</key>
    <string>NSMainNibFile~ipad</string>

Я исправил его, добавив в script:

    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

Наконец, script выглядит как (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>

Ответ 11

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

  • Убедитесь, что ваш .plist является xml, а не бинарным!. Вы можете использовать plutil для преобразования двоичного .plist в xml и передать его в управление версиями.

    plutil -convert xml1 Info.plist

  • Инструкции для <config-file> показывают, что target= относится к сгенерированному проекту xcode в platforms/ios/<project>/, но я обнаружил, что мне нужно добавить шаблон подстановки к своему пути, чтобы он работал:

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

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

Ответ 12

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

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

Ответ 13

Да, это возможно!

Я использую Cordova 9.0.0 ([email protected]).

Например, это файл конфигурации, который я использовал для вставки нового строкового значения в 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

Чтобы подтвердить изменение, вы можете проверить вновь созданный файл .plist, открыв его с помощью xCode.

-Info.plist файл находится по адресу:

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

Ответ 14

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

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