SOMMAIRE:
Si vous ouvrez un projet dans Xcode 8 avec l'option "Gérer automatiquement la signature" et un nouvel ID d'ensemble, il créera et téléchargera automatiquement un profil d'approvisionnement pour ce projet. Mais comment faire en sorte que la même chose se produise avec xcodebuild
pour pouvoir l’utiliser sur un serveur de compilation distant?
DÉTAILS:
J'essaie de créer une application Cordova sur un Mac. Cordova configure le projet Xcode pour utiliser "Gérer automatiquement la signature", donc j'essaie de l'utiliser.
Je change souvent l'identifiant du paquet. Je souhaite donc que Cordova puisse le construire avec un nouvel identifiant de paquet, qui n'a jamais été utilisé auparavant.
Mais quand je cours cordova build ios --release --device --buildConfig build.json
, Je reçois un code retour 65 et l’erreur suivante:
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
(Je peux exécuter manuellement cette commande xcodebuild et obtenir la même erreur. Ce n'est donc probablement pas un problème avec Cordova.)
Mon fichier build.json ressemble à ceci:
{
"ios": {
"debug": {
"codeSignIdentity": "iPhone Developer",
"developmentTeam": "MY_TEAM_ID",
"packageType": "development"
},
"release": {
"codeSignIdentity": "iPhone Developer",
"developmentTeam": "MY_TEAM_ID",
"packageType": "enterprise"
}
}
}
J'utilise cordova 7.0.1, cordova-ios 4.4.0, Xcode 8.3.3 et MacOS 10.12.5. J'ai un compte Apple Enterprise.
CE QUE J’AI ESSAYÉ:
Si j'ouvre le projet généré dans Xcode, la signature automatique est corrigée et, à partir de ce moment, je peux exécuter cordova avec succès avec cet ID de bundle. Mais si j'essaie de l'exécuter avec un ID de lot différent, cela échouera à nouveau.
J'ai essayé d'utiliser security unlock-keychain ~/Library/Keychains/login.keychain-db
_ d'abord, puisque cela a fonctionné dans le passé, mais cela n'a pas aidé.
J'ai également essayé d'ouvrir ma clé de signature privée dans Keychain Access et de la définir sur "Autoriser toutes les applications à accéder à cet élément", sans aucune chance.
Je reçois la même erreur, que je passe ou non --debug
ou --release
à Cordoue.
Ceci n'est pas directement pris en charge dans Xcode 8. Cependant, vous pouvez passer de -allowProvisioningUpdates à xcodebuild et la signature automatique fonctionnera comme dans l'interface utilisateur de Xcode, sans nécessiter d'outils supplémentaires.
par exemple. cordova run ios --buildFlag="-allowProvisioningUpdates"
Pour Automatically manage signing
vous pouvez utiliser Fastlane . C'est facile à installer et à configurer.
Pour l'utiliser sur un serveur de build distant, vous pouvez utiliser Jenkins .
Dans cet exemple. Vous devez installer Jenkins
avec Fastlane
sur votre ordinateur distant. Than Jenkins
vérifiera votre repository thread
ou simplement par votre commande. Après cela, Jenkins
exécutez Fastlane
sur le serveur de génération distant. Et Fastlane
créera tous les certificats et autres configurations que vous écrivez dans Fastfile
.
Si vous ne possédez qu'un seul certificat de déploiement, vous pouvez utiliser le service Fastlane
appelé Match
.
Synchronisez facilement vos certificats et profils au sein de votre équipe à l'aide de Git
ou simplement l'envoyer et l'installer localement.
J'espère que cela vous aide, bonne chance!
Voici un exemple pour beta deploy
(pour moi, travailler avec 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
Voici un exemple pour release deploy:
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
)
La réponse est oui. Ce que j’ai utilisé et ce que je peux confirmer fonctionne et c’est génial:
Vous pouvez configurer tout pour qu'il soit automatique:
et plein d'autres choses
En arrière-plan, il utilise la ligne de commande xcodebuild. J'étais sceptique quant à quelque chose comme ceci est possible, mais installez-vous, commencez et appréciez.
Vous pouvez le faire en utilisant fastlane.
cert : récupère ou génère la dernière identité de signature de code disponible
sigh : génère un profil d'approvisionnement. Stocke le profil dans le dossier actuel
ps: Si vous l’exécutez à partir d’un serveur CI (par exemple, jenkins), vous devez ensuite déverrouiller le trousseau de connexion:
security unlock-keychain -p PASSWORD /Users/YOUR-USER/Library/Keychains/login.keychain
Exemple dans le fastfile:
cert(
development: true,
)
sigh(
development: true,
app_identifier: "YOUR_APP_IDENTIFIER"
)
Voici un exemple de fichier rapide de base:
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
En ce qui concerne ma compréhension et mes lectures récentes, la réponse à la question de OP:
" xcodebuild peut-il gérer la signature automatique?" est "OUI" mais pas selon les attentes du PO en indiquant "lorsque vous n'avez pas encore créé l'ID d'application ou le profil d'approvisionnement, et que vous voulez le créer automatiquement comme Xcode le fait"
Selon ce blog informatif sur xcode8 et la signature automatique de code, il est clairement indiqué que:
"Si vous souhaitez créer par exemple un IPA signé App Store, vous devez disposer d'un certificat Wildcard, d'équipe/de développement ET des certificats de distribution et de profils d'approvisionnement de l'App Store."
Par conséquent, l'ID de l'application et le profil d'approvisionnement ne seront pas créés automatiquement. Fastlane est peut-être une solution de contournement à ce problème mais je suppose que ce n’est pas l’attente du PO. J'espère que cela a du sens.
Il n’existe aucun moyen de gérer la signature automatiquement à l’aide de xcodebuild
. Vous devez soit utiliser des tiers tels que Fastlane
comme mentionné précédemment, soit utiliser la signature manuelle du code comme indiqué ici .
Comme d'autres réponses l'ont déjà mentionné, ce que vous recherchez est un outil d'automatisation de version appelé Fastlane. https://fastlane.tools/
Si vous ne le connaissez pas, le meilleur tutoriel pour commencer est le tutoriel fastlane de raywenderlich.
https://www.raywenderlich.com/136168/fastlane-tutorial-getting-started-2
Notice: Cette réponse suppose que l'ID d'ensemble et les profils d'approvisionnement sont créés manuellement. Seul le processus de construction peut être automatisé à l'aide de cette méthode.
Oui, cela est possible même sans utiliser des outils tiers. vous devriez être à l'aise avec un fichier script ou un fichier make. J'utilise 2 lignes de code dans un fichier makefile sur Mac Mini au travail. Et cela nous donne soit ad-hoc
ou appstore
version prête à être téléchargée selon notre configuration.
<?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>
Vous devez enregistrer la configuration de la liste de plis dans un endroit accessible, par exemple sous la forme options.plist. Rappelez-vous simplement: assurez-vous que votre profil d'approvisionnement ad-hoc/distribution est présent sur votre Mac distant.
xcodebuild
créera une archive puis nous pourrons exporter .app. Dans votre fichier make ou script, utilisez ces lignes:4.1. Nous créons d'abord le fichier archive.
xcodebuild archive -derivedDataPath build/ -project myProject.xcodeproj -scheme myScheme -archivePath build/ios/myProject.xcarchive
Le paramètre derivedDataPath
est simplement un dossier qui peut être supprimé plus tard, une fois l'application créée. vous savez combien d’ordures sont produites dans les données dérivées. project
nom est le nom de votre projet et scheme
nom est juste après play|stop
bouton dans Xcode. Vous devez choisir un nom d'archive et un chemin pour l'étape suivante.
4.2 Une fois que votre archive a été construite avec succès, utilisez ce code pour créer l'application:
xcodebuild -exportArchive -archivePath build/ios/myProject.xcarchive -exportPath build/ios/ -exportOptionsPlist build/ios/options.plist
Ici, vous utilisez le nom de l'archive et le chemin qui ont été utilisés à l'étape précédente. exportOptionsPlist
a besoin de connaître le chemin et le nom de votre configuration de plist que nous avons créés à l'étape 3.
Et c'est tout! Vous pouvez exécuter ces commandes dans une fenêtre de terminal. Elle créera également votre application. Vous pouvez placer ces 2 lignes dans un fichier script/makefile et utiliser des variables pour le nom, le chemin et le fichier options.plist du projet. Vous pouvez ensuite l'utiliser pour créer toutes vos applications.
PS: Si quelque chose n'est pas clair, faites-le moi savoir et j'ajouterai d'autres explications.
Si vous archivez le projet xCode avec xcodebuild et que xCode 9 est installé, vous pouvez fournir les FLAGS suivants à la commande de compilation:
CODE_SIGN_STYLE="Manual" \
DEVELOPMENT_TEAM="" \
La signature automatique sera définie sur false et l'équipe de développement sera vide. Vous pouvez définir les valeurs dont vous avez besoin. Par exemple:
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
Ensuite, vous pouvez créer l'IPA avec -exportArchive et il créera l'IPA selon vos besoins.