plugin - Agregar entrada al archivo.plist de iOS a través de Cordova config.xml
install cordova mac (13)
Soy nuevo en el CLI de Cordova.
Necesito realizar los siguientes pasos programáticamente a través de Córdoba.
- En el proyecto .plist agrega una nueva fila
- Ingrese los siguientes valores en la nueva fila:
- Clave : GDLibraryMode Tipo : String (predeterminado) Valor : GDEnterpriseSimulation
Creo que necesito hacer esto en el archivo config.xml en la raíz de mi proyecto (o tal vez en la carpeta "plataformas").
¿Puede alguien explicarme cómo agregar la entrada a través de config.xml para que la entrada anterior se agregue en tiempo de compilación?
Estoy usando Cordova 3.3.1-0.42 (sé que no es el último). Ya he hecho mi proyecto y todo está bien, solo necesito agregar esta entrada agregada a la pList.
ACTUALIZACIÓN: para las personas que quieran utilizar la cámara con iOS> = 10. Esto significa que, por normal, puede configurar en el complemento como:
<!-- 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>
Pero por ahora, no puede configurar NSCameraUsageDescription
y NSPhotoLibraryUsageDescription
en el complemento. *-Info.plist
configurarlos en la plataforma -> proyecto iOS por Xcode o en el archivo *-Info.plist
.
Desde iOS 10, es obligatorio agregar una descripción de NSCameraUsageDescription y NSPhotoLibraryUsageDescription en info.plist.
Obtenga más información: https://www.npmjs.com/package/cordova-plugin-camera
Esto parece ser posible ahora usando config.xml: al menos algunos autores de plugins principales lo dicen. Por ejemplo, en los documentos del Complemento de cámara de Cordova , se analiza el nuevo requisito en iOS 10 de que se proporciona una cadena de mensaje de permiso en el plist. Para lograrlo, sugieren ejecutar el complemento agregar comando con argumentos, por lo tanto:
cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."
Esto tiene el resultado de que no solo se agrega un nuevo <plugin>
a config.xml, sino que tiene un elemento secundario <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>
Que luego parece correlacionarse con las nuevas claves en mi info.plist, ¿tal vez de alguna manera pasar los valores en tiempo de ejecución?
<key>NSCameraUsageDescription</key>
<string/>
<key>NSPhotoLibraryUsageDescription</key>
<string/>
Mentiría si dijera que sé exactamente cómo funciona, pero parece indicar el camino.
Estos son los pasos que terminé haciendo para permitir que mi aplicación comparta archivos a través de iTunes entre dispositivos.
1.En su aplicación vaya a su config.xml. Escriba esta pieza en su configuración bajo la etiqueta de la plataforma <platform name="ios">
.
<config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
<true/>
</config-file>
2. Luego ve a tu línea de comando y escribe: cordova prepare
- Desinstale y vuelva a instalar su aplicación en su dispositivo, y verá que su aplicación aparece en iTunes para que pueda compartir los archivos entre sus dispositivos.
Algunas cosas, asegúrese de que cordova esté actualizado y de que haya agregado la plataforma para iOS.
npm install -g cordova
Este comando instala cordova.
cordova platform add ios
Este comando agrega la plataforma para ios.
Lo que está sucediendo es que cuando ejecutas el comando cordova prepare estás usando el Xcode SDK de Apple que se genera en la carpeta plataforma / ios. Allí puede ver el archivo plist que se genera para su aplicación, que está etiquetado como "yourApp-info.plist". Allí puede ver la nueva clave y cadena producida en el diseño xml que se ve así:
<key>UIFileSharingEnabled</key>
<true/>
También como advertencia, mi compañía dejó caer esta aplicación de marco iónico en mi regazo hace un par de semanas (con un plazo realmente corto). Todo lo que te digo se basa en un par de semanas de aprendizaje. Así que esta puede no ser la mejor práctica, pero espero que ayude a alguien.
Estoy utilizando lo siguiente en el ionic 3 sin ningún complemento o importación adicionales y creo que esto podría ser útil para otros:
<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>
He usado este complemento para resolver el problema, tal vez pueda ayudarte:
https://www.npmjs.com/package/cordova-plugin-queries-schemes
La solution @TachyonVortex parece ser la mejor opción, pero se derrumbó en mi caso. El problema fue causado por un campo NSMainNibFile vacío que el paquete plist NPM no convirtió correctamente. En el archivo .plist
<key>NSMainNibFile</key>
<string></string>
<key>NSMainNibFile~ipad</key>
<string></string>
se convierte a:
<key>NSMainNibFile</key>
<string>NSMainNibFile~ipad</string>
Lo arreglé añadiendo al guión:
obj.NSMainNibFile = '''';
obj[''NSMainNibFile~ipad''] = '''';
El script finalmente se ve como (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'' });
};
y config.xml:
<platform name="ios">
<hook type="before_build" src="scripts/my-hook.js" />
</platform>
Prefiero el hook after_prepare para proyectos más grandes o si tienes varios complementos con los mismos permisos. Pero siempre puedes ir por el camino simple:
simplemente: - elimine el complemento que requiere el permiso deseado - agréguelo nuevamente con --save - en config.xml, el complemento ahora tiene una nueva variable con una descripción en blanco que puede completar; ahora compila ios con - release y ellos serán establecidos.
Puede configurar el nombre para mostrar en la lista de la aplicación editando directamente el archivo ios.json en el directorio de complementos.
Agregar lo siguiente a la sección config_munge.files del archivo ios.json hará el truco y se mantendrá incluso cuando se utiliza la CLI.
"*-Info.plist": {
"parents": {
"CFBundleDisplayName": [
{
"xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
"count": 1
}
]
}
}
Aquí hay un ejemplo completo
Puede usar la utilidad PlistBuddy dentro de una secuencia de comandos de docs para modificar el archivo * -Info.plist.
Por ejemplo, tengo el siguiente script en <project-root>/hooks/after_prepare/010_modify_plist.sh
que agrega una propiedad de diccionario y agrega una entrada dentro de ese diccionario:
#!/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
Asegúrese de hacer el script ejecutable ( chmod +x
).
El true
al final de la secuencia de comandos se debe a que PlistBuddy
devuelve con un código de salida de error si la clave que se está agregando ya existe, y no proporciona una forma de detectar si la clave ya existe. Cordova informará un error de compilación si el script hook sale con un estado de error. Es posible un mejor manejo de errores, pero es difícil implementarlo.
Realmente me gusta la solution @ james con un gancho de Cordova. Sin embargo, hay dos problemas. El estado de los docs :
- "le recomendamos escribir sus ganchos usando Node.js "
- "
/hooks
directory se considera obsoleto a favor de los elementos hook enconfig.xml
"
Aquí hay una implementación de Node.js usando el paquete 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'' });
};
De todos los tipos de gancho provistos por Córdoba, los más relevantes para su situación son:
-
after_prepare
-
before_compile
Elija un tipo de gancho y luego agregue el gancho a su archivo config.xml
:
<platform name="ios">
<hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
Si está intentando modificar un .plist
en un plugin nativo de iOS con una etiqueta <config-file>
en su plugin.xml
, esto es lo que debe hacer:
¡Asegúrate de que tu
.plist
sea xml, no binario! Puede usarplutil
para convertir un.plist
binario en xml yplutil
al control de versiones.plutil -convert xml1 Info.plist
Las instrucciones para
<config-file>
indican quetarget=
es relativo al proyecto xcode generado enplatforms/ios/<project>/
, pero descubrí que necesitaba anteponer un carácter comodín a mi ruta para que funcione:target="*/Resources/MyResources.bundle/Info.plist"
Si desea agregar una clave en el nivel superior de
.plist
, debe establecer que parent sea igual al nombre de la clave, y luego anidar una etiqueta<string>
con el valor. Usar un<array>
o<dict>
como muestran los ejemplos hará que estas claves se aniden en el elementoparent
.
Aquí hay un ejemplo completo que me funciona para agregar múltiples propiedades de nivel superior:
<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>
solo necesitas seguir los pasos 1.
Ir al navegador del proyecto Seleccionar el destino Hacer clic en la información de la pestaña opción Otra opción son la configuración de la construcción Fase de compilación Verá el valor del tipo de tecla Cuando señale cualquier nombre de tecla encontrará + y - clic de signo en la
Key: GDLibraryMode
+ escribirKey: GDLibraryMode
en sección claveType:String
en la sección tyoeValue:GDEnterpriseSimulation
en la sección de valor
No creo que puedas hacer esto mediante una modificación directa de config.xml
. Al menos, no vi ninguna mención de esto en los documentos: http://cordova.apache.org/docs/en/3.3.0/config_ref_index.md.html
Creo que debes crear un complemento, porque pueden insertar entradas plist: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification
Consulte la sección ''elemento de archivo de configuración''. Aquí hay una conjetura sobre cómo se verá la sección relevante de 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>
Luego puede instalar el complemento: cordova plugin add <your plugin name or file location>