Добавить запись в iOS .plist файл через Cordova config.xml
Я новичок в Cordova CLI.
Мне нужно выполнить следующие шаги программно через Cordova.
- В проект.plist добавить новую строку
- Введите следующие значения в новую строку:
- Ключ: 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
- Удалите и переустановите ваше приложение на вашем устройстве, и вы увидите, что ваше приложение появится в 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
Вот что вам нужно сделать:
Убедитесь, что ваш
.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 равным имени ключа, а затем вложить<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
в разделе значения