40 votes

Est-ce que xcodebuild peut gérer la signature automatique ?

RÉSUMÉ :

Si vous ouvrez un projet dans Xcode 8 avec l'option "Automatically manage signing" activée et un nouvel ID de bundle, il créera et téléchargera automatiquement un profil de provisionnement pour celui-ci. Mais comment faire pour que la même chose se produise avec xcodebuild pour que je puisse l'utiliser sur un serveur de construction distant ?

DÉTAILS :

J'essaie de créer une application Cordova sur un Mac. Cordova configure le projet Xcode pour utiliser "Automatically manage signing", j'essaie donc de l'utiliser.

Je change souvent l'ID du paquet, et je veux donc que Cordova puisse le construire avec un nouvel ID de paquet, qui n'a pas été utilisé auparavant.

Mais quand je cours cordova build ios --release --device --buildConfig build.json J'obtiens un code de 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 la commande xcodebuild et obtenir la même erreur, donc ce n'est probablement pas un problème lié à 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, cela corrige la signature automatique, et à partir de là, je peux exécuter Cordova avec succès avec cet ID de bundle. Mais si j'essaie de l'exécuter avec un autre ID de bundle, il échouera à nouveau.

J'ai essayé d'utiliser security unlock-keychain ~/Library/Keychains/login.keychain-db d'abord, puisque ça a marché dans le passé, mais ça n'a pas aidé.

J'ai également essayé d'ouvrir ma clé de signature privée dans Keychain Access et de la régler sur "Autoriser toutes les applications à accéder à cet élément", sans succès.

J'obtiens la même erreur que je passe ou pas --debug o --release à Cordova.

0 votes

Le seul moyen que j'ai trouvé pour que cela fonctionne est de spécifier l'adresse de l'utilisateur. provisioningProfile dans le fichier build.json, malgré la Documentation Cordova indiquant qu'il n'est plus nécessaire.

0 votes

@JW. J'espère que cela pourra vous aider - code-dojo.blogspot.in/2012/09/

0 votes

@JW. Essayez également de supprimer manuellement les profils locaux dans : ~/Bibliothèque/MobileDevice/Provisioning Profiles le cas échéant

21voto

itai195 Points 1126

Ceci n'est pas directement supporté dans Xcode 8. Dans Xcode 9, cependant, vous pouvez passer -allowProvisioningUpdates à xcodebuild et la signature automatique fonctionnera comme dans l'interface utilisateur de Xcode, sans avoir besoin d'outils supplémentaires.

par exemple cordova run ios --buildFlag="-allowProvisioningUpdates"

1 votes

Je pense que c'est techniquement la seule réponse à la question que je posais, même si cela signifie attendre jusqu'à Xcode 9. Donc, félicitations !

2 votes

Comment passer cette arg avec la commande cordova build ? J'ai essayé --buildFlag="-allowProvisioningUpdates" mais elle semble être ignorée

0 votes

@itai195 vous avez apparemment laissé de côté une pièce incroyablement importante du puzzle. Comment fait-on pour obtenir ce drapeau dans la commande xcodebuild ? J'ai essayé cordova build ios .... -- -allowProvisioningUpdates mais ça n'a pas marché.

6voto

nbjibjssr Points 41

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 tout paramétrer pour que tout soit automatique :

  1. Clés de signature
  2. Faire des captures d'écran
  3. Téléchargement sur iTunes

et beaucoup d'autres choses

En arrière-plan, il utilise la ligne de commande xcodebuild. J'étais sceptique quant à la possibilité d'une telle chose, mais il suffit de l'installer, de la démarrer et de l'apprécier.

5voto

S. Matsepura Points 1303

Para Automatically manage signing vous pouvez utiliser Fastlane . Il est facile à installer et à configurer.

Pour l'utiliser sur un serveur de construction distant - vous pouvez utiliser Jenkins .

Voici un exemple. Vous devez configurer Jenkins avec Fastlane à votre machine distante. Than Jenkins vérifiera votre repository thread ou simplement par votre commandement. Après l'avoir Jenkins exécuter Fastlane sur le serveur de construction à distance. Et Fastlane créera tous les certificats et autres configurations que vous écrivez dans le fichier Fastfile .

Si vous n'avez qu'un seul certificat de déploiement, vous pouvez utiliser Fastlane service appelé Match

Synchronisez facilement vos certificats et profils au sein de votre équipe grâce à Git.

ou simplement l'envoyer et le configurer localement.

J'espère que cela vous aidera, 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: ["foo@foo.com"],
        notifications: true
        )
        slack(
        message: "New build for test successfully deployed in Fabric",
        success: true
        )
      end

Voici un exemple pour le déploiement de la version :

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
    )

4voto

Fares Ben Hamouda Points 430

Vous pouvez le faire en utilisant la fastlane.

https://fastlane.tools/

certificat : Récupérer ou générer la dernière identité de signature de code disponible.

soupir : Génère un profil de provisionnement. Stocke le profil dans le dossier actuel

ps : Si vous l'exécutez depuis un serveur CI (par exemple jenkins) vous devez alors déverrouiller le trousseau de login :

security unlock-keychain -p PASSWORD /Users/YOUR-USER/Library/Keychains/login.keychain

Exemple dans le fichier rapide :

cert(
  development: true,
)

sigh(
  development: true,
  app_identifier: "YOUR_APP_IDENTIFIER"
)

Voici un exemple d'un Fastfile 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

3voto

Vahan Babayan Points 619

Il n'y a aucun moyen de gérer la signature automatiquement en utilisant xcodebuild . Vous devez soit utiliser des tiers comme Fastlane comme indiqué précédemment, ou utiliser la signature manuelle du code comme indiqué. aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X