web-dev-qa-db-fra.com

Xcodebuild peut-il gérer la signature automatique?

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.

36
JW.

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"

16
itai195

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
    )
5
S. Matsepura

La réponse est oui. Ce que j’ai utilisé et ce que je peux confirmer fonctionne et c’est génial:

https://fastlane.tools/

Vous pouvez configurer tout pour qu'il soit automatique:

  1. Clés de signature
  2. Prendre des screenshots
  3. Téléchargement sur iTunes

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.

5
mommcilo

Vous pouvez le faire en utilisant fastlane.

https://fastlane.tools/

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
4
Fares Ben Hamouda

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.

3
Gandhi

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 .

3
Vahan Babayan

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

3
sleepwalkerfx

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.

  1. assurez-vous que votre projet a activé la configuration automatique.
  2. assurez-vous que tous les certificats de chant et les approvisionnements sont téléchargés sur votre Mac distant. dans ce cas, pour le premier bâtiment, j'ouvre toujours Xcode et construis/exporte sur ma machine distante. Si cela fonctionne alors rien ne manque. Mais assurez-vous de toujours autoriser l'accès au certificat de chant. Xcode demande également ceci pour la première construction. Sinon, une fenêtre contextuelle apparaîtra sur votre serveur distant et attendra que quelqu'un autorise l'accès au certificat de signature.
  3. vous avez besoin d'un fichier de 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>

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.

  1. 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. projectnom est le nom de votre projet et schemenom 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.

3
Hashmat Khalil

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.

1
mgarciaibanez