Fügen Sie über die Datei Cordova config.xml einen Eintrag zur iOS .plist-Datei hinzu


79

Ich bin neu in der Cordova CLI.

Ich muss die folgenden Schritte programmgesteuert über Cordova ausführen.

  1. Fügen Sie in der Projektliste eine neue Zeile hinzu
  2. Geben Sie die folgenden Werte in die neue Zeile ein:
  3. Schlüssel : GDLibraryMode Typ : String (Standard) Wert : GDEnterpriseSimulation

Ich denke, ich muss dies in der Datei config.xml im Stammverzeichnis meines Projekts tun (oder vielleicht in der Datei im Ordner "Plattformen").

Kann mir jemand erklären, wie man den Eintrag über die Datei config.xml hinzufügt, damit der obige Eintrag zur Kompilierungszeit hinzugefügt wird?

Ich verwende Cordova 3.3.1-0.42 (ich weiß, dass es nicht das neueste ist). Ich habe mein Projekt bereits erstellt und alles ist in Ordnung. Ich muss nur diesen Eintrag zur pList hinzufügen.


4
Für alle, die zu spät kommen, wird das Festlegen von Werten in der Projektliste jetzt von Cordova CLI 7 und höher unterstützt .
entscheidet

Antworten:


66

Ich glaube nicht, dass Sie dies durch direkte config.xmlModifikation tun können . Zumindest habe ich dies in den Dokumenten nicht erwähnt: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html

Ich denke, Sie müssen ein Plugin erstellen, da sie Plist-Einträge einfügen können: http://docs.phonegap.com/de/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

Siehe den Abschnitt 'Konfigurationsdateielement'. Hier ist eine Vermutung, wie der relevante Abschnitt des plugin.xmlaussehen wird:

<platform name="ios">
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
    <dict>
        <key>GDLibraryMode</key>
        <string>GDEnterpriseSimulation</string>
    </dict>
</array>
</config-file>
</platform>

Dann können Sie das Plugin installieren: cordova plugin add <your plugin name or file location>


1
@mooreds Entschuldigung, ich habe Ihre Antwort falsch verstanden ... Ich dachte, Ihre Lösung verwendet gap: config-file . Nachdem ich Ihren Ansatz verstanden habe (Erstellen eines speziellen Plugins für bestimmte Plist-Modifikationen), werde ich es versuchen. Vielen Dank!
Fafaman

6
@mooreds, die Cordova / PhoneGap-Dokumentation ist irreführend. Ich fand heraus, dass der Schlüssel in angegeben werden sollte parent, während der Wertteil das innere XML sein sollte. In diesem speziellen Fall sollte es wie folgt aussehen: <config-file target = "* - Info.plist" parent = "GDLibraryMode"> <string> GDEnterpriseSimulation </ string> </ config-file>
Herman Kan


1
Danke @rjhilgefort, viel einfacher! :)
Josebailo

2
Ab Cordova CLI 7+ kann dies als Referenz config.xmlüber das <config-file>Element erfolgen. Weitere Informationen hierzu finden Sie in den anderen Antworten.
entscheidet

43

Ich mag die Lösung von @ james mit einem Cordova-Haken sehr. Es gibt jedoch zwei Probleme. In den Dokumenten heißt es :

  • "Wir empfehlen dringend, Ihre Hooks mit Node.js zu schreiben. "
  • " /hooksVerzeichnis gilt als veraltet zugunsten der Hook-Elemente in config.xml"

Hier ist eine Node.js-Implementierung mit dem plist NPM-Paket:

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' });

};

Von allen von Cordova angebotenen Hakentypen sind die für Ihre Situation relevanten:

  • after_prepare
  • before_compile

Wählen Sie einen Hook-Typ und fügen Sie den Hook Ihrer config.xmlDatei hinzu:

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

Die Knotenbibliothek plisthatte einige Probleme beim Parsen meiner plist-Datei, daher konnte ich diese Lösung nicht verwenden und entschied mich für James ', der die ausführbare PListBuddy-Datei verwendet, die auf Macs enthalten ist. Dies war eine gute Lösung, wenn nur die plistBibliothek zuverlässiger wäre. Ich habe mein Skript aus der config.xmlDatei referenziert, wie Sie es empfohlen haben.
stephen.hanson

Nett! Keine Notwendigkeit, zusätzliche Plugins zu verwenden und funktioniert wie ein Zauber! Alle anderen Lösungen scheinen für ein so einfaches Problem veraltet oder zu kompliziert zu sein.
Arno van Oordt

Das plist npm-Modul ist schwer defekt. Es wird eine ungültige .plist-Datei erzeugt, wenn die Quelldatei leere Werte enthält. Verwenden Sie stattdessen simple-plist.
Cleong

Ich hatte große Probleme beim Hinzufügen eines lokalen Plugins mit Cordova @ 8, diese Lösung funktioniert in meinem Fall viel besser und ist einfacher
Jean-Baptiste Martin

32

Sie können das PlistBuddy- Dienstprogramm in einem Cordova-Hook- Skript verwenden, um die Datei * -Info.plist zu ändern.

Zum Beispiel habe ich das folgende Skript, unter <project-root>/hooks/after_prepare/010_modify_plist.shdem eine Wörterbuch-Eigenschaft und ein Eintrag in diesem Wörterbuch hinzugefügt werden:

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

Stellen Sie sicher, dass das Skript ausführbar ist ( chmod +x).

Das trueam Ende des Skripts ist, weil PlistBuddymit einem Fehler-Exit-Code zurückgegeben wird, wenn der hinzugefügte Schlüssel bereits vorhanden ist, und keine Möglichkeit bietet, zu erkennen, ob der Schlüssel bereits vorhanden ist. Cordova meldet einen Build-Fehler, wenn das Hook-Skript mit einem Fehlerstatus beendet wird. Eine bessere Fehlerbehandlung ist möglich, aber schwierig umzusetzen.


Es klappt! Ich habe sowohl Ihre als auch die Lösungen von TachyonVortex ausprobiert. Die von der TachyonVortex-Lösung verwendete node.js-Bibliothek hat meine PList-Datei nicht korrekt analysiert, während dies bei dem in Ihrer Antwort verwendeten PListBuddy mit Mac der Fall war. Ich habe den Hook von config.xmlTachyonVortex empfohlen.
stephen.hanson

1
Wenn Sie die plist IMMER jedes Mal aktualisieren möchten, auch wenn der Schlüssel bereits vorhanden ist, fügen Sie ihn Remove : NSAppTransportSecurity kurz vor der add-Anweisung hinzu, und die NSAppTransportSecurity wird zuerst gelöscht und dann hinzugefügt. Dies sollte nichts zum Absturz bringen.
Samuel Thompson

22

Dies sind die Schritte, die ich letztendlich ausgeführt habe, damit meine Anwendung Dateien über iTunes zwischen Geräten freigeben kann.

1. Navigieren Sie in Ihrer Anwendung zu Ihrer config.xml. Geben Sie dieses Teil in Ihre Konfiguration unter dem Plattform-Tag ein <platform name="ios">.

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

2. Gehen Sie dann zu Ihrem Befehlszeilenprogramm und geben Sie Folgendes ein: cordova prepare

  1. Deinstallieren Sie Ihre Anwendung und installieren Sie sie erneut auf Ihrem Gerät. Ihre App wird in iTunes angezeigt, damit Sie alle Dateien zwischen Ihren Geräten freigeben können.

Stellen Sie sicher, dass Cordova auf dem neuesten Stand ist und dass Sie die Plattform für ios hinzugefügt haben.

npm install -g cordova

Dieser Befehl installiert Cordova.

cordova platform add ios

Dieser Befehl fügt die Plattform für ios hinzu.

Wenn Sie den Befehl cordova prepare ausführen, verwenden Sie das Xcode SDK von Apple, das im Ordner platform / ios generiert wird. Dort sehen Sie die für Ihre Anwendung generierte plist-Datei, die als "yourApp-info.plist" gekennzeichnet ist. Dort sehen Sie den neuen Schlüssel und die neue Zeichenfolge, die im XML-Layout erstellt wurden und folgendermaßen aussehen:

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

Als Warnung warnte mein Unternehmen vor ein paar Wochen (mit einer wirklich kurzen Frist) diese Anwendung für ionische Gerüste auf meinem Schoß. Alles, was ich Ihnen erzähle, basiert auf ein paar Wochen Lernen. Das ist vielleicht nicht die beste Vorgehensweise, aber ich hoffe, es hilft jemandem.

Bearbeiten

Link zu den Dokumenten


4
Ist noch etwas erforderlich, damit dies funktioniert? Ich verwende Cordova 6.2 (neueste Produktion) und obwohl ich den Eintrag in die config.xml eingefügt habe, sehe ich ihn nicht in der Liste. Ist es möglich, dass Sie das Cordova Custom Config-Plugin ( github.com/dpa99c/cordova-custom-config ) haben?
Tomer Cagan

1
Klappt wunderbar. Vielen Dank.
Logus

Das <config-file>Element wurde in Cordova CLI Version 7 hinzugefügt. Mit einer neueren Version der Cordova CLI funktioniert dies ( ein reproduzierbarer Beweis des Autors von cordova-custom-config finden Sie in dieser Github-Ausgabe ).
entscheidet

Das hat bei mir funktioniert! Die Angabe der Plattform als Attribut auf dem Tag erscheint jedoch überflüssig, insbesondere da sie bereits unter der iOS-Plattform platziert ist. Bei mir hat es ohne das geklappt.
Eric F.

14

Dies scheint jetzt mit der Datei config.xml möglich zu sein: Zumindest einige Autoren von Kern-Plugins sagen dies. In den Dokumenten für das Cordova Camera Plugin wird beispielsweise die neue Anforderung in iOS 10 erläutert , dass Sie eine Berechtigungsnachrichtenzeichenfolge in der Liste angeben. Um dies zu erreichen, schlagen sie vor, den Plugin-Befehl add mit Argumenten auszuführen, also:

cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."

Dies hat zur Folge, dass Sie nicht nur eine neue <plugin>Datei zu config.xml hinzugefügt bekommen, sondern auch ein untergeordnetes Element <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>

Was scheint dann mit den neuen Schlüsseln in meiner info.plist zu korrelieren, vielleicht die Werte zur Laufzeit irgendwie zu übergeben?

  <key>NSCameraUsageDescription</key>
  <string/>
  <key>NSPhotoLibraryUsageDescription</key>
  <string/>

Ich würde lügen, wenn ich sagen würde, dass ich genau weiß, wie es funktioniert, aber es scheint den Weg zu weisen.


CAMERA_USAGE_DESCRIPTION wird an NSCameraUsageDescription übergeben. Wenn Sie einen Wert für NSPhotoLibraryUsageDescription hinzufügen möchten, müssen Sie auch hinzufügen<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="whatever" />
Nico Westerdale

1
Wenn Sie den PhoneGap Build-Dienst verwenden, ist dies die empfohlene Methode zum
Nico Westerdale,

Ich musste <string>Random camera usage text</string>unter dem Schlüssel ein hinzufügen, <key>NSCameraUsageDescription</key>damit mein Build akzeptiert wurde. Die Konfiguration fügt den Text nicht hinzu
Slartibartfast

9

UPDATE: für Benutzer, die eine Kamera mit iOS> = 10 verwenden möchten. Dies bedeutet, dass Sie das Plugin normalerweise wie folgt konfigurieren können:

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

Aber im Moment können Sie nicht konfigurieren NSCameraUsageDescriptionund NSPhotoLibraryUsageDescriptionPlugin. Sie müssen sie in Plattform -> iOS-Projekt per Xcode oder in *-Info.plistDatei konfigurieren .

Seit iOS 10 müssen in der info.plist eine NSCameraUsageDescription und eine NSPhotoLibraryUsageDescription hinzugefügt werden.

Weitere Informationen: https://www.npmjs.com/package/cordova-plugin-camera


8

Ich benutze das Folgende in der ionischen 3 ohne zusätzliches Plugin oder Importe und denke, dass dies für andere hilfreich sein könnte:

<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

Sie können den Anzeigenamen in der App-Liste festlegen, indem Sie die Datei ios.json direkt im Plugins-Verzeichnis bearbeiten.

Das Hinzufügen des Folgenden zum Abschnitt config_munge.files der Datei ios.json reicht aus und wird auch bei Verwendung der CLI beibehalten.

"*-Info.plist": {

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

Hier ist ein vollständiges Beispiel


1
Beachten Sie, dass dies beim Ausführen von Visual Sutdio Tools für Cordova nicht funktioniert, da ios.json von den Tools überschrieben wird.
Herman Kan

2
Bei dieser Antwort gibt es zwei Probleme. Erstens gehen alle manuellen Änderungen /plugins/ios.jsonbeim Ausführen verloren, cordova platform remove iosgefolgt von cordova platform add ios. Zweitens bat @ Red2678 um eine Lösung, um "die Bearbeitung programmgesteuert über Cordova durchzuführen ... damit der neue Eintrag zur Kompilierungszeit hinzugefügt wird".
TachyonVortex

3

Die @ TachyonVortex- Lösung scheint die beste Option zu sein, stürzte jedoch in meinem Fall ab. Das Problem wurde durch ein leeres NSMainNibFile-Feld verursacht, das vom plist NPM-Paket nicht richtig konvertiert wurde. In der .plist- Datei

    <key>NSMainNibFile</key>
    <string></string>
    <key>NSMainNibFile~ipad</key>
    <string></string>

wird konvertiert zu:

    <key>NSMainNibFile</key>
    <string>NSMainNibFile~ipad</string>

Ich habe es behoben, indem ich dem Skript hinzugefügt habe:

    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

Das Skript sieht schließlich so aus (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' });

};

und config.xml:

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

Ich habe ein patch_plist.jsin das hooks/after_platform_addVerzeichnis mit diesem Code geschrieben. Aber ich komme immer noch <key>NSMainNibFile</key><string>NSMainNibFile~ipad</string>in meine Plist-Datei. Haben Sie eine Idee, wie ich dieses Problem lösen könnte?
Romain R.


2

Ja, es ist möglich!

Ich verwende Cordova 9.0.0 (cordova-lib@9.0.1).

Zum Beispiel ist dies die Konfigurationsdatei, mit der ich einen neuen Zeichenfolgenwert in Info.plist eingefügt habe:

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

Vergessen Sie danach nicht, Ihre Staging-Datei neu zu erstellen, indem Sie diese beiden Befehle in Ihrem Terminal ausführen:

cordova platform rm ios
cordova platform add ios

Um die Änderung zu bestätigen, können Sie die neu generierte .plist-Datei überprüfen, indem Sie sie mit xCode öffnen.

-Info.plist Datei befindet sich unter:

./platform/ios/[your app name]/[your app name]-Info.plist

edit-configsetzt voraus, dass das Ziel bereits in Ihrer Liste vorhanden ist. Um ganz klar zu sein, wenn Sie ein neues Schlüssel / String-Paar hinzufügen möchten, sollten Sie config-filestattdessen verwenden, das dem XML-Baum neue Kinder hinzufügt
Daniel Lizik

0

Wenn Sie versuchen, ein .plistin einem nativen iOS-Plugin mit einem <config-file>Tag in Ihrem zu ändern plugin.xml, müssen Sie Folgendes tun:

  1. Stellen Sie sicher, dass Sie .plistXML ist, nicht binär! Sie können plutileine Binärdatei .plistin XML konvertieren und sie der Versionskontrolle übergeben.

    plutil -convert xml1 Info.plist

  2. Die Anweisungen für <config-file>geben an, dass dies target=relativ zum generierten xcode-Projekt bei ist platforms/ios/<project>/, aber ich stellte fest, dass ich meinem Pfad ein Platzhalterzeichen voranstellen musste, damit es funktioniert:

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

  3. Wenn Sie einen Schlüssel auf der obersten Ebene von hinzufügen möchten .plist, müssen Sie das übergeordnete Element gleich dem Schlüsselnamen setzen und dann ein <string>Tag mit dem Wert verschachteln . Mit Hilfe eines <array>oder <dict>als beliebige Beispiele dieser Schlüssel verursachen Beobachtungen zeigen ineinander verschachtelte sein unter parent .

Hier ist ein vollständiges Beispiel, das für mich zum Hinzufügen mehrerer Eigenschaften der obersten Ebene funktioniert:

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

Das hat bei mir nicht funktioniert. Ich habe versucht hinzuzufügen, was Sie oben haben, und nichts hat sich in meiner Liste geändert
Samuel Thompson

Versuchen Sie, die Ursache einzugrenzen, indem Sie die Liste zuerst im Stammverzeichnis ablegen. Leider schlägt diese Funktion, soweit ich das beurteilen kann, lautlos fehl.
Sky Kelsey

0

Ich bevorzuge den after_prepare-Hook für größere Projekte oder wenn Sie mehrere Plugins mit denselben Berechtigungen haben. Aber Sie können immer den einfachen Weg gehen:

Einfach: - Entfernen Sie das Plugin, für das die gewünschte Berechtigung erforderlich ist. - Fügen Sie es erneut mit --save - in config.xml hinzu. Das Plugin verfügt nun über eine neue Variable mit einer leeren Beschreibung, die Sie ausfüllen können. Erstellen Sie jetzt ios mit - release und sie werden gesetzt.


0

Ich hatte einige Tage zuvor das gleiche Problem mit meinem IONIC 4-Projekt. Als ich meine IPA hochgeladen habe, habe ich diese Warnungen von App Store Connect erhalten.

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht, dieses Problem in der Datei "Config.xml" zu beheben. aber ich habe keine richtige Lösung dafür gefunden.

Ich habe das anders behoben. Ich habe den Wert in "XCODE" gesetzt. Der folgende Link wurde bereits beantwortet: Der NSPhotoLibraryUsageDescription-Schlüssel muss in der Info.plist vorhanden sein, um die Kamerarolle verwenden zu können

Vielen Dank.


-4

Sie müssen nur die folgenden Schritte 1 ausführen.

Project Sehen Sie sich das Ziel Klicken Sie auf Informationen aus dem Reiter Option andere Option sind Phase Build Einstellung Build - Navigator werden Sie Schlüsselart Wert sehen Wenn Sie auf eine beliebige Taste Name Punkt werden Sie + und finden - Zeichen Klick auf das + Schreib Key: GDLibraryModein Schlüsselabschnitt Type:Stringin tyoe Abschnitt Value:GDEnterpriseSimulationim Wertabschnitt


1
Ich möchte dies unbedingt tun, aber wenn ich die Cordova-App über die CLI kompiliere, wird der Ordner des Projekts im Grunde genommen gelöscht und neu erstellt. Ich würde dann jedes Mal, wenn ich kompiliere, die oben genannten Schritte ausführen müssen (nicht so schwer), aber ich hatte gehofft, nur Cordovas config.xml zu verwenden, um dies für mich zu tun.
Red2678

Kannst du mir bitte sagen, warum es erforderlich ist, die App über xcode zu kompilieren? Dann funktioniert diese Lösung für dich
Nitin

2
Hallo @Nitin, nun, es ist weniger eine "Anforderung" als vielmehr die Standardmethode für die Verwendung der Cordova CLI. Wenn ich den "Befehl Cordova build" verwende, wird der Projektordner jedes Mal gelöscht und neu erstellt, wenn Sie diesen Befehl ausführen.
Red2678
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.