Sauter au contenu

Directives de Revue de l'App Store iOS pour les Achats In-App

GitHub

Processus de revue de l'App Store iOS

Pour configurer avec l'IA, veuillez suivre les étapes ci-dessous.

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

  • Ajoutez un URL de la politique de confidentialité dans App Store Connect
  • Ajoutez un URL de support qui mène à des informations de contact réelles pour les utilisateurs
  • Terminez la configuration note d'âge questionnaire pour que l'application soit publiable
  • Ajouter détails de contact de la revue d'application et notes de réviseur claires
  • Si un connexion est requise, fournir un compte de démonstration qui ne expire pas pendant la revue
Méta-données de la liste d'application de l'App Store avec des liens de politique et de support
  • Utilisez les captures d'écran actuelles provenant de la version de l'application en cours de revue
  • Pour iPhone, 1290 x 2796 (6,7 pouces) est la taille par défaut la plus facile à utiliser
  • Si votre application fonctionne sur iPad, téléchargez également les captures d'écran iPad
  • Les tailles d'écran iPad acceptées incluent 2064 x 2752 (13 pouces) et 2048 x 2732 (12,9 pouces)
  • N'agrandissez jamais les captures d'écran iPhone pour simuler la compatibilité iPad

Effectuez une simulation de parcours du Reviewer dans TestFlight

Section intitulée « Effectuez une simulation de parcours du Reviewer dans TestFlight »

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

  • Installez la dernière version depuis TestFlight
  • Connectez-vous avec le compte de revue que vous prévoyez de fournir
  • Parvenez à la barrière payante sans gestes cachés ou menus de débogage
  • Flux de paiement, 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 tout achat :

Éléments obligatoires :

  • Affichez le prix exact avant le bouton d'achat
  • Afficher la fréquence de facturation (par exemple, « 9,99 €/mois »)
  • Déclarer clairement ce que les utilisateurs obtiennent pour leur argent
  • Indiquer quand les factures seront émises

Rejet commun :

« Le tarification des abonnements doit être claire et explicite. »

:::attention Cohérence des prix Tous les prix doivent correspondre à :

  • Liste de métadonnées de l'App Store
  • Écrans d'achat en application
  • Écrans de gestion des abonnements

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

Informations requises :

  • Tous les niveaux de souscription disponibles affichés ensemble
  • Comparaison claire des fonctionnalités par niveau
  • Pas de redirige vers les niveaux premium par des ruses de l'interface utilisateur
  • Instructions de résiliation faciles à trouver

Conseils de conception de l'interface utilisateur

Paywall avec restauration d'achats et liens juridiques

Exemple de conception conforme à la norme :

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 :

Tout application avec IAP doit fournir un moyen 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>

Pourquoi cela ne fonctionne pas :

  • L'application s'arrête lors du lancement
  • La progression d'achat ne se termine pas
  • Les fonctionnalités montrées dans les captures d'écran ne fonctionnent pas

Prévention :

  • Tester sur des appareils réels (et non seulement des simulateurs)
  • Testez tous les flux d'abonnement de bout en bout
  • Vérifiez la validation de la réception
  • Vérifiez la gestion des erreurs de réseau

Pourquoi cela ne fonctionne pas :

  • Les captures d'écran montrent des fonctionnalités qui ne sont pas dans la dernière version
  • La description mentionne des fonctionnalités qui n'existent 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 :

  • Demande de caméra/emplacement/santé sans explication
  • Demandes de permissions enterrées plusieurs écrans plus loin
  • Descriptions de permissions vagues ou génériques

Prévention :

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

Copie de permission trop vague pour examen 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 n°1 au monde » sans preuve
  • Des « fonctionnalités illimitées » avec des limites cachées
  • Des tactiques d'urgence fausses (« Seulement 2 places restantes ! »)

Exemples de lignes directrices de description

Lignes directrices supplémentaires de description

Prévention :

  • Sois spécifique et factuel dans tes descriptions
  • Évite les superlatifs sans preuve
  • N'oblige pas les utilisateurs avec de la fausse pénurie

Pourquoi cela ne fonctionne pas :

  • Pas de 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 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. Lorsqu'il sera utilisé
  3. Comment les données sont stockées/échangées
  4. S'agit-il 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 les étiquettes de confidentialité de votre magasin d'applications reflètent avec précision :

  • Collecte d'historique d'achat
  • Adresses e-mail (pour les factures)
  • 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. Auditez soigneusement la collecte de vos données.

Liste de vérification pré-submission

Liste de vérification pré-submission

Testez tous les flux d'achat

  1. Achetez chaque niveau de souscription

    • Testez les essais gratuits
    • Vérifiez que les offres d'introduction s'appliquent correctement
    • Vérifiez que les offres d'introduction s'appliquent correctement
    • Testez la restauration des achats
    • Vérifiez la partage familial (si activé)
    • Testez sur plusieurs appareils
  2. Vérifiez la cohérence des tarifs

    • Vérifiez que les métadonnées de l'App Store correspondent aux prix en application
    • Vérifiez que tous les devises sont corrects
    • Confirmez que les durées des essais gratuits correspondent aux descriptions
    • Vérifiez que les termes des offres d'introduction sont précis
  3. Révisez Tous les Textes

    • Supprimez le texte de remplacement
    • Vérifiez que les revendications sont testables
    • Vérifiez la grammaire et l'orthographe
    • Assurez-vous que les descriptions correspondent à la version actuelle
    • Supprimer les mentions des concurrents
  4. Tester les autorisations

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

    • Créer un compte de revue qui reste valide pendant la revue
    • Documenter les informations de connexion dans les informations de revue de l'application
    • Vérifier que le réviseur peut atteindre la barrière payante et terminer le flux de paiement
    • Inclure 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. Écrivez des notes de révision 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.

Calendrier de revue de l'App Store

Révue 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 Révue accélérée : Disponible pour les correctifs critiques de bogues (demande 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
  • Aucun schéma de « dark patterns » qui masque les options moins chères
  • Chemins de dégradation/ d'amélioration clairs

2. Exactitude des métadonnées

  • Captures d'écran doivent correspondre à la version de build examinée
  • Captures d'écran iPad sont requises si le support iPad est activé
  • L'URL de support et la politique de confidentialité devraient déjà être en ligne avant la soumission

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

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

4. Préparation de la soumission

  • Apple met à jour régulièrement les exigences minimales SDK, confirmez donc la date limite actuelle avant de télécharger une version de mise en production
  • 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 natifs

Section intitulée « Meilleures pratiques pour le plugin d'achats natifs »
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 ligne directrice spécifique citée (par exemple, 3.1.1, 5.1.1)
    • Comprenez exactement ce que Apple a signalé
  2. Réparez l'incident de manière approfondie

    • N'appliquez pas juste une correction - réparez la cause racine
    • Testez la correction de manière approfondie
    • Documentez les modifications apportées
  3. Répondez dans le Centre de Résolution

    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ésubmittez rapidement

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

Si vous pensez que le rejet est incorrect :

Processus de clarification de l'App Store

  1. Cliquez sur « Appel » dans App Store Connect
  2. Fournissez des preuves claires :
    • Captures d'écran montrant le respect des exigences
    • Références à des lignes directrices spécifiques
    • Explication de la manière dont vous remplissez 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 la facturation IAP
  • préparation et stratégie de revue de l'App Store
  • révision du checklist de soumission
  • résolution de rejets et appels
  • Validation et test complets

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

Continuez de la section intitulée « Continuez de la section iOS App Store Review Guidelines pour IAP »

Section intitulée « Continuez de la section iOS App Store Review Guidelines pour IAP »

Si vous utilisez iOS App Store Review Guidelines pour IAP pour planifier l'approbation et la distribution de l'application, connectez-le à En utilisant @capgo/native-purchases pour la capacité native dans En utilisant @capgo/native-purchases, En utilisant @capgo/capacitor-in-app-review pour le détail d'implémentation dans En utilisant @capgo/capacitor-in-app-review, En utilisant @capgo/capacitor-in-app-review pour la capacité native dans Utiliser @capgo/capacitor-en-revue-de-l'application @capgo/capacitor-marché-natif pour le détail d'implémentation dans @capgo/capacitor-marché-natif, et Utiliser @capgo/capacitor-marché-natif pour la capacité native dans Utiliser @capgo/capacitor-marché-natif