Jestem nowy w Cordova CLI.
Muszę wykonać następujące kroki programowo za pośrednictwem Cordova.
- W projekcie .plist dodaj nowy wiersz
- Wprowadź następujące wartości w nowym wierszu:
- Klucz : GDLibraryMode Typ : String (domyślny) Wartość : GDEnterpriseSimulation
Myślę, że muszę to zrobić w pliku config.xml w katalogu głównym mojego projektu (lub może w folderze „platformy”).
Czy ktoś może mi wyjaśnić, jak dodać wpis poprzez config.xml, aby powyższy wpis był dodawany w czasie kompilacji?
Używam Cordova 3.3.1-0.42 (wiem, że nie jest najnowszy). Zrobiłem już swój projekt i wszystko jest w porządku, wystarczy dodać ten wpis do pList.
ios
cordova
phonegap-plugins
cordova-3
cordova-plugins
Czerwony 2678
źródło
źródło
Odpowiedzi:
Myślę, że nie można tego zrobić za pomocą prostej
config.xml
modyfikacji. Przynajmniej nie widziałem żadnej wzmianki o tym w dokumentach: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.htmlMyślę, że musisz stworzyć wtyczkę, ponieważ mogą wstawiać wpisy plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification
Zobacz sekcję „element pliku konfiguracyjnego”. Oto przypuszczenie, jak
plugin.xml
będzie wyglądać odpowiednia sekcja :<platform name="ios"> <config-file target="*-Info.plist" parent="CFBundleURLTypes"> <array> <dict> <key>GDLibraryMode</key> <string>GDEnterpriseSimulation</string> </dict> </array> </config-file> </platform>
Następnie możesz zainstalować wtyczkę:
cordova plugin add <your plugin name or file location>
źródło
parent
, a częścią wartości powinien być wewnętrzny XML. W tym konkretnym przypadku powinno wyglądać następująco: <config-file target = "* - Info.plist" parent = "GDLibraryMode"> <string> GDEnterpriseSimulation </string> </config-file>config.xml
pośrednictwem<config-file>
elementu - zobacz inne odpowiedzi, aby dowiedzieć się, jak to zrobić.Naprawdę podoba mi się rozwiązanie @ James z użyciem haczyka Cordova. Są jednak dwie kwestie. W docs stwierdzić:
/hooks
katalog jest uważany za przestarzały na korzyść elementów zaczepienia wconfig.xml
"Oto implementacja Node.js przy użyciu pakietu 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' }); };
Ze wszystkich typów haków dostarczanych przez Cordova, odpowiednie dla Twojej sytuacji są:
after_prepare
before_compile
Wybierz typ haka, a następnie dodaj go do swojego
config.xml
pliku:<platform name="ios"> <hook type="after_prepare" src="scripts/my-hook.js" /> </platform>
źródło
plist
Biblioteka węzłów miała pewne problemy z analizowaniem mojego pliku plist, więc nie mogłem użyć tego rozwiązania i poszedłem z Jamesem, który używa pliku wykonywalnego PListBuddy, który jest dołączony do komputerów Mac. To było dobre rozwiązanie, gdyby tylkoplist
biblioteka była bardziej niezawodna. Odwołałem się do mojego skryptu zconfig.xml
pliku, zgodnie z zaleceniami.Możesz użyć narzędzia PlistBuddy wewnątrz skryptu przechwytującego Cordova, aby zmodyfikować plik * -Info.plist.
Na przykład mam następujący skrypt, pod
<project-root>/hooks/after_prepare/010_modify_plist.sh
którym dodaje właściwość słownika i dodaje wpis w tym słowniku:#!/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
Upewnij się, że skrypt jest wykonywalny (
chmod +x
).Na
true
końcu skryptu występuje, ponieważPlistBuddy
zwraca kod zakończenia błędu, jeśli dodawany klucz już istnieje, i nie zapewnia sposobu na wykrycie, czy klucz już istnieje. Cordova zgłosi błąd kompilacji, jeśli skrypt przechwytujący zakończy działanie ze statusem błędu. Lepsza obsługa błędów jest możliwa, ale implementacja jest trudna.źródło
config.xml
Odniosłem się do haka z zalecanego przez TachyonVortex.Remove : NSAppTransportSecurity
tuż przed instrukcją add, a najpierw usunie NSAppTransportSecurity, a następnie doda. To nie powinno niczego zawieść.Oto kroki, które ostatecznie wykonałem, aby umożliwić mojej aplikacji udostępnianie plików za pośrednictwem iTunes między urządzeniami.
W aplikacji przejdź do pliku config.xml. Wpisz ten element do konfiguracji pod tagiem platformy
<platform name="ios">
.<config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled"> <true/> </config-file>
2. Następnie przejdź do narzędzia wiersza poleceń i wpisz: przygotuj cordova
Kilka rzeczy, upewnij się, że Cordova jest aktualna i że dodałeś platformę dla ios.
npm install -g cordova
To polecenie instaluje cordova.
cordova platform add ios
To polecenie dodaje platformę dla ios.
To, co się dzieje, to kiedy uruchamiasz polecenie przygotowania cordova, używasz zestawu Xcode SDK firmy Apple, który jest generowany w folderze platforma / ios. Tam możesz zobaczyć plik plist, który jest generowany dla Twojej aplikacji, oznaczony jako „yourApp-info.plist”. Tam możesz zobaczyć nowy klucz i ciąg utworzony w układzie xml, który wygląda następująco:
<key>UIFileSharingEnabled</key> <true/>
Również słowo ostrzeżenia, moja firma upuściła tę aplikację jonowego frameworka na moje kolana kilka tygodni temu (z naprawdę krótkim terminem). Wszystko, co ci mówię, opiera się na kilku tygodniach nauki. Może to nie jest najlepsza praktyka, ale mam nadzieję, że komuś pomoże.
Edytować
Link do dokumentów
źródło
<config-file>
Element został dodany w Cordova CLI wersji 7, więc z ostatniej wersji Cordova CLI, to zadziała (zobacz tę kwestię na GitHub powtarzalny dowód od autora Cordova-custom-config ).Wydaje się, że jest to teraz możliwe przy użyciu pliku config.xml: przynajmniej niektórzy autorzy wtyczek tak twierdzą. Na przykład w dokumentach dotyczących wtyczki Cordova Camera Plugin omawiają nowy wymóg w systemie iOS 10, który polega na umieszczeniu ciągu komunikatu dotyczącego uprawnień w pliku plist. Aby to osiągnąć, sugerują wykonanie polecenia plugin add z argumentami, w ten sposób:
cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."
Powoduje to, że nie tylko dostajesz nowy
<plugin>
dodatek do config.xml, ale ma on<variable>
potomka:<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>
Co wydaje się być skorelowane z nowymi kluczami w mojej info.plist, być może w jakiś sposób przekazując wartości w czasie wykonywania?
<key>NSCameraUsageDescription</key> <string/> <key>NSPhotoLibraryUsageDescription</key> <string/>
Skłamałbym, gdybym powiedział, że wiem dokładnie, jak to działa, ale wydaje się, że wskazuje drogę.
źródło
<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="whatever" />
<string>Random camera usage text</string>
poniżej klucz,<key>NSCameraUsageDescription</key>
aby moja kompilacja została zaakceptowana. Konfiguracja nie dodaje tekstuAKTUALIZACJA: dla osób, które chcą używać aparatu z iOS> = 10. Oznacza to, że normalnie możesz skonfigurować wtyczkę jako:
<!-- 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>
Ale na razie nie możesz skonfigurować
NSCameraUsageDescription
aniNSPhotoLibraryUsageDescription
wtyczki. Musisz je skonfigurować na platformie -> projekt iOS przez Xcode lub w*-Info.plist
pliku.Dowiedz się więcej: https://www.npmjs.com/package/cordova-plugin-camera
źródło
Używam następujących elementów w ionic 3 bez dodatkowej wtyczki lub importu i myślę, że może to być pomocne dla innych:
<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>
źródło
Możesz ustawić nazwę wyświetlaną w pliku plist aplikacji, bezpośrednio edytując plik ios.json w katalogu wtyczek.
Dodanie następujących elementów do sekcji config_munge.files w pliku ios.json załatwi sprawę i zostanie zachowane nawet podczas korzystania z interfejsu CLI.
"*-Info.plist": { "parents": { "CFBundleDisplayName": [ { "xml": "<string>RevMob Ads Cordova Plugin Demo</string>", "count": 1 } ] } }
Oto pełny przykład
źródło
/plugins/ios.json
zostaną utracone podczas uruchamiania,cordova platform remove ios
a po nimcordova platform add ios
. Po drugie, @ Red2678 poprosił o rozwiązanie polegające na „programowym wykonaniu edycji za pośrednictwem Cordova ... tak, aby nowy wpis został dodany w czasie kompilacji”.Rozwiązanie @TachyonVortex wydaje się być najlepszą opcją, ale w moim przypadku uległo awarii. Problem został spowodowany przez puste pole NSMainNibFile, które nie zostało poprawnie przekonwertowane przez pakiet NPM plist. W pliku .plist
<key>NSMainNibFile</key> <string></string> <key>NSMainNibFile~ipad</key> <string></string>
jest konwertowany na:
<key>NSMainNibFile</key> <string>NSMainNibFile~ipad</string>
Naprawiłem to dodając do skryptu:
obj.NSMainNibFile = ''; obj['NSMainNibFile~ipad'] = '';
Skrypt w końcu wygląda następująco (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' }); };
i config.xml:
<platform name="ios"> <hook type="before_build" src="scripts/my-hook.js" /> </platform>
źródło
patch_plist.js
whooks/after_platform_add
katalogu z tym kodem. Ale nadal<key>NSMainNibFile</key><string>NSMainNibFile~ipad</string>
mam plik plist. Masz jakiś pomysł, jak mogę rozwiązać ten problem?Użyłem tej wtyczki do rozwiązania problemu, może może ci pomóc:
https://www.npmjs.com/package/cordova-plugin-queries-schemes
źródło
Tak to mozliwe!
Używam Cordova 9.0.0 ([email protected]).
Na przykład jest to plik konfiguracyjny, którego użyłem do wstawienia nowej wartości ciągu do 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>
Następnie nie zapomnij odbudować pliku pomostowego, uruchamiając te dwa polecenia w terminalu:
cordova platform rm ios cordova platform add ios
Aby potwierdzić zmianę, możesz sprawdzić nowo wygenerowany plik .plist, otwierając go za pomocą xCode.
-Info.plist znajdujący się pod adresem:
./platform/ios/[your app name]/[your app name]-Info.plist
źródło
edit-config
zakłada, że cel już istnieje na twoim plist. Dla jasności, jeśli chcesz dodać nową parę klucz / ciąg, powinieneś użyćconfig-file
zamiast tego, co dodaje nowe dzieci do drzewa xmlJeśli próbujesz zmodyfikować a
.plist
w natywnej wtyczce iOS z<config-file>
tagiem w swoimplugin.xml
, oto co musisz zrobić:Upewnij się, że Twój
.plist
plik jest XML, a nie binarny! Możesz użyć,plutil
aby przekonwertować plik binarny.plist
na XML i zatwierdzić go do kontroli wersji.plutil -convert xml1 Info.plist
Instrukcje dotyczące
<config-file>
wskazują, żetarget=
jest to relatywne do wygenerowanego projektu xcode pod adresemplatforms/ios/<project>/
, ale stwierdziłem, że muszę dołączyć znak wieloznaczny do mojej ścieżki, aby działał:target="*/Resources/MyResources.bundle/Info.plist"
Jeśli chcesz dodać klucz na najwyższym poziomie
.plist
, musisz ustawić rodzica równy nazwie klucza, a następnie zagnieździć<string>
tag z wartością. Użycie<array>
lub,<dict>
jak pokazują przykłady, spowoduje zagnieżdżenie tych kluczy wparent
.Oto kompletny przykład, który sprawdza się w przypadku dodawania wielu właściwości najwyższego poziomu:
<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>
źródło
Wolę hook after_prepare dla większych projektów lub jeśli masz wiele wtyczek korzystających z tych samych uprawnień. Ale zawsze możesz iść prostą drogą:
po prostu: - usuń wtyczkę, która wymaga żądanych uprawnień - dodaj ją ponownie za pomocą --save - w config.xml, wtyczka ma teraz nową zmienną z pustym opisem, który możesz wypełnić - teraz buduj ios za pomocą - release i zostaną ustawione.
źródło
potrzebujesz tylko następujących kroków 1.
źródło