Добавить запись в файл 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 подготовить
- Удалите и переустановите приложение на своем устройстве, и вы увидите, что ваше приложение появилось в 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>
Ответ 10
Я использовал этот плагин для решения проблемы, возможно, он может вам помочь:
https://www.npmjs.com/package/cordova-plugin-queries-schemes
Ответ 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
в разделе значений