Passer au contenu

Lignes directrices de la boutique iOS pour les achats en ligne

GitHub

Pour obtenir l'approbation de votre application sur l'App Store, il est essentiel de prêter attention aux lignes directrices d'Apple, en particulier lors de l'implémentation des achats en application et des abonnements. Ce guide couvre tout ce dont vous avez besoin pour passer la revue de votre première soumission.

Processus de revue de l'App Store iOS

Avant que Apple examine votre flux d'achat, assurez-vous que le dossier de l'application lui-même est complet :

  • Ajoutez un Politique de confidentialité URL dans App Store Connect
  • Ajouter un URL de support qui mène à des informations de contact réelles pour les utilisateurs
  • Terminez le note d'âge Pour le contexte : Page/zone : Page de solution exemple d'application. Rôle : Étiquette de navigation ou élément UI court. Vu dans : composant solutions/SolutionAppExample.astro. Clé de message `solution_app_examples_rating` (Note d'évaluation de l'application Solution).
  • questionnaire afin que l'application soit publiable Ajouter Détails de contact d'App Review
  • et notes de réviseur claires compte de démonstration qui ne expire pas pendant la revue
Méta-données de la liste de l'App Store avec des liens de politique et de support
  • Utilisez les écrans actuels provenant de la build réelle en revue
  • Pour iPhone, 1290 x 2796 (6,7 pouces) est la taille par défaut la plus facile
  • Si votre application fonctionne sur iPad, téléchargez également des écrans iPad
  • Les tailles d'écran iPad acceptées actuellement incluent 2064 x 2752 (13 pouces) et 2048 x 2732 (12,9 pouces)
  • N'agrandissez jamais les captures d'écran d'iPhone pour simuler la compatibilité iPad

Effectuez une simulation de la démarche de la révision dans TestFlight

Section intitulée « Effectuez une simulation de la démarche de la révision dans TestFlight »

Exécutez le chemin exact que suivra Apple sur un appareil réel :

  • Installez la dernière version de TestFlight
  • Connectez-vous avec le compte de révision que vous prévoyez fournir
  • Parvenez à la limite payante sans menus de débogage ou gestes cachés
  • Terminez les flux d'achat, de restauration et de gestion de l'abonnement
  • Vérifiez que l'application se comporte toujours correctement si les permissions sont refusées

Apple exige une transparence totale des tarifs avant toute achat :

Éléments obligatoires :

  • Afficher le prix exact avant le bouton d'achat
  • Montrer la fréquence de facturation (par exemple, « 9,99 $ par mois »)
  • État clair de ce que les utilisateurs obtiennent pour leur argent
  • Indiquer quand les factures seront émises

Rejet commun :

« Le prix des abonnements doit être clair et explicite. »

:::caution Consistance des prix Tous les prix doivent correspondre sur :

  • Méta-données de l'App Store
  • Écrans d'achat en application
  • Écrans de gestion d'abonnement

Même une différence de 1 $ entre la liste de l'App Store (4,99 $) et l'application (5,99 $) déclenchera une rejet automatique.

Informations requises :

  • Tous les niveaux d'abonnement disponibles affichés ensemble
  • Comparaison claire des fonctionnalités par niveau
  • Pas de redirige vers les niveaux premium par des astuces de l'interface
  • Instructions de suppression faciles à localiser

Conseils de conception d'interface à suivre

Paywall avec restauration d'achats et liens juridiques

Exemple d'interface conforme :

import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() {
return (
<div>
<h2>Choose Your Plan</h2>
{/* Show all tiers equally */}
<PlanCard
title="Basic"
price="$4.99/month"
features={['Feature A', 'Feature B']}
/>
<PlanCard
title="Premium"
price="$9.99/month"
features={['All Basic', 'Feature C', 'Feature D']}
highlighted={false} // Don't force premium
/>
{/* Clear cancellation info */}
<Text>
Cancel anytime in Settings > Subscriptions.
No refunds for partial periods.
</Text>
</div>
);
}

Implémentation requise :

Chaque application avec IAP doit fournir une manière pour les utilisateurs de restaurer les achats précédents sans contacter le support.

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function restorePurchases() {
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSub = purchases.find(
(purchase) => purchase.isActive && purchase.expirationDate,
);
if (activeSub) {
unlockPremiumFeatures();
showMessage('Purchases restored successfully!');
return;
}
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage(
hasIap ? 'Premium purchase restored!' : 'No previous purchases found.',
);
} catch (error) {
showError('Failed to restore purchases. Please try again.');
}
}
// Add a visible "Restore Purchases" button
<Button onClick={restorePurchases}>
Restore Purchases
</Button>

1. L'application s'arrête ou présente une fonctionnalité cassée

Section intitulée « 1. L'application s'arrête ou présente une fonctionnalité cassée »

Pourquoi cela ne fonctionne pas :

  • L'application s'effondre au lancement
  • La progression d'achat ne se termine pas
  • Les fonctionnalités montrées dans les captures d'écran ne fonctionnent pas

Prévention :

  • Testez sur des appareils réels (et non seulement des simulateurs)
  • Testez toutes les flux de souscription de bout en bout
  • Vérifiez que la validation de la réception fonctionne
  • Vérifiez la gestion des erreurs de réseau

Pourquoi cela ne fonctionne pas :

  • Les captures d'écran montrent des fonctionnalités non présentes dans la version actuelle
  • La description mentionne une fonctionnalité qui n'existe pas
  • Le prix dans les métadonnées diffère de celui en application

Liste de vérification des métadonnées

Prévention :

// Document exactly what's in each tier
const SUBSCRIPTION_FEATURES = {
basic: ['Ad-free', 'Cloud sync', 'Basic themes'],
premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']
};
// Use these in both your app AND App Store description

Pourquoi cela ne fonctionne pas :

  • Demander l'accès à la caméra/au localisation/à la santé sans explication
  • Les demandes d'autorisation enfouies plusieurs écrans plus loin
  • Des descriptions d'autorisation vagues ou génériques

Prévention :

Mettez à jour votre Info.plist avec des explications claires :

Copie de permission trop vague pour la revue Copie de permission avec des explications plus claires
<key>NSCameraUsageDescription</key>
<string>Camera access is needed to scan product barcodes for quick subscription upgrades.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location helps us show relevant local content in your Premium subscription.</string>

Pourquoi cela ne fonctionne pas :

  • Des affirmations comme « l’application numéro 1 dans le monde » sans preuve
  • Des « fonctionnalités illimitées » qui ont des limites cachées
  • Des tactiques d’urgence fausses (« Seulement 2 places restantes ! »)

Lignes directrices de la description Exemples

Lignes directrices de la description supplémentaires

Prévention :

  • Soyez spécifique et factuel dans les descriptions
  • Évitez les superlatifs sans preuve
  • N'obligez pas les utilisateurs avec une fausse rareté

Pourquoi cela ne fonctionne pas :

  • Aucune mention de la façon de se désinscrire
  • Bouton de désinscription caché ou obscurci
  • Procédure de désinscription en plusieurs étapes sans le flux natif d'Apple

Prévention :

// Always inform users about cancellation
function SubscriptionInfo() {
return (
<div>
<h3>How to Cancel</h3>
<ol>
<li>Open iPhone Settings</li>
<li>Tap your name at the top</li>
<li>Tap Subscriptions</li>
<li>Select this app and tap Cancel</li>
</ol>
<p>Or manage directly in the App Store app.</p>
<Button onClick={openSubscriptionManagement}>
Manage Subscription in Settings
</Button>
</div>
);
}
async function openSubscriptionManagement() {
// Direct link to iOS subscription management
await NativePurchases.showManageSubscriptions();
}

Confidentialité & Utilisation des données (Section 5.1.1)

Section intitulée « Confidentialité & Utilisation des données (Section 5.1.1) »

Apple a considérablement renforcé les exigences de confidentialité en 2025.

Pour chaque autorisation :

  1. Pourquoi vous en avez besoin (utilisation spécifique)
  2. Quand il sera utilisé
  3. Comment les données sont stockées/échangées
  4. Est-ce qu'il s'agit d'une option ou d'une obligation
async function requestCameraPermission() {
// Show explanation BEFORE requesting
await showDialog({
title: 'Camera Access',
message: 'We need camera access to let you scan barcodes for quick product lookup. Your photos are never uploaded or stored.',
buttons: ['Not Now', 'Allow']
});
// Then request permission
const result = await Camera.requestPermissions();
return result.camera === 'granted';
}

Assurez-vous que vos étiquettes de confidentialité de l'App Store reflètent avec précision :

  • Collecte d'historique d'achat
  • Adresses e-mail (pour les reçus)
  • Identifiants de dispositif (pour la prévention de la fraude)
  • Données d'utilisation (pour les analyses)

Les étiquettes de confidentialité inexactes constituent une raison courante de refus en 2025. Vérifiez soigneusement la collecte de vos données.

Vérification pré-submission

  1. Tester tous les flux d'achat

    • Acheter chaque niveau de souscription
    • Tester les essais gratuits
    • Vérifier que les offres d'introduction s'appliquent correctement
    • Tester la restauration des achats
    • Vérifier la partage familial (si activé)
    • Tester sur plusieurs appareils
  2. Vérifier la cohérence des prix

    • Vérifier que les métadonnées de l'App Store correspondent aux prix en application
    • Vérifier que toutes les devises sont correctes
    • Confirmer les durées de la période d'essai gratuite correspondent aux descriptions
    • Vérifier les termes des offres introductives sont précis
  3. Réviser Tous les Textes

    • Supprimer le texte de remplacement
    • Vérifier que les affirmations sont testables
    • Vérifier l'orthographe et la grammaire
    • S'assurer que les descriptions correspondent à la version actuelle
    • Supprimer les mentions des concurrents
  4. Tester les Autorisations

    • Demander uniquement les autorisations nécessaires
    • Montrer des explications claires avant de demander
    • Tester les flux de refus (l'application devrait toujours fonctionner)
    • Vérifiez les descriptions d'Info.plist
  5. Préparez un compte de test

    • Créez un compte de revue qui reste valide pendant la revue
    • Documentez les informations de connexion dans les informations de revue de l'application
    • Vérifiez que le réviseur peut atteindre la barrière de paiement et terminer la flux de paiement
    • Incluez des comptes supplémentaires ou des commutateurs spécifiques à l'application dans le champ Notes si nécessaire
  6. Vérifiez les métadonnées

    • Les captures d'écran correspondent à l'interface utilisateur actuelle
    • L'URL de support inclut des informations de contact réelles
    • L'URL de la politique de confidentialité est remplie
    • Le niveau d'âge correspond au contenu dans la build
    • La vidéo de prévisualisation de l'application (si elle existe) montre la version actuelle
    • La description décrit avec précision les fonctionnalités
    • La politique de confidentialité est accessible en ligne et depuis la liste des applications
  7. Écrire des notes de revue détaillées

    Contact:
    Name: Jane Developer
    Email: review@yourapp.com
    Phone: +1 555-0100
    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    This account does not expire during review.
    Testing Instructions:
    1. Log in with test account above
    2. Tap "Upgrade to Premium" button
    3. Select "Monthly Premium" subscription
    4. Complete purchase (no charge in sandbox)
    5. Verify premium features unlock
    Note: Subscription pricing is clearly shown before purchase.
    Cancellation instructions are in Settings > Account.

Ligne du temps de la revue de l'App Store

Révision standard : 24-48 heures Périodes de pointe : 3-5 jours (lancements de l'App Store pendant les vacances) Week-ends : Aucune revue traitée Examen accéléré : Disponible pour les correctifs critiques (demandez via App Store Connect)

États courants que vous verrez dans App Store Connect :

  • Waiting for Review
  • In Review
  • Pending Developer Release
  • Rejected

1. Clarté des abonnements

  • Comparaisons de plans de côté à côté requises
  • Pas de « modèles sombres » qui masquent les options moins chères
  • Itinéraires de dégradation/amélioration clairs

2. Précision des métadonnées

  • Les captures d'écran doivent correspondre à la version du build en cours de revue
  • Les captures d'écran iPad sont requises si le support iPad est activé
  • L'URL de support et la politique de confidentialité doivent déjà être en ligne avant la soumission

3. Qualité des détails de confidentialité et de la revue

  • Les déclarations de confidentialité doivent correspondre à ce que vos SDK collectent réellement
  • L'information de contact de l'App Review et les notes doivent être complètes lors de la première soumission
  • Les informations de démonstration doivent rester valides pendant toute la fenêtre de revue

4. Préparation de la soumission

  • Apple updates minimum SDK requirements regularly, so confirm the current deadline before uploading a release build
  • TestFlight est le lieu le plus sûr pour vérifier le chemin exact du réviseur avant de soumettre

Meilleures Pratiques pour le Plugin d'Achats Natives

Sous-titre « Meilleures Pratiques pour le Plugin d'Achats Natives »

Mettre en œuvre un Traitement d'Erreurs Correct

Sous-titre « Mettre en œuvre un Traitement d'Erreurs Correct »
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string) {
try {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
productType: PURCHASE_TYPE.SUBS,
});
// Success
await validateReceiptOnServer(transaction.receipt);
showSuccess('Subscription activated!');
unlockFeatures();
} catch (error: any) {
// Handle specific error cases
if (error.code === 'USER_CANCELLED') {
// User cancelled - don't show error
console.log('Purchase cancelled by user');
} else if (error.code === 'PAYMENT_PENDING') {
showInfo('Payment is pending. Please check back later.');
} else if (error.code === 'PRODUCT_ALREADY_PURCHASED') {
// Restore instead
await NativePurchases.restorePurchases();
} else {
// Show user-friendly error
showError('Unable to complete purchase. Please try again.');
}
}
}
function PurchaseButton({ productId }: { productId: string }) {
const [loading, setLoading] = useState(false);
const handlePurchase = async () => {
setLoading(true);
try {
await NativePurchases.purchaseProduct({ productIdentifier: productId });
} finally {
setLoading(false);
}
};
return (
<button onClick={handlePurchase} disabled={loading}>
{loading ? 'Processing...' : 'Subscribe Now'}
</button>
);
}
function SubscriptionTerms() {
return (
<div className="terms">
<p>
Subscription automatically renews unless cancelled at least 24 hours
before the end of the current period.
</p>
<p>
Your account will be charged for renewal within 24 hours prior to
the end of the current period.
</p>
<p>
Subscriptions may be managed by the user and auto-renewal may be
turned off in Account Settings after purchase.
</p>
<p>
<a href="/terms">Terms of Service</a> |
<a href="/privacy/">Privacy Policy</a>
</p>
</div>
);
}
  1. Lisez attentivement le rejet

    • Notez la règle spécifique citée (par exemple, 3.1.1, 5.1.1)
    • Comprenez exactement ce que Apple a signalé
  2. Réparez le problème de manière approfondie

    • N'appliquez pas juste une correction - réparez la cause racine
    • Testez la correction de manière exhaustive
    • Documentez les changements que vous avez apportés
  3. Répondre dans le Centre de résolution des problèmes

    Thank you for your feedback. I have addressed the issue:
    Issue: Subscription pricing not clear upfront
    Fix: Added explicit pricing display on subscription selection
    screen showing "$9.99/month" before purchase button. Also added
    cancellation instructions on the same screen.
    The changes are in this submission and can be tested using the
    provided test account.
  4. Résubmitter rapidement

    • Les résubmissions sont généralement examinées plus rapidement
    • Généralement dans les 24 heures

Si vous pensez que la réjection est incorrecte :

Procédure de clarification de l'App Store

  1. Cliquez sur « Appel » dans App Store Connect
  2. Fournir des preuves claires :
    • Captures d'écran montrant le respect des normes
    • Références aux lignes directrices spécifiques
    • Explication de la manière dont vous respectez les exigences
  3. Soyez professionnel et factuel
  4. Incluez un compte de test si la fonctionnalité est difficile à trouver

Exemple de demande de documents

Si vous rencontrez toujours des problèmes :

Vous avez du mal avec la revue de l'application ou avez besoin d'une assistance personnalisée ? Réservez un appel de consultation avec notre équipe pour un soutien dédié avec :

  • Révision et optimisation de l'implémentation de IAP
  • Préparation et stratégie de la revue de l'App Store
  • Révision du checklist de soumission
  • Résolution de rejets et recours
  • Validation et test complets

Nos experts ont aidé avec succès des centaines d'applications à passer la revue !

Continuez de la section intitulée « Continuez de la revue des lignes directrices de l'App Store pour IAP »

Si vous utilisez

Lignes directrices de revue de l'App Store pour IAP iOS App Store Review Guidelines for IAP pour planifier l'approbation et la distribution de l'application, connectez-l’à En utilisant @capgo/achats-natifs pour la capacité native dans En utilisant @capgo/achats-natifs, @capgo/capacitor-avis-de-l'utilisateur pour le détail d'implémentation dans @capgo/capacitor-avis-de-l'utilisateur, En utilisant @capgo/capacitor-avis-de-l'utilisateur pour la capacité native dans En utilisant @capgo/capacitor-avis-de-l'utilisateur, @capgo/capacitor-marché-natif pour le détail d'implémentation dans @capgo/capacitor-marché-natif, et En utilisant @capgo/capacitor-marché-natif pour la capacité native dans En utilisant @capgo/capacitor-marché-natif.