Додайте запис до файлу .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.