Características de creación e entrega de aplicacións iOS

Neste artigo, compartimos a experiencia de montar e entregar aplicacións iOS aos usuarios, que o estudo Plarium Krasnodar acumulou no proceso de depuración de CI/CD.

Características de creación e entrega de aplicacións iOS

Adestramento

Todas as persoas que participen dun xeito ou doutro no desenvolvemento de aplicacións para dispositivos Apple xa apreciaron a polémica comodidade da infraestrutura. As dificultades atópanse en todas partes: desde o menú do perfil do programador ata as ferramentas de depuración e construción.

Hai moitos artigos sobre o "básico" en Internet, polo que tentaremos destacar o principal. Aquí tes o que necesitas para crear a túa aplicación con éxito:

  • conta de desenvolvedor;
  • un dispositivo baseado en macOS que actúa como servidor de compilación;
  • xerado certificado de desenvolvedor, que se utilizará ademais para asinar a solicitude;
  • aplicación creada con única ID (hai que ter en conta a importancia do identificador do paquete, porque o uso do ID comodín imposibilita o uso de moitas funcións da aplicación, por exemplo: dominios asociados, notificacións push, inicio de sesión de Apple e outras);
  • perfil sinaturas da solicitude.

Débese xerar un certificado de programador mediante Keychain en calquera dispositivo macOS. O tipo de certificado é moi importante. Dependendo do contorno da aplicación (Dev, QA, Staging, Production) será diferente (Desenvolvemento ou Distribución), así como o tipo de perfil de sinatura da aplicación.

Principais tipos de perfís:

  • Desenvolvemento: para asinar a aplicación do equipo de desenvolvemento, úsase un certificado de desenvolvemento (nome de tipo iPhone Developer: XXXXX);
  • Ad Hoc - destinado a asinar unha aplicación de proba e verificación interna polo departamento de control de calidade, utilízase o certificado de distribución do programador (nome de tipo iPhone Distribution: XXXXX);
  • App Store: versión para probas externas mediante TestFlight e carga na App Store, utilízase o certificado de distribución do programador.

Á hora de xerar perfís de Desenvolvemento e Ad Hoc, tamén se indica lista de dispositivos, na que pode instalar unha compilación, que lle permite restrinxir aínda máis o acceso dos usuarios. Non hai unha lista de dispositivos no perfil da App Store, xa que o control de acceso durante as probas beta pechada corre a cargo de TestFlight, que se comentará máis adiante.

Para máis claridade, podes presentar o perfil do programador na forma dunha táboa a continuación. Isto facilita a comprensión de que parámetros necesitamos para a montaxe e de onde obtelos.

Características de creación e entrega de aplicacións iOS

Asemblea

Para facilitar a separación dos conxuntos por proxecto e entorno, usamos nomes de perfil como ${ProjectName}_${Instance}, é dicir, nome do proxecto + instancia (depende do contorno da aplicación: Dev, QA, GD, Staging, Live, etc.).

Cando se importa ao servidor de compilación, o perfil cambia o seu nome a un ID único e móvese ao cartafol /Users/$Username/Library/MobileDevice/Provisioning Profiles (onde $Username corresponde ao nome da conta de usuario do servidor de compilación).

Hai dúas formas de construír un ficheiro *.ipa: herdado (PackageApplication) e moderno (mediante a creación e exportación de XcAchive). O primeiro método considérase obsoleto, xa que desde a versión 8.3 o módulo de empaquetado de ficheiros da aplicación foi eliminado da distribución Xcode. Para usalo, cómpre copiar o módulo do antigo Xcode (versión 8.2 e anteriores) ao cartafol:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

E despois executa o comando:

chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*

A continuación, cómpre recoller o ficheiro *.app da aplicación:

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
build 
-configuration Release 
-derivedDataPath build 
CODE_SIGN_IDENTITY=”$DevAccName”
PROVISIONING_PROFILE=”$ProfileId”
DEPLOYMENT_POSTPROCESSING=YES 
SKIP_INSTALL=YES 
ENABLE_BITCODE=NO

En que:

-workspace — ruta ao ficheiro do proxecto.

-scheme — O esquema utilizado, especificado no proxecto.

-derivedDataPath — camiño para descargar a aplicación montada (*.app).

CODE_SIGN_IDENTITY — o nome da conta do programador, que se pode verificar en Keychain (Desenvolvedor do iPhone: XXXX XXXXXXX, sen TeamID entre corchetes).

Características de creación e entrega de aplicacións iOS

PROVISIONING_PROFILE — ID de perfil para asinar a aplicación, que se pode obter co comando:

cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'

Se a aplicación usa un perfil adicional (por exemplo, para notificacións push), en vez de PROVISIONING_PROFILE indicar:

APP_PROFILE=”$AppProfile” 
EXTENSION_PROFILE=”$ExtProfile” 

A continuación, o ficheiro *.app resultante debe empaquetarse en *.ipa. Para facelo, pode usar un comando como:

/usr/bin/xcrun --sdk iphoneos PackageApplication 
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app") 
-o "$ProjectDir/$ProjectName_$Instance.ipa"

Non obstante, este método considérase obsoleto desde o punto de vista de Apple. É relevante obter *.ipa exportando desde o arquivo da aplicación.

Primeiro cómpre recoller o arquivo co comando:

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
-configuration Release 
archive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
CODE_SIGN_IDENTITY=”$DevAccName” 
PROVISIONING_PROFILE=”$ProfileId”
ENABLE_BITCODE=NO 
SYNCHRONOUS_SYMBOL_PROCESSING=FALSE

As diferenzas residen no método de montaxe e nas opcións SYNCHRONOUS_SYMBOL_PROCESSING, que desactiva a descarga de símbolos no momento da construción.

A continuación, necesitamos xerar un ficheiro coa configuración de exportación:

ExportSettings="$ProjectDir/exportOptions.plist"

cat << EOF > $ExportSettings
<?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>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
<key>method</key>
<string>$Method</string>
<key>provisioningProfiles</key>
<dict>
<key>$BundleID</key>
<string>$ProfileId</string>
</dict>
<key>signingCertificate</key>
<string>$DevAccName</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>$TeamID</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
EOF

En que:

$Method — método de entrega, corresponde ao tipo de perfil de sinatura da aplicación, é dicir, para o desenvolvemento o valor será desenvolvemento, para Ad Hoc - ad-hoc e para App Store - app-store.

$BundleID — ID da aplicación, que se especifica na configuración da aplicación. Podes comprobar co comando:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — Configuración do nome do programador e da ID do perfil de sinatura que se utilizaron anteriormente e que deben coincidir cos valores da configuración de exportación.

$TeamID — ID de dez díxitos entre corchetes despois do nome do programador, exemplo: Desenvolvedor do iPhone: …… (XXXXXXXXXX); pódese comprobar no Chaveiro.

A continuación, usando o comando de exportación, obtemos o ficheiro *.ipa necesario:

xcodebuild 
-exportArchive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
-exportPath $ProjectDir 
-exportOptionsPlist $ExportSettings

Entrega

Agora o ficheiro recollido debe ser entregado ao usuario final, é dicir, instalado no dispositivo.

Hai moitos servizos para distribuír compilacións de desenvolvemento e ad hoc, como HockeyApp, AppBlade e outros, pero neste artigo falaremos dun servidor autónomo para distribuír aplicacións.

A instalación da aplicación para iOS realízase en 2 etapas:

  1. Recibir o manifesto de instalación da aplicación a través do Servizo de Items.
  2. Instalación do ficheiro *.ipa segundo a información especificada no manifesto a través de HTTPS.

Así, primeiro necesitamos xerar un manifesto de instalación (tipo de ficheiro *.plist) co comando:

cat << EOF > $manifest
<?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>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>$ipaUrl</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>$BundleID</string>
<key>bundle-version</key>
<string>$AppVersion</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$ProjectName_$Instance</string>
<key>subtitle</key>
<string>$Instance</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF

Como podes ver, o manifesto contén case todos os parámetros implicados na construción da aplicación.

Versión da aplicación ($AppVersion) pódese comprobar co comando:

defaults read $ProjectDir/Info CFBundleVersion

Parámetro $ipaUrl contén unha ligazón directa para descargar o ficheiro *.ipa. A partir da sétima versión de iOS, a aplicación debe instalarse a través de HTTPS. Na oitava versión, o formato do manifesto cambiou lixeiramente: bloques con configuracións para iconas de aplicacións como

<images>
   <image>...</image>
</images>

Así, para instalar a aplicación abonda cunha simple páxina HTML cunha ligazón coma esta:

itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist

Para as necesidades dos departamentos de desenvolvemento e probas, Plarium creou a súa propia aplicación de instalación de compilación, que nos ofrece:

  • autonomía e independencia,
  • centralización do control de acceso e instalación segura de aplicacións mediante ligazóns "temporais" creadas de forma dinámica,
  • funcionalidade expandible (é dicir, o equipo de desenvolvemento, se é necesario, pode integrar as funcións que faltan nunha aplicación existente).

Probas

Agora falaremos das probas previas ao lanzamento da aplicación usando TestFlight.

As condicións necesarias para a descarga son o tipo de perfil de sinatura da App Store e a presenza de claves API xeradas.

Hai varias formas de descargar a aplicación:

  • a través de Xcode (Organizador),
  • vía altool,
  • mediante Application Loader para versións anteriores de Xcode (agora Transporter).

Para a descarga automática, úsase altool, que tamén ten dous métodos de autorización:

  • Contrasinal específico da aplicación,
  • Clave API.

É preferible descargar a aplicación usando a clave API.

Para obter a clave API, vai a Ligazón e xerar unha chave. Ademais da propia chave en formato *.p8, necesitaremos dous parámetros: IssuerID e KeyID.

Características de creación e entrega de aplicacións iOS

A continuación, importe a clave descargada ao servidor de compilación:

mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/

Antes de cargar a aplicación en TestFlight, cómpre validar a aplicación, facémolo co comando:

xcrun altool 
--validate-app 
-t ios 
-f $(find "$ProjectDir" -name "*.ipa") 
--apiKey “$KeyID” 
--apiIssuer “$IssuerID” 

Onde apiKey и apiIssuer ten valores de campo da páxina de xeración de claves da API.

A continuación, tras a validación exitosa, cargamos a aplicación co comando --upload-app cos mesmos parámetros.

A aplicación será probada por Apple nun ou dous días e despois estará dispoñible para probadores externos: enviaranse ligazóns por correo electrónico para a instalación.

Outra forma de descargar unha aplicación a través de altool é usar o contrasinal específico da aplicación.

Para obter o contrasinal específico da aplicación, debes ir a Ligazón e xeralo na sección Seguridade.

Características de creación e entrega de aplicacións iOS

A continuación, debes crear un rexistro do servidor de compilación en Keychain con este contrasinal. Desde a versión 11 de Xcode isto pódese facer co comando:

xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd

En que:

$DeveloperName — o nome da conta de programador de iOS utilizada para iniciar sesión nos servizos de Apple.

$AppPswd — contrasinal específico da aplicación xerado.

A continuación, obtemos o valor do parámetro asc-provider e comprobamos o éxito da importación do contrasinal co comando:

xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"

Obtemos a saída:

Provider listing:
- Long Name - - Short Name -
XXXXXXX        XXXXXXXXX

Como podes ver, o valor de Nome abreviado necesario (asc-provider) coincide co parámetro $TeamID que usamos ao crear a aplicación.

Para validar e cargar a aplicación en TestFlight, use o comando:

xcrun altool 
--(validate|upload)-app   
-f $(find "$ProjectDir" -name "*.ipa") 
-u "$DeveloperName" 
-p "@keychain:Altool" 

Como valor de parámetro -p podes tomar o valor $AppPswd en forma non cifrada (explícita).

Non obstante, como xa se mencionou, desde o punto de vista do rendemento, é mellor escoller a clave API para a autorización de altool, xa que as diferentes versións de Xcode teñen certos problemas ("non ve" Chaveiro, erros de autorización durante a carga, etc.).

Iso é todo, en realidade. Desexo a todos os implicados compilacións exitosas e versións sen problemas na App Store.

Fonte: www.habr.com

Engadir un comentario