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


80

Я новачок у CLO в Кордові.

Мені потрібно виконати наступні кроки програмно через Кордову.

  1. У проект .plist додайте новий рядок
  2. У новому рядку введіть такі значення:
  3. Ключ : GDLibraryMode Тип : Рядок (за замовчуванням) Значення : GDEnterpriseSimulation

Я думаю, що мені потрібно це зробити у файлі config.xml у корені мого проекту (або, можливо, у папці "платформи").

Хтось може пояснити мені, як додати запис через config.xml, щоб вищевказаний запис був доданий під час компіляції?

Я використовую Кордову 3.3.1-0.42 (я знаю, що це не остання версія). Я вже створив свій проект, і все добре, мені просто потрібно додати цей запис, доданий до pList.


4
Для тих, хто запізнився на це, встановлення значень у списку проектів тепер підтримується Cordova CLI 7 і вище .
розпадається

Відповіді:


67

Я не думаю, що ви можете зробити це за допомогою прямої config.xmlмодифікації. Принаймні, я не побачив жодної згадки про це в документах: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html

Я думаю, вам доведеться створити плагін, оскільки вони можуть вставляти записи у список: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Див. Розділ "Елемент конфігураційного файлу". Ось здогадка щодо того, як 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>


1
@mooreds вибачте, я неправильно зрозумів твою відповідь ... Я думав, твоє рішення використовує gap: config-file . Тепер я зрозумів ваш підхід (створення спеціального плагіна для певних модифікацій plist), спробую. Дякую!
Фафаман

6
@mooreds, документація Cordova / PhoneGap вводить в оману. Я з'ясував, що ключ повинен бути вказаний у parent, тоді як частина значення повинна бути внутрішнім XML. У цьому конкретному випадку воно має бути таким: <config-file target = "* - Info.plist" parent = "GDLibraryMode"> <string> GDEnterpriseSimulation </string> </config-file>
Герман Кан

4
Цей плагін чудово працює github.com/leecrossley/cordova-plugin-transport-security
rjhilgefort

1
Дякую @rjhilgefort, набагато простіше! :)
josebailo

2
Для довідки, що стосується Cordova CLI 7+, це можна зробити в елементі config.xmlvia <config-file>- див. Інші відповіді для отримання детальної інформації про те, як це зробити.
занепадає

43

Мені дуже подобається @ - Джеймса рішення з допомогою гачка Кордови. Однак є два питання. У документах зазначено:

  • "ми настійно рекомендуємо писати ваші хуки за допомогою 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' });

};

З усіх типів гачків, що надаються Кордовою, для вашої ситуації відповідають такі:

  • after_prepare
  • before_compile

Виберіть тип хука, а потім додайте хук у свій config.xmlфайл:

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

Бібліотека вузлів plistмала деякі проблеми з синтаксичним розбором мого файлу plist, тому я не зміг скористатися цим рішенням і пішов із Джеймсом, який використовує виконуваний файл PListBuddy, що входить до складу Mac. Це було хорошим рішенням, якби тільки plistбібліотека була надійнішою. Я зробив посилання на свій сценарій із config.xmlфайлу, як ви рекомендували.
stephen.hanson

Приємно! Не потрібно використовувати будь-які додаткові плагіни і працює як шарм! Усі інші рішення здаються застарілими або складними для такого простого питання.
Арно ван Оордт

Модуль plist npm серйозно пошкоджений. Він створить недійсний файл .plist, коли вихідний файл містить порожні значення. Замість цього використовуйте simple-plist.
Клеонг

У мене було багато проблем з додаванням локального плагіна з cordova @ 8, це рішення працює набагато краще в моєму випадку і простіше
Жан-Батіст Мартін

32

Ви можете скористатися утилітою 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 повідомить про помилку побудови, якщо скрипт хука вийде зі статусом помилки. Можна покращити обробку помилок, але це складно реалізувати.


Це працює! Я спробував і ваші рішення, і рішення TachyonVortex. Бібліотека node.js, яку використовує рішення TachyonVortex, неправильно проаналізувала мій файл PList, тоді як включений у Mac PListBuddy, використаний у вашій відповіді, зробив це. config.xmlХоча я посилався на гачок, як рекомендував TachyonVortex.
stephen.hanson

1
Якщо ви ЗАВЖДИ бажаєте ЗАВЖДИ оновлювати plist кожного разу, навіть якщо ключ уже існує, додайте Remove : NSAppTransportSecurity безпосередньо перед оператором add, і він спочатку видалить NSAppTransportSecurity, а потім додасть його. Це нічого не повинно розбивати.
Семюель Томпсон,

22

Це кроки, які я в підсумку зробив, щоб дозволити своїй програмі обмінюватися файлами через iTunes між пристроями.

1. У програмі перейдіть до файлу config.xml. Введіть цей фрагмент у свій конфігуратор під тегом платформи <platform name="ios">.

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

2. Потім перейдіть до інструменту командного рядка та введіть: cordova priprema

  1. Видаліть та переінсталюйте свою програму на своєму пристрої, і ви побачите, що ваша програма відображається в iTunes, щоб ви могли ділитися будь-якими файлами між своїми пристроями.

Кілька речей, переконайтесь, що Кордова оновлена, і що ви додали платформу для iOS.

npm install -g cordova

Ця команда встановлює cordova.

cordova platform add ios

Ця команда додає платформу для ios.

Що відбувається, коли ви запускаєте команду cordova priprema, ви використовуєте Apple Xcode SDK, який генерується в папці платформа / ios. Там ви можете побачити файл plist, створений для вашої програми, який позначений як "yourApp-info.plist". Там ви можете побачити новий ключ і рядок, створені в макеті xml, який виглядає так:

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

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

Редагувати

Посилання на документи


4
Чи потрібно ще щось, щоб це працювало? Я використовую Cordova 6.2 (останнє виробництво), і хоча я додав запис у config.xml, я не бачу його в списку. Чи можливо, що у вас є плагін Cordova Custom Config ( github.com/dpa99c/cordova-custom-config )?
Томер Каган

1
Працює як шарм. Дякую.
Логус,

<config-file>Елемент був доданий в Кордові CLI версії 7, так що з останньою версією Кордови CLI, це працює (див цього питання GitHub для відтвореного докази від автора Cordova-настроюється-конфігурації ).
занепадає

Це спрацювало для мене! Однак вказівка ​​платформи як атрибута на тезі видається зайвою, тим більше, що вона вже розміщена під платформою iOS. Це працювало без цього на моєму.
Ерік Ф.

14

Здається, це можливо вже зараз, використовуючи config.xml: принаймні так стверджують деякі автори основних плагінів. Наприклад, у документах до плагіна Cordova Camera вони обговорюють нову вимогу в iOS 10 про те, що ви надаєте рядок повідомлення про дозвіл у списку. Для цього вони пропонують виконати команду add plugin з аргументами, таким чином:

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

Я б брехав, якби сказав, що точно знаю, як це працює, але, схоже, це вказує шлях.


CAMERA_USAGE_DESCRIPTION передається в NSCameraUsageDescription. Якщо ви хочете додати значення для NSPhotoLibraryUsageDescription, вам потрібно також додати<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="whatever" />
Ніко Вестердейл

1
Якщо ви використовуєте службу PhoneGap Build, це рекомендований спосіб встановити ці значення
Ніко Вестердейл

Мені довелося додати <string>Random camera usage text</string>нижче ключ, <key>NSCameraUsageDescription</key>щоб моя збірка була прийнята. Конфігурація не додає тексту
Slartibartfast

9

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


8

Я використовую наступне в 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>

4

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

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

"*-Info.plist": {

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

Ось повний приклад


1
Пам'ятайте, що це не працює під час запуску з Visual Sutdio Tools для Cordova, оскільки ios.json перезаписується інструментами.
Герман Кан

2
З цією відповіддю є два питання. По-перше, будь-яке редагування вручну/plugins/ios.json буде втрачено під час запуску, cordova platform remove iosа потім - cordova platform add ios. По-друге, @ Red2678 попросив рішення "виконати редагування програмно через Кордову ... так, щоб новий запис був доданий під час компіляції".
TachyonVortex

3

Рішення @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>

Я написав a patch_plist.jsв hooks/after_platform_addкаталозі з цим кодом. Але я все ще потрапляю <key>NSMainNibFile</key><string>NSMainNibFile~ipad</string>у свій файл plist. Будь-яке уявлення про те, як я можу вирішити цю проблему, будь ласка?
Ромен Р.


2

Так, це можливо!

Я використовую 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

edit-configпередбачає, що ціль вже існує у вашому plist. Щоб було зрозуміло, якщо ви хочете додати нову пару ключ / рядок, config-fileзамість цього слід використовувати , що додає нових дітей до дерева xml
Даніель Лізік,

1

Якщо ви намагаєтеся змінити .plistвласний плагін iOS із <config-file>тегом у вашому plugin.xml, ось що вам потрібно зробити:

  1. Переконайтеся, що ваш .plistXML, а не двійковий! Ви можете використати plutilдля перетворення двійкового .plistфайлу у xml та передачі його до контролю версій.

    plutil -convert xml1 Info.plist

  2. Інструкції для <config-file>вказують, що target=це відносно створеного проекту xcode в platforms/ios/<project>/, але я виявив, що мені потрібно додати підстановний символ до мого шляху, щоб він працював:

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

  3. Якщо ви хочете додати ключ на верхньому рівні .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>

у мене це не спрацювало. Я спробував додати те, що у вас є вище, і в моєму списку нічого не змінилося
Семюель Томпсон,

Спробуйте звузити причину, помістивши спочатку plist у кореневий каталог? На жаль, ця функція відмовляється безшумно, наскільки я можу зрозуміти.
Sky Kelsey

0

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

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


-4

вам просто потрібно виконати кроки 1.

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


1
Я дуже хочу це зробити, але коли я компілюю програму Cordova з CLI, папка проекту в основному видаляється і переробляється. Тоді мені доведеться робити вищезазначене кожен раз, коли я компілюю (не так, як це важко), але я сподівався просто використовувати config.xml Cordova, щоб зробити це за мене.
Red2678

чи не можете ви сказати мені, чому це вимагає компіляції, коли ви запускаєте програму через xcode, тоді це рішення працює для вас
Нітін,

2
Привіт @ Нітін, ну це не стільки "вимога", скільки стандартний спосіб використання Cordova CLI. Якщо я використовую "команду Cordova build", папка проекту видаляється і створюється заново при кожному запуску цієї команди.
Red2678,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.