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

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

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

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

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

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

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

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

Смотрите раздел "элемент 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. Однако есть две проблемы. Документы утверждают:

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

Вот реализация Node.js, использующая пакет NPM plist:

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>

Вы можете использовать утилиту PlistBuddy внутри подключаемого скрипта Cordova, чтобы изменить файл *-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 сообщит об ошибке сборки, если скрипт ловушки завершится со статусом ошибки. Лучшая обработка ошибок возможна, но боль в реализации.

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

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

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

Теперь это представляется возможным с помощью config.xml: по крайней мере, некоторые авторы базовых плагинов говорят об этом. Например, в документах для плагина Cordova Camera они обсуждают новое требование в iOS 10, чтобы вы предоставили строку сообщения о разрешении в списке. Для этого они предлагают выполнить команду добавления плагина с аргументами, таким образом:

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

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

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

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

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

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

"*-Info.plist": {

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

Вот полный пример

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

Я использую 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

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

-Info.plist файл, расположенный по адресу:

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

Решение @TachyonVortex, похоже, является лучшим вариантом, но в моем случае оно рушилось. Проблема была вызвана пустым полем NSMainNibFile, которое неправильно преобразовано пакетом NPM plist. В файле .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>

Я использовал этот плагин для решения проблемы, может быть, он может помочь вам:

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

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

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

Я столкнулся с той же проблемой несколькими днями ранее в моем проекте IONIC 4. когда я загрузил свой IPA, я получил это предупреждение от App Store Connect.

Я попытался исправить эту проблему с помощью файла "Config.xml". но я не нашел для этого подходящего решения.

Я исправил это другим способом. Я поместил значение в "XCODE". он уже ответил на ссылку ниже: Ключ NSPhotoLibraryUsageDescription должен присутствовать в Info.plist для использования камеры

Спасибо.

Вам просто нужно выполнить шаги 1.

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

Другие вопросы по тегам