ios - para - ¿Puede xcodebuild gestionar la firma automática?
firma digital iphone (9)
Como ya han mencionado otras respuestas, lo que estás buscando es una herramienta de automatización de lanzamiento llamada Fastlane. https://fastlane.tools/
Si no está familiarizado con él, creo que el mejor lugar para comenzar sería el tutorial rápido de raywenderlich.
https://www.raywenderlich.com/136168/fastlane-tutorial-getting-started-2
RESUMEN:
Si abre un proyecto en Xcode 8 con la opción "Administrar automáticamente la firma" habilitada y una nueva ID de paquete, automáticamente creará y descargará un perfil de aprovisionamiento para él. Pero, ¿cómo puedo hacer que suceda lo mismo con xcodebuild
, para poder usarlo en un servidor de compilación remoto?
DETALLES:
Estoy intentando construir una aplicación Cordova en una Mac. Cordova configura el proyecto de Xcode para usar "Gestionar automáticamente la firma", así que estoy tratando de usar eso.
Cambio el ID del paquete a menudo, por lo que quiero que Cordova lo pueda construir con un nuevo ID de paquete, que no se haya usado antes.
Pero cuando ejecuto cordova build ios --release --device --buildConfig build.json
, obtengo un código de retorno 65 y el siguiente error:
Check dependencies
No profiles for ''com.my.bundle.id'' were found: Xcode couldn''t find a provisioning profile matching ''com.my.bundle.id''.
Code signing is required for product type ''Application'' in SDK ''iOS 10.3''
** ARCHIVE FAILED **
The following build commands failed:
Check dependencies
(1 failure)
Error: Error code 65 for command: xcodebuild with args: -xcconfig,/cordova-project/platforms/ios/cordova/build-debug.xcconfig,-workspace,MyApp.xcworkspace,-scheme,MyApp,-configuration,Debug,-destination,generic/platform=iOS,-archivePath,MyApp.xcarchive,archive,CONFIGURATION_BUILD_DIR=/cordova-project/platforms/ios/build/device,SHARED_PRECOMPS_DIR=/cordova-project/platforms/ios/build/sharedpch
(Puedo ejecutar manualmente el comando xcodebuild y obtener el mismo error, por lo que probablemente no sea un problema de Cordova).
Mi archivo build.json se ve así:
{
"ios": {
"debug": {
"codeSignIdentity": "iPhone Developer",
"developmentTeam": "MY_TEAM_ID",
"packageType": "development"
},
"release": {
"codeSignIdentity": "iPhone Developer",
"developmentTeam": "MY_TEAM_ID",
"packageType": "enterprise"
}
}
}
Estoy usando cordova 7.0.1, cordova-ios 4.4.0, Xcode 8.3.3 y MacOS 10.12.5. Tengo una cuenta Apple Enterprise.
LO QUE TRATÉ:
Si abro el proyecto generado en Xcode, corrige la firma automática y, a partir de ese momento, puedo ejecutar cordova con éxito con ese ID de paquete. Pero si trato de ejecutarlo con un ID de paquete diferente, volverá a fallar.
Intenté usar la security unlock-keychain ~/Library/Keychains/login.keychain-db
primero, ya que eso funcionaba en el pasado, pero no ayudaba.
También intenté abrir mi clave de firma privada en Acceso a Llaveros y configurarlo para "Permitir que todas las aplicaciones accedan a este elemento", sin suerte.
Recibo el mismo error independientemente de si paso --debug
o --release
a cordova.
En cuanto a mi comprensión y lecturas recientes, la respuesta a la pregunta de OP:
" ¿Puede xcodebuild gestionar la firma automática?" es "SÍ", pero no según las expectativas del OP en líneas de "cuando aún no ha creado la ID de la aplicación o el perfil de aprovisionamiento, y desea crearla automáticamente de la forma en que lo hace Xcode"
Según este blog informativo sobre xcode8 y la firma automática de códigos, establece claramente que:
"Si quieres crear, por ejemplo, un App Store con IPA firmada, en la Mac tienes que tener un Comodín, Equipo / Desarrollo Y los certificados de distribución y perfiles de aprovisionamiento de App Store".
Por lo tanto, la ID de la aplicación y el perfil de aprovisionamiento no se crearán automáticamente. Fastlane puede ser una solución a este problema, pero supongo que no es la expectativa del OP. Espero que tenga sentido.
Esto no se admite directamente en Xcode 8. Sin embargo, en Xcode 9, puede pasar -permiteProvisioningUpdates a xcodebuild y la firma automática funcionará igual que en la IU de Xcode, sin necesidad de herramientas adicionales.
por ejemplo cordova run ios --buildFlag="-allowProvisioningUpdates"
La respuesta es sí Lo que usé y lo que puedo confirmar es que funciona y es genial:
Puede configurar todo para que sea automático:
- Claves de firma
- Tomando capturas de pantalla
- Cargando en iTunes
y muchas otras cosas
En segundo plano, está utilizando la línea de comando xcodebuild. Estaba escéptico de que algo como esto fuera posible, pero solo configúrelo, comience y disfrute.
No hay forma de administrar la firma automáticamente usando xcodebuild
. Debe utilizar terceros como Fastlane
como se mencionó anteriormente o utilizar la firma de código manual como se menciona here .
Para Automatically manage signing
, puede usar https://fastlane.tools/ . Es fácil de instalar y configurar.
Para usarlo en un servidor de compilación remoto, puede usar Jenkins .
Aquí ejemplo. Necesita configurar Jenkins
con Fastlane
en su máquina remota. Than Jenkins
comprobará el repository thread
tu repository thread
o simplemente por tu orden. Después, Jenkins
ejecuta Fastlane
en el servidor de compilación remoto. Y Fastlane
creará todos los certificados y otras configuraciones que escriba en Fastfile
.
Si solo tiene un certificado de implementación, puede usar el servicio Fastlane
llamado Match
Sincronice fácilmente sus certificados y perfiles en su equipo usando Git
o simplemente enviar y configurarlo localmente.
Espero que te ayude, buena suerte!
Aquí un ejemplo para beta deploy
(para mí, trabajo con Xcode 9
):
desc "Build devFoo and upload it to Fabric"
lane :uploadToFabric do
cocoapods
cert(
development: true,
output_path: "./fastlane"
)
sigh(
development: true,
output_path: "./fastlane"
)
clear_derived_data
gym(
scheme: "Foo",
configuration: "Debug",
clean: true,
output_directory: "./fastlane",
)
crashlytics(
api_token: "foofoofoofoo",
build_secret: "foofoofoofoo",
emails: ["[email protected]"],
notifications: true
)
slack(
message: "New build for test successfully deployed in Fabric",
success: true
)
end
Aquí un ejemplo para la implementación de la versión:
desc "Build and upload it to the AppStore and TestFlight"
lane :uploadToAppStore do
cocoapods
cert(
development: false,
output_path: "./fastlane"
)
sigh(
development: false,
app_identifier: "foofoo",
output_path: "./fastlane"
)
clear_derived_data
gym(
scheme: "Foo",
configuration: "Release",
clean: false,
output_directory: "./fastlane",
)
deliver(
force: true,
app_identifier: "foo",
skip_metadata: true,
skip_screenshots: true,
submit_for_review: false,
skip_binary_upload: false
)
slack(
message: "New build successfully deployed to AppStore",
success: true
)
upload_symbols_to_crashlytics(dsym_path: "./fastlane/foo.app.dSYM.zip")
slack(
message: "dSYM symbolication files uploaded to Crashlytics",
success: true
)
Puedes hacerlo usando fastlane.
cert : Obtener o generar la última identidad de firma de código disponible
suspiro : genera un perfil de aprovisionamiento. Almacena el perfil en la carpeta actual
ps: si lo está ejecutando desde un servidor de CI (por ejemplo, jenkins), debe desbloquear el login keychain:
security unlock-keychain -p PASSWORD /Users/YOUR-USER/Library/Keychains/login.keychain
Ejemplo dentro del archivo rápido:
cert(
development: true,
)
sigh(
development: true,
app_identifier: "YOUR_APP_IDENTIFIER"
)
Aquí hay un ejemplo de un Fastfile básico:
fastlane_version "2.27.0"
default_platform :ios
platform :ios do
lane :beta do
cert
sigh
gym
end
error do |lane, exception|
puts "Got an error! #{exception.error_info.to_s}"
end
end
Si está archivando el proyecto xCode con xcodebuild y tiene xCode 9 instalado, puede proporcionar los siguientes FLAGS al comando de compilación:
CODE_SIGN_STYLE="Manual" /
DEVELOPMENT_TEAM="" /
Establecerá la firma automática en falso y el equipo de desarrollo en vacio. Puede establecer los valores que necesita. Por ejemplo:
xcodebuild /
-scheme "your_scheme" /
-sdk iphoneos /
-archivePath "/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device/yourproject.xcarchive" /
-configuration Release /
-allowProvisioningUpdates /
CONFIGURATION_BUILD_DIR="/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device" /
CODE_SIGN_IDENTITY="your code sign identity" /
PROVISIONING_PROFILE="your provisioning profile" /
CODE_SIGN_STYLE="Manual" /
DEVELOPMENT_TEAM="" /
archive
Entonces puedes crear el ipa con -exportArchive y creará el ipa como necesites
Aviso : esta respuesta supone que los ID del paquete y los perfiles de aprovisionamiento se crean manualmente. Solo el proceso de compilación se puede automatizar utilizando este método.
Sí, eso es posible incluso sin utilizar herramientas de terceros. deberías sentirte cómodo usando el archivo de script o un archivo make. Estoy usando 2 líneas de código en un makefile en Mac Mini en el trabajo. Y eso nos da una versión ad-hoc
o una appstore
lista para cargar según nuestra configuración.
- asegúrese de que su proyecto haya habilitado la configuración automática.
- asegúrese de que en su Mac remoto todos los certificados de canto y aprovisionamiento se descargan. para este caso, siempre, para el primer edificio, abro Xcode y construyo y exporto en mi máquina remota. Si eso funciona, entonces no falta nada. Pero asegúrese de permitir siempre el acceso al certificado de canto. Xcode también pregunta esto por la primera versión. De lo contrario, aparecerá una ventana emergente en su servidor remoto y espera hasta que alguien permita el acceso al certificado de firma.
- necesitas un archivo plist:
<?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>teamID</key> <string>MY_TEAM_ID_XXYY</string> //put your iPhone distribution team ID. in my case developer team ID is different than my distribution team ID. just wondering. <key>method</key> <string>app-store</string> // for appstore upload or use <string>ad-hoc</string> for ad-hoc <key>uploadSymbols</key> <true/> <key>uploadBitcode</key> <true/> </dict> </plist>
Debería guardar la configuración plist en algún lugar accesible, por ejemplo, como options.plist simplemente como un recordatorio: asegúrese de tener su perfil de aprovisionamiento ad-hoc / distribución en su Mac remota.
-
xcodebuild
creará un archivo y luego podremos exportar .app. En su archivo make o script use estas líneas:
4.1. Primero creamos el archivo de almacenamiento.
xcodebuild archive -derivedDataPath build/ -project myProject.xcodeproj -scheme myScheme -archivePath build/ios/myProject.xcarchive
derivedDataPath
parámetro derivedDataPath
es solo una carpeta que se puede eliminar más adelante después de derivedDataPath
la aplicación. usted sabe la cantidad de basura que se produce en los datos derivados. nombre del project
es el nombre de su proyecto, y el nombre del scheme
está justo después del botón play|stop
en Xcode. Debe elegir un nombre de archivo y una ruta para el siguiente paso.
4.2 Después de que su archivo se haya creado correctamente, use este código para crear la aplicación:
xcodebuild -exportArchive -archivePath build/ios/myProject.xcarchive -exportPath build/ios/ -exportOptionsPlist build/ios/options.plist
Aquí usa el nombre del archivo y la ruta que se utilizó en el paso anterior. exportOptionsPlist
necesita saber la ruta y el nombre de su configuración plist que creamos en el paso 3.
¡Y eso es! Puede ejecutar estos comandos en una ventana de terminal y también creará su aplicación. Puede poner estas 2 líneas en un archivo de script / makefile y usar variables para el nombre del proyecto, ruta y options.plist, luego puede usar eso para compilar todas sus aplicaciones.
PD: si algo no está claro, por favor avíseme y agregaré más explicaciones.