Configuración de un perfil de aprovisionamiento desde dentro xcodebuild al hacer aplicaciones para el iPhone

StackOverflow https://stackoverflow.com/questions/866761

Pregunta

Estoy usando xcodebuild a compilar mi aplicación para el iPhone desde la línea de comandos. ¿Hay una manera de pasar en algún tipo de opción para establecer el perfil de suministro? Parece que hay no mucho información sobre xcodebuild en general.

¿Fue útil?

Solución

Documentación

Parece Del documento, no se puede establecer el archivo de aprovisionamiento pero se puede especificar el objetivo:

[- TargetName objetivo]

Por lo tanto, si se crea un objetivo para cada archivo de aprovisionamiento, puede seleccionar el objetivo adecuado de la línea de comandos.

Esto básicamente lograr lo que su venta.

Otros consejos

En realidad, debería ser capaz de simplemente añadirlo a la configuración de la línea de comandos XCode.

xcodebuild [lo tienes otras opciones] PROVISIONING_PROFILE = "[Su perfil Steam ID aquí]"

Configuración de creación de la línea de comandos se supone que anular todo, por lo que este debe ganar a lo largo nada definido en el proyecto u objetivo.

Mi solución no es elegante pero sí hacer el trabajo y dejar a automatizar todo en la construcción de servidor:

#!/bin/bash

TARGET="Your App"
CONFIGURATION="Release"
SDK="iphoneos"
PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision"
IDENTITY="iPhone Distribution: Your Company Ltd"
KEYCHAIN="/Users/jkp/Desktop/keychain"
PASSWORD="foobar"

open "${PROFILE_PATH}"
sleep 5
osascript -e "tell application \"Xcode\" to quit"
security unlock-keychain -p ${PASSWORD} ${KEYCHAIN}
xcodebuild \
  -target "${TARGET}" \
  -configuration ${CONFIGURATION} \
  -sdk iphoneos \
  CODE_SIGN_IDENTITY="${IDENTITY}" \    
  OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"

La clave aquí es que no tenía necesidad de instalar el archivo de suministro primero. En realidad tengo otro script que utiliza la mecanización para descargar la última copia del archivo de suministro antes de cada compilación que significa que podemos actualizar el perfil (la adición de nuevos dispositivos, por ejemplo) de forma remota y hacer que esos cambios recogidos por nuestro servidor CI sin ningún trabajo adicional.

Nota: Desde entonces, he encontrado una manera de instalar o actualizar un perfil de datos sin necesidad de involucrar a Xcode en absoluto - mucho más limpio! Ver aquí para más detalles .

El archivo de suministro tiene que ser proporcionada por UUID, en mi caso los perfiles de datos se comprueban en el sistema de control de origen, y por lo tanto se comprueban con el código por el promotor / construcción del sistema del servidor / CI. En el árbol de fuentes de los perfiles tienen nombres legibles por humanos tales como MyApp.mobileprovison y se encuentran en un directorio llamado "ProvisioningProfiles". Para crear un archivo de Xcode, los perfiles tienen que cambiar el nombre y copiar en el directorio de perfiles de datos ~ / Library / MobileDevice / xcodebuild antes de los reconocerá. Este es un fragmento de código que se puede utilizar en un script CI construcción.

# The keychain needs to be unlocked for signing, which requires the keychain
# password. This is stored in a file in the build account only accessible to
# the build account user
if [ ! -f $HOME/.pass ] ; then
    echo "no keychain password file available"
    exit 1
fi

case `stat -L -f "%p" $HOME/.pass`
in
    *400) ;;
    *)
        echo "keychain password file permissions are not restrictive enough"
        echo "chmod 400 $HOME/.pass"
        exit 1
        ;;
esac

#
# unlock the keychain, automatically lock keychain on script exit
#
security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain
trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT

#
# Extract the profile UUID from the checked in Provisioning Profile.
#
uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

#
# Copy the profile to the location XCode expects to find it and start the build,
# specifying which profile and signing identity to use for the archived app
#
cp -f ProvisioningProfiles/MyApp.mobileprovision \
        "$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision"
xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \
        -archivePath build/MyApp.xcarchive archive \
        PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"

El llavero debe estar desbloqueado y la función "/ usr / bin / codesign" se debe permitir el acceso a la clave privada asociada a la identidad de firma para que esto funcione - Se utilizaron las siguientes referencias https://stackoverflow.com/a/21327591/2351246 y Añadir codesign a ACL clave privada sin llavero para desbloquear el acceso y la adición de llavero para codesign respectivamente.

Si el archivo se va a exportar posteriormente a una IPA utilizando xcodebuild entonces el siguiente problema se debe tener en cuenta ( xcodebuild no copiar archivos de .app ). El perfil de suministro debe ser suministrada de nuevo. El fragmento de secuencia de comandos para crear un IPA es

profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

xcodebuild \
        -exportArchive \
        -exportFormat IPA \
        -archivePath build/MyApp.xcarchive \
        -exportPath $IPADIR/MyApp.ipa \
        -exportProvisioningProfile "$profileName"

El llavero tendrá que ser desbloqueado, mientras que este comando está en ejecución.

Actualizar

En OSX v10.9.5 (Mavericks) y OSX Yosemite empezamos a ver los errores de firma de código:

Codesign check fails : ...../MyApp.app: resource envelope is obsolete

Marque esta publicación aquí por la causa xcodebuild - codesign -vvvv dice "conjunto de recursos es obsoleto"

Para llevar a cabo el cambio sugerido por Apple Soporte en el puesto de referencia, ejecute el comando siguiente:

 sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`

Me di cuenta que es probablemente un poco fuera de tema OP, pero esta pregunta surge primera hora de buscar cómo conseguir Xcode construye trabajando en Jenkins. Publicar alguna información adicional aquí para la posteridad. Y puntos. Si has encontrado este útil, por favor, dar puntos:)

De todos modos, fueron varias rondas en este caso un par de veces últimamente. Encontrado esto:

http : //code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

Parece que funciona. Asegúrese de que:

  1. Configuración de la Xcode construir como un usuario regular de primera OSX; conseguir que la construcción de su distribuible a partir de ahí, la fijación de cualquier problema perfil de suministro a través de Xcode;

  2. Obtener la acumulación de línea de comandos de trabajo utilizando xcodebuild, como un usuario normal OSX;

  3. A continuación, siga las instrucciones del post anterior a la carta, copiando todos los CERT iOS de sesión Llavero de sistema y copia ~/Library/MobileDevice/Provisioning Profiles a la carpeta del usuario Jenkins ~jenkins/Library/MobileDevice/Provisioning Profiles.

El siguiente Jenkins construir, usando los comandos en el paso 2 anterior, debería funcionar sin problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top