Le chemin qui envoie un build vers l’App Store
En Partie 1 nous avons créé la cible de build MAS, et en Partie 2 nous avons créé les fichiers de configuration et le branchement du code qui séparent les deux canaux. La cible FocusTimer MAS est maintenant dans une forme qui peut être mise sur l’App Store.
Dans cette dernière partie, nous allons mettre en place le chemin pour téléverser ce build vers App Store Connect, et couvrir comment vérifier les deux canaux pour qu’ils restent fonctionnels, ce qui conclura la série.
Comme dans les Parties 1 et 2,
FocusTimer,com.example.FocusTimer.mas, le Team IDABCDE12345, etc. sont tous des valeurs d’exemple.
Étape 1 — L’ExportOptions-MAS.plist pour le téléversement
Dans la série de distribution directe, nous avons noté que lors de l’exportation d’une archive pour la distribution, la commande xcodebuild -exportArchive lit un fichier ExportOptions.plist. Le canal MAS a besoin d’un fichier de configuration d’export séparé.
Créez un ExportOptions-MAS.plist dans le répertoire de publication du projet.
<?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>method</key>
<string>app-store</string>
<key>destination</key>
<string>upload</string>
<key>signingStyle</key>
<string>automatic</string>
<key>teamID</key>
<string>ABCDE12345</string>
</dict>
</plist>
Voici ce que signifie chaque clé.
method=app-store— Signifie que ce build est exporté pour le canal Mac App Store. Cela contraste avec ledeveloper-iddu canal de distribution directe.destination=upload— Fait téléverser l’artefact exporté directement vers App Store Connect parxcodebuild -exportArchive. Plus besoin de passer par Transporter ou un outil de téléversement séparé comme avant.signingStyle=automatic— Xcode fait correspondre automatiquement le profil de provisionnement Mac App Store et le certificat Apple Distribution.teamID— Votre Apple Developer Team ID.
Une fois que vous créez ce fichier, vous le réutilisez pour chaque publication MAS. Laissez le ExportOptions.plist de distribution directe tel quel, et gardez ce fichier à côté.
Étape 2 — Enregistrer l’enregistrement de l’application dans App Store Connect
Pour soumettre réellement l’application à la validation, il doit exister un enregistrement (record) d’application dans App Store Connect. Un enregistrement est le conteneur qui contient toutes les informations affichées dans la boutique — le nom de l’application, la description, les captures d’écran, le prix, etc.
La création de l’enregistrement peut attendre jusqu’à juste avant votre première soumission réelle. Au stade de la configuration initiale, il suffit de savoir à l’avance « quels éléments décider et comment ». En particulier, la Primary Language ci-dessous est difficile à annuler une fois définie, décidez-la donc soigneusement à l’avance.
Dans App Store Connect → My Apps → + → New App, entrez les informations suivantes.
- Platform — Sélectionnez macOS
- Primary Language (langue principale) — ⚠️ L’élément à décider le plus soigneusement. Une fois définie, il est très difficile de la modifier en libre-service. Si vous prévoyez de publier l’application dans plusieurs pays, il est courant de définir l’anglais (English, U.S.) comme langue principale, car la langue principale est « la langue de référence affichée lorsqu’il n’y a pas de traduction pour un pays particulier ».
- App Name (nom de l’application) — Le nom dans la langue principale (par ex.,
FocusTimer). Les noms pour d’autres langues sont ajoutés plus tard séparément en tant que localisations par langue. Par exemple, vous pouvez faire afficher un nom en coréen aux utilisateurs coréens et un nom en japonais aux utilisateurs japonais. - Bundle ID — Sélectionnez
com.example.FocusTimer.masdans le menu déroulant. C’est l’ID que vous avez enregistré en Partie 1. Ne le confondez pas avec le Bundle ID de distribution directe (com.example.FocusTimer) — il doit impérativement s’agir de celui avec.masajouté. - SKU — Une chaîne d’identification interne utilisée uniquement par vous. Elle n’est pas exposée dans la boutique, vous pouvez donc la choisir librement (par ex.,
focustimer-mas-001).
La catégorie de l’application doit correspondre à la valeur que vous avez mise dans
LSApplicationCategoryTypedans leInfo.plisten Partie 2. Si vous avez mispublic.app-category.productivity(Productivité) dans le plist, vous devez également choisir la catégorie « Productivité » dans App Store Connect pour qu’un avertissement de non-concordance n’apparaisse pas lors de la validation.
Étape 3 — Vérifier les builds des deux canaux
Vous avez maintenant un seul codebase avec deux cibles de build. Cela entraîne un coût de maintenance. Si vous ne buildez normalement que le canal de distribution directe, vous ne remarquerez pas si la cible MAS s’est silencieusement cassée. Par exemple, vous ajoutez du nouveau code mais oubliez le branchement #if canImport(Sparkle), et seul le build MAS échoue à compiler.
La façon la plus fiable de l’éviter est d’archiver la cible MAS également chaque fois que vous faites une publication de distribution directe. Si le build réussit, cela signifie que le branchement des deux canaux est intact.
xcodebuild -project FocusTimer.xcodeproj -scheme "FocusTimer MAS" \
-configuration Release \
-destination 'platform=macOS' \
-archivePath build/FocusTimer-MAS.xcarchive \
archive
Si vous voyez ce qui suit à la fin de la sortie, le branchement MAS est correct.
** ARCHIVE SUCCEEDED **
Je recommande d’insérer cette commande dans la dernière étape de votre script d’automatisation des publications pour qu’elle s’exécute automatiquement à chaque publication. Même lorsque vous ne téléversez pas réellement le build MAS vers l’App Store, juste confirmer que l’archivage réussit est suffisant pour garantir que le branchement des deux canaux n’est pas cassé.
Récapitulatif de la série — Configuration initiale pour la publication MAS terminée
La configuration initiale en trois parties pour la publication sur le Mac App Store est maintenant entièrement terminée. Vous disposez maintenant des éléments suivants :
- ✅ (Partie 1) Un Bundle ID exclusif MAS + la cible de build
FocusTimer MASdupliquée - ✅ (Partie 2) Entitlements et Info.plist exclusifs MAS + paramètres de build + branchement du code
#if canImport(Sparkle) - ✅ (Partie 3) Un
ExportOptions-MAS.plistpour le téléversement + comment enregistrer un enregistrement App Store Connect + vérification des builds des deux canaux
Avec cela, une seule application macOS dispose maintenant des deux canaux distribution directe (Developer ID) et Mac App Store. Pour rappeler la structure centrale :
- Partager le même codebase, mais le diviser en deux cibles de build.
- La cible de distribution directe inclut Sparkle, et la cible MAS l’exclut.
- La différence entre les deux s’exprime à travers des fichiers entitlements, Info.plist et ExportOptions séparés et un branchement du code
#if canImport(Sparkle).
La configuration initiale demande un effort considérable, mais c’est aussi une structure qui continue à être réutilisée une fois en place. À partir de là, lorsque vous faites une publication de distribution directe, il vous suffit d’archiver le build MAS en même temps et de confirmer que le branchement est toujours vivant. La soumission réelle à l’App Store (captures d’écran, descriptions, gestion de la validation) est un travail séparé effectué par-dessus cette configuration initiale, et c’est un sujet pour un autre article.