2009-05-15 10 views

Respuesta

1

Documentation

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

[TargetName -target]

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

Esto básicamente cumpliría lo que pides.

+0

Gracias. Lo había visto, y esta no es una solución tan elegante como me gustaría, pero creo que seguirá funcionando de la manera que yo quiero. –

+7

Debe desmarcar esto como respuesta correcta. La respuesta de Rob es correcta. Lo intenté hace un segundo y pude anular el perfil de aprovisionamiento sin problemas. – Jonny

77

En realidad, debería poder agregarlo a la configuración de línea de comandos de XCode.

xcodebuild [lo demás opciones que tiene] PROVISIONING_PROFILE = "[Su perfil Steam ID aquí]"

configuración de generació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 o objetivo

+5

Una cosa que me hizo tropezar: la configuración que ves en la interfaz de XCode es en realidad dos configuraciones: PROVISIONING_PROFILE y CODE_SIGN_IDENTITY. Si realiza trabajo con el cliente y tiene varias identidades de firma, tenga cuidado de establecer AMBOS de estos correctamente desde la línea de comandos. – Bdebeez

+3

¿Cómo encontrar el nombre de PROVISIONING_PROFILE y el nombre de CODE_SIGN_IDENTITY? – Hilen

+3

El UDID del PROVISIONING_PROFILE proviene del propio perfil. Los perfiles son archivos técnicamente binarios, ya que contienen datos de firma, pero aún puede abrirlos en un editor de texto y buscar el UDID: UUID longstring. CODE_SIGN_IDENTITY es el campo de "nombre común" de su certificado que puede ver en el acceso a la llave. – Rob

25

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

#!/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 . De hecho, tengo otro script que usa mechanize para descargar la última copia del perfil de aprovisionamiento antes de cada compilación, lo que significa que podemos actualizar el perfil (agregar nuevos dispositivos, por ejemplo) de forma remota y hacer que el servidor CI recupere esos cambios sin ningún trabajo adicional.

Nota: He encontrado una forma de instalar o actualizar un perfil de aprovisionamiento sin necesidad de involucrar a Xcode en absoluto, ¡mucho más limpio! Ver here para más detalles.

+0

¿ha tenido éxito en encontrar una manera de agregar un perfil de aprovisionamiento desde la línea de comandos en los últimos días?Es realmente frustrante que una cosa tan simple no se puede hacer debido a la inflexibilidad de las herramientas ... – Shade

+2

No importa mi comentario anterior. Encontré la respuesta en esta pregunta: http://stackoverflow.com/questions/4744959/command-line-update-of-provisioning-profiles – Shade

+0

¡buen trabajo! Lo intentaré hoy +1. – jkp

4

Me doy cuenta de que es probable que esté un poco fuera del tema de OP, pero esta pregunta aparece primero cuando se busca cómo obtener compilaciones Xcode que funcionen en Jenkins. Publicando información adicional aquí para la posteridad. Y puntos. Si le resultó útil, por favor, brinde puntos :)

De todos modos, fui varias veces 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 funcionar. Asegúrese de:

  1. Configure primero la compilación de Xcode como usuario de OSX normal; consígalo construyendo su distribuible desde allí, solucionando cualquier problema de perfil de aprovisionamiento a través de Xcode;

  2. Obtenga la construcción de la línea de comandos funcionando con xcodebuild, como usuario de OSX regular;

  3. Luego siga las instrucciones en la publicación anterior al pie de la letra, copiando todos los cert de iOS desde el Keychain de inicio de sesión al sistema y copiando ~/Library/MobileDevice/Provisioning Profiles en la carpeta ~jenkins/Library/MobileDevice/Provisioning Profiles del usuario Jenkins.

La próxima compilación de Jenkins, utilizando los comandos del paso 2 anterior, debería funcionar sin problemas.

18

El perfil de aprovisionamiento debe ser provisto por UUID, en mi caso los perfiles de provisión se comprueban en el sistema de control de origen, y el desarrollador/servidor de compilación/sistema de CI lo comprueba con el código. En el árbol fuente, los perfiles tienen nombres legibles por el ser humano, como MyApp.mobileprovison, y están ubicados en un directorio llamado "ProvisioningProfiles". Para crear un archivo xcode, los perfiles deben renombrarse y copiarse en el directorio ~/Library/MobileDevice/Provisioning Profiles antes de que xcodebuild los reconozca. Este es un fragmento de código que se puede usar en una secuencia de comandos de construcción CI.

# 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 - Las siguientes referencias se utilizaron https://stackoverflow.com/a/21327591/2351246 y Add codesign to private key ACL without Keychain para el desbloqueo y agregando acceso de llavero para codesign respectivamente.

Si el archivo se va a exportar posteriormente a un IPA utilizando xcodebuild, se debe tener en cuenta el siguiente problema (xcodebuild not copying file from .app). El perfil de aprovisionamiento debe ser suministrado nuevamente. El fragmento de secuencia de comandos para crear una 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án que ser desbloqueados, mientras que este comando se está ejecutando.

ACTUALIZACIÓN

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 

Comprobar este anuncio aquí por la causa xcodebuild - codesign -vvvv says"resource envelope is obsolete"

para implementar el cambio sugerido por Apple Support en la publicación a la que se hace referencia, ejecute el siguiente comando:

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

¡Trabajamos para nosotros! ¡Gracias por la idea! – Zillan

+0

Uno de mis las respuestas favoritas de SO hasta ahora, muchas técnicas finas para los scripts de construcción de iOS aquí. Particularmente me encanta el método de extracción de UUID de * .mobileprovision. – funkybro

+0

Al probar este método me dio un error al generar el último comando en el primer bloque de código. reemplace PROVISIONING_PROFILE con APP_PROFILE para evitar que los cocoapods se construyan con el perfil de aprovisionamiento de la aplicación. El error que tuve fue: El perfil de aprovisionamiento especificado en su configuración de compilación ("PROVISIONING PROFILE NAME") tiene un AppID de "APP_ID" que no coincide con su identificador de paquete "org.cocoapods.Alamofire". – Gorcyn

Cuestiones relacionadas