Добавить запись в iOS.plist файл через Cordova config.XML
Я новичок в Cordova CLI.
Мне нужно выполнить следующие шаги программно через Cordova.
- в проект .plist добавить новую строку
- введите в новую строку следующие значения:
- ключ: GDLibraryMode тип:строка (по умолчанию) стоимостью: 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 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
- удалите и переустановите приложение на своем устройстве, и вы увидите, что ваше приложение появится в 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
, вот что нужно сделать:
убедитесь, что ваш
.plist
- это XML, а не двоичный! можно использоватьplutil
для преобразования двоичного.plist
в xml и зафиксируйте его в системе управления версиями.
plutil -convert xml1 Info.plist
инструкции
<config-file>
указано, чтоtarget=
относительно созданного проекта xcode вplatforms/ios/<project>/
, но я обнаружил, что мне нужно добавить подстановочный знак к моему пути, чтобы заставить его работать:
target="*/Resources/MyResources.bundle/Info.plist"
если вы хотите добавить ключ на верхнем уровне
.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
в разделе tyoeValue:GDEnterpriseSimulation
в разделе Значение