iphone - uso - no se pudo activar la red de datos celulares no tienes suscripcion
¿Cómo puedo visualizar la revisión de la versión de la aplicación en el paquete de configuraciones de mi aplicación? (8)
Basado en el ejemplo aquí , aquí está el script que estoy usando para actualizar automáticamente el número de versión del paquete de configuraciones:
#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary
settings_file_path = ''Settings.bundle/Root.plist'' # the relative path from the project folder to your settings bundle
settings_key = ''version_preference'' # the key of your settings version
# these are used for testing only
info_path = ''/Users/mrwalker/developer/My_App/Info.plist''
settings_path = ''/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist''
# these environment variables are set in the XCode build phase
if ''PRODUCT_SETTINGS_PATH'' in os.environ.keys():
info_path = os.environ.get(''PRODUCT_SETTINGS_PATH'')
if ''PROJECT_DIR'' in os.environ.keys():
settings_path = os.path.join(os.environ.get(''PROJECT_DIR''), settings_file_path)
# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist[''CFBundleVersion'']
# print ''project_bundle_version: ''+project_bundle_version
# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
for dictionary in settings_plist[''PreferenceSpecifiers'']:
if ''Key'' in dictionary and dictionary[''Key''] == settings_key:
dictionary[''DefaultValue''] = project_bundle_version
# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)
Este es el Root.plist que tengo en Settings.bundle:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>About</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>1.0.0.0</string>
<key>Key</key>
<string>version_preference</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
</plist>
Me gustaría incluir la versión de la aplicación y la revisión interna, algo así como 1.0.1 (r1243), en el paquete de configuraciones de mi aplicación.
El archivo Root.plist contiene un fragmento como este ...
<dict>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
<key>Title</key>
<string>Version</string>
<key>Key</key>
<string>version_preference</string>
<key>DefaultValue</key>
<string>VersionValue</string>
<key>Values</key>
<array>
<string>VersionValue</string>
</array>
<key>Titles</key>
<array>
<string>VersionValue</string>
</array>
</dict>
y me gustaría reemplazar la cadena "VersionValue" en tiempo de compilación.
Tengo un script que puede extraer el número de versión de mi repositorio, lo que necesito es una forma de procesar (preprocesar) el archivo Root.plist, en tiempo de compilación, y reemplazar el número de revisión sin afectar el archivo de origen.
Basado en la respuesta de @ Quinn, aquí el proceso completo y el código de trabajo que uso para hacer esto.
- Agrega un paquete de configuraciones a tu aplicación. No lo cambie de nombre
- Abra Settings.bundle / Root.plist en un editor de texto
Reemplace los contenidos con:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Title</key>
<string>About</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>DummyVersion</string>
<key>Key</key>
<string>version_preference</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Root</string>
</dict>
</plist>
Cree una fase de compilación Ejecutar script , muévase para estar después de la fase Copiar recursos de paquete . Agrega este código:
cd "${BUILT_PRODUCTS_DIR}" buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" ) /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
Reemplace MyAppName con el nombre de su aplicación real, y el 1 después de PreferenceSpecifiers para que sea el índice de su entrada de la Versión en la Configuración. El ejemplo de Root.plist anterior lo tiene en el índice 1.
Creo que puedes hacer esto usando una forma similar a la que describo en esta respuesta (basada en esta publicación ).
En primer lugar, puede hacer que VersionValue sea una variable dentro de Xcode al cambiarle el nombre a $ {VERSIONVALUE}. Cree un archivo llamado versionvalue.xcconfig y agréguelo a su proyecto. Vaya a su destino de la aplicación y vaya a la configuración de compilación para ese objetivo. Creo que debe agregar VERSIONVALUE como una configuración de compilación definida por el usuario. En la esquina inferior derecha de esa ventana, cambie el valor Basado en a "valor de versión".
Finalmente, vaya a su destino y cree una fase de compilación Ejecutar script. Inspeccione esa fase del script de ejecución y pegue su script en el campo de texto del script. Por ejemplo, mi secuencia de comandos para etiquetar mi configuración BUILD_NUMBER con la versión actual de Subversion es la siguiente:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e ''s/^[^:]*://;s/[A-Za-z]//''`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
Esto debería hacer el truco de reemplazar la variable cuando estos valores cambien dentro de su proyecto.
Hay otra solución que puede ser mucho más simple que cualquiera de las respuestas anteriores. Apple incluye una herramienta de línea de comandos llamada PlistBuddy en la mayoría de sus instaladores, y la ha incluido en Leopard en /usr/libexec/PlistBuddy
.
Como quiera reemplazar VersionValue
, suponiendo que tiene el valor de la versión extraído en $newVersion
, podría usar este comando:
/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist
No es necesario jugar con sed o expresiones regulares, este enfoque es bastante sencillo. Consulte la página de manual para obtener instrucciones detalladas. Puede usar PlistBuddy para agregar, eliminar o modificar cualquier entrada en una lista de propiedades. Por ejemplo, un amigo mío blogueó sobre incrementar los números de compilación en Xcode usando PlistBuddy.
Nota: si proporciona solo la ruta al plist, PlistBuddy ingresa al modo interactivo, por lo que puede emitir varios comandos antes de decidir guardar los cambios. Definitivamente recomiendo hacer esto antes de colocarlo en tu script de compilación.
La solución de mi perezoso fue actualizar el número de versión de mi código de aplicación. Puede tener un valor predeterminado (o en blanco) en Root.plist y luego, en algún lugar de su código de inicio:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];
La única pega es que tu aplicación debería ejecutarse al menos una vez para que la versión actualizada aparezca en el panel de configuración.
Podrías llevar la idea más allá y actualizar, por ejemplo, un contador de cuántas veces se ha lanzado tu aplicación u otros datos interesantes.
Las otras respuestas no funcionan correctamente por una razón: la fase de compilación ejecutar script no se ejecuta hasta DESPUÉS de que se haya empaquetado el paquete de configuraciones. Por lo tanto, si su versión de Info.plist es 2.0.11 y la actualiza a 2.0.12, entonces compile / archive su proyecto, el paquete de Configuraciones seguirá diciendo 2.0.11. Si abre el paquete de configuración Root.plist, puede ver que el número de versión no se actualiza hasta el final del proceso de compilación. Puede crear el proyecto OTRA VEZ para obtener el paquete Configuraciones actualizado correctamente, o puede agregar el script a una fase previa a la creación en su lugar ...
- En XCode, edite el esquema para su objetivo de proyecto
- Haga clic en la flecha de divulgación en el esquema BUILD
- Luego, haga clic en el elemento "Pre-acciones"
- Haga clic en el signo más y seleccione "Nueva ejecución de acción de script"
- Establezca el valor de shell en / bin / sh
- Establezca "Proporcionar configuraciones de compilación desde" a su objetivo de proyecto
Agregue su script al área de texto. La siguiente secuencia de comandos funcionó para mí. Es posible que deba modificar las rutas para que coincidan con la configuración de su proyecto:
versionString = $ (/ usr / libexec / PlistBuddy -c "Print CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")
/ usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"
Esto ejecutará correctamente el script ANTES de que el paquete de Configuraciones esté empaquetado durante el proceso de compilación / archivo. Si abre el paquete Configuraciones Root.plist y crea / archiva su proyecto, ahora verá que el número de versión se actualiza al comienzo del proceso de compilación y su paquete de Configuraciones mostrará la versión correcta.
Me las arreglé para hacer lo que quería usando el pjectist de código abierto pListcompiler ( http://sourceforge.net/projects/plistcompiler ).
Usando este compilador puede escribir el archivo de propiedad en un archivo .plc usando el siguiente formato:
plist { dictionary { key "StringsTable" value string "Root" key "PreferenceSpecifiers" value array [ dictionary { key "Type" value string "PSGroupSpecifier" key "Title" value string "AboutSection" } dictionary { key "Type" value string "PSTitleValueSpecifier" key "Title" value string "Version" key "Key" value string "version" key "DefaultValue" value string "VersionValue" key "Values" value array [ string "VersionValue" ] key "Titles" value array [ string "r" kRevisionNumber ] } ] } }
Tenía una fase de compilación de script de ejecución personalizada que extraía la revisión de mi repositorio al archivo .h como lo describe brad-larson here .
El archivo plc puede contener directivas de preprocesador, como #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode variables de entorno. Así que pude hacer referencia a la variable kRevisionNumber agregando la siguiente directiva
#include "Revision.h"
También agregué una fase de creación de scripts personalizada a mi objetivo de xcode para ejecutar el plompiler cada vez que se construye el proyecto.
/usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
¡Y eso fue todo!
Usando el plist de Ben Clayton https://.com/a/12842530/338986
Agregue la Run script
con el siguiente fragmento después de Copy Bundle Resources
.
version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"
CFBundleVersion
además de CFBundleShortVersionString
. Emite una versión como esta:
Al escribir en $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist
lugar del que está en $SRCROOT
tiene algunos beneficios.
- No modifica los archivos en la copia de trabajo del repositorio.
- No es necesario que
$SRCROOT
ruta aSettings.bundle
en$SRCROOT
. La ruta puede variar.
Prueba en Xcode 7.3.1