Habilita iCloud en un proyecto Xcode a través de script

Estoy intentando configurar un server de compilation para un edificio continuo en un proyecto de iOS. Dado que necesito recrear el proyecto Xcode muy a menudo (es una compilation desde la unidad), iCloud se restablecerá a OFF.

Puedo copyr el file de autorización (con la key iCloud) a través de la secuencia de commands, pero todavía necesito hacer clic en la checkbox real para activar iCloud.

Logré cambiar el proyecto XC manualmente, pero no es muy seguro, debido a posibles cambios en la estructura del proyecto XC.

¿Sabes una mejor manera de hacer esto? ¡Aclamaciones!

Al parecer, el TO resolvió el problema, pero como parece haber más personas interesadas en esto, aquí una posible solución.

Puede hacer un script para editar el proyecto.pbxproj que está dentro de su file xcodeproj (se puede ver, por ejemplo, con las opciones de "mostrar contenido del package" en el buscador).

En este file hay una sección para la configuration del proyecto llamada sección PBXProject. Allí puede agregar las capacidades para los objectives. Probablemente necesite escribir lógica de análisis personalizado, ya que este file está escrito en formatting de configuration XCode , no hay nada popular como XML o JSON.

La parte que desea actualizar se ve así:

/* Begin PBXProject section */ EB1DDE9C1A3334EC00D778DE /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0610; /* ...more settings */ TargetAttributes = { EB1DDEA31A3334EC00D778DE = {/* this is one target */ CreatedOnToolsVersion = 6.1.1; DevelopmentTeam = 37QAPDY2PR; /* ...more settings */ }; EB9F6CE11A8812550038355B = {/* another possible target */ CreatedOnToolsVersion = 6.2; DevelopmentTeam = 37QAPDY2PR; /* ...more settings */ }; }; }; /* ...more settings */ }; /* End PBXProject section */ 

Desea agregar las capacidades de iCloud a los objectives. Esto se ve así:

 SystemCapabilities = { com.apple.iCloud = { enabled = 1; }; }; 

Entonces, digamos que desea agregar la capacidad de iCloud al destino EB1DDEA31A3334EC00D778DE, entonces las inputs de TargetAttributes se verán así:

 TargetAttributes = { EB1DDEA31A3334EC00D778DE = {/* this is one target */ CreatedOnToolsVersion = 6.1.1; DevelopmentTeam = 37QAPDY2PR; SystemCapabilities = { com.apple.iCloud = { enabled = 1; }; }; }; EB9F6CE11A8812550038355B = {/* another possible target */ CreatedOnToolsVersion = 6.2; DevelopmentTeam = 37QAPDY2PR; /* ...more settings */ }; }; 

Ahora hay algunas cosas que necesita determinar para hacer esto:

1. Identifique la sección

Haría que el script searcha la cadena "Begin PBXProject section" y luego "TargetAttributes", ambos únicos en el file. Teóricamente, "TargetAttributes" debería ser suficiente pero mejor para estar seguro … y recuerde agregar un logging adecuado al script y verificar los resultados, ya que estas cadenas podrían cambiar fácilmente en futuras versiones de XCode (aunque las he visto sin cambios durante un time ya).

2. Identifique el objective

Hay varias partes en este file donde puede ver el id del destino asociado con el nombre. Me gustaría ver esto yo mismo y hardcode en el script, ya que este ID no cambiará a less que vuelva a crear el objective. Si realmente lo necesita, también puede automatizar esto … buscando el nombre de su destino y el formatting en el que aparece asociado con el ID. Debería haber también otros files de configuration en los que aparece esta asociación (en este file, el nombre solo aparece como un comentario).

3. Maneje la situación de que ya hay una input SystemCapabilities para el destino, y también que ya hay input iCloud.

Si su objective tiene otras capacidades, es posible que esta input ya exista. Además, si ya tiene habilitado iCloud o si habilitó iCloud una vez y lo deshabilitó, la input también existirá (con un valor 0). Esto debe manejarse en el script (aunque el último no debería ser un problema si el file del proyecto es nuevo).

Además de eso, es probable que también tenga que agregar una reference al file de derechos. Tienes que agregar esto a las configuraciones de compilation de los objectives respectivos. Para esto:

4. Encuentre el identificador (s) de configuration de compilation.

Su objective probablemente tenga varias configuraciones de compilation, por ejemplo, debugging y liberación. Debe encontrar el ID de la (s) configuration (es) de compilation para las que desea agregar una reference al file de derechos. Para hacer esto, hay una sección llamada XCConfigurationList (busque / * Inicio de la sección XCConfigurationList * /). Busque la ID de destino que obtuvimos en 1., luego busque los id de configuration para las configuraciones que necesita.

5. Busca el id de configuration de compilation en la sección XCBuildConfiguration

Vaya a / * Comience la sección XCBuildConfiguration * / y busque el (los) id (s) que se encuentran en 5., luego agregue la ruta a las autorizaciones de su buildSettings. P.ej:

Por ejemplo, tienes algo como

 EB9F6CF33A861055BB38355B /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = B82B36921BDRI3622B0EC99 /* Pods-mytargetname.debug.xcconfig */; buildSettings = { /* build settings... */ CODE_SIGN_ENTITLEMENTS = mytargetname/myentitlements.entitlements; /* <-- add this */ }; name = Debug; }; 

Tenga en count que XCode debería "conocer" el file de derechos (al igual que el rest de los files de su proyecto).