Saltar al contenido

Guías de revisión de la App Store de iOS para IAP

GitHub

Lograr que tu app sea aprobada en el App Store requiere seguir con cuidado las guías de Apple, especialmente al implementar compras in-app y suscripciones. Esta guía cubre todo lo necesario para pasar la revisión en tu primer envío.

Proceso de revisión de la App Store en iOS

Antes de que Apple revise tu flujo de compra, asegúrate de que el registro de la app esté completo:

  • Añade una URL de la Política de Privacidad en App Store Connect
  • Añade una URL de soporte que dirija a información de contacto real
  • Completa el cuestionario de clasificación por edad para poder publicar la app
  • Añadir Datos de contacto para la revisión de la app y notas claras para el revisor
  • Si requiere login, proporciona una cuenta demo que no expire durante la revisión
Metadatos del App Store con enlaces de política y soporte

Prepara capturas de pantalla reales

Sección: “Prepara capturas de pantalla reales”
  • Usa capturas actuales del build real que está en revisión
  • Para iPhone, 1290 x 2796 (6.7 pulgadas) es el tamaño predeterminado más sencillo
  • Si tu app funciona en iPad, sube también capturas de iPad
  • Los tamaños de iPad aceptados actualmente incluyen 2064 x 2752 (13 pulgadas) y 2048 x 2732 (12.9 pulgadas)
  • No estires capturas de iPhone para simular soporte en iPad

Ejecuta la ruta exacta que seguirá Apple en un dispositivo real:

  • Instala la última build desde TestFlight
  • Inicia sesión con la cuenta de revisión que vas a proporcionar
  • Llega al paywall sin gestos ocultos ni menús de debug
  • Flujos de compra, restauración y gestión de suscripciones
  • Verifica que la app funcione bien si se deniegan permisos

Transparencia de precios (crítica)

Sección: “Transparencia de precios (Crítico)”

Apple exige una divulgación de precios totalmente clara antes de cualquier compra:

Elementos obligatorios:

  • Mostrar el precio exacto antes del botón de compra
  • Mostrar la frecuencia de facturación (ej. “$9.99/mes”)
  • Indicar claramente qué recibe el usuario por su dinero
  • Indicar cuándo se realizarán los cargos

Rechazo común:

“El precio de la suscripción debe ser claro y directo.”

:::caution Consistencia de precios Todos los precios deben coincidir en:

  • Metadatos de la App Store
  • Pantallas de compra in-app
  • Pantallas de gestión de suscripciones

Incluso una discrepancia de $1 entre la tienda ($4.99) y la app ($5.99) provocará el rechazo automático. :::

Información obligatoria:

  • Todos los niveles de suscripción disponibles mostrados juntos
  • Comparativa clara de funciones por nivel
  • Sin selección automática de planes premium mediante trucos de UI
  • Instrucciones de cancelación fáciles de localizar

Qué hacer y qué no en el diseño de la UI

Paywall con restauración de compras y enlaces legales

Ejemplo de UI conforme a las reglas:

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>
);
}

Implementación obligatoria:

Toda app con IAP debe permitir a los usuarios restaurar compras previas sin contactar a soporte.

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>

Por qué falla:

  • La app crashea al iniciar
  • El flujo de compra no se completa
  • Las funciones de las capturas no funcionan

Prevención:

  • Prueba en dispositivos reales (no solo simuladores)
  • Test all subscription flows end-to-end
  • Verifica que la validación de recibos funcione
  • Revisa el manejo de errores de red

Por qué falla:

  • Las capturas muestran funciones que no están en el build actual
  • La descripción menciona funciones que no existen
  • El precio en los metadatos no coincide con el precio in-app

Checklist de metadatos

Prevención:

// 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

3. Falta de explicación de permisos

Sección: “3. Explicaciones de permisos faltantes”

Por qué falla:

  • Pedir cámara/ubicación/salud sin explicación
  • Permisos ocultos tras varias pantallas
  • Descripciones de permisos vagas o genéricas

Prevención:

Actualiza tu Info.plist con explicaciones claras:

Texto de permiso demasiado vago para la revisión Texto de permiso con explicaciones más claras
<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>

Por qué falla:

  • Afirmaciones como “la app #1 del mundo” sin pruebas
  • Funciones “ilimitadas” que tienen límites ocultos
  • Tácticas de urgencia falsa (“¡Solo quedan 2 plazas!”)

Ejemplos de guías de descripción

Guías de descripción adicionales

Prevención:

  • Sé específico y objetivo en las descripciones
  • Evita superlativos sin evidencia
  • No presiones a los usuarios con falsa escasez

Por qué falla:

  • No se menciona cómo cancelar
  • Botón de cancelación oculto o difícil de ver
  • Proceso de cancelación de varios pasos sin el flujo nativo de Apple

Prevención:

// 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();
}

Apple ha endurecido significativamente los requisitos de privacidad en 2025.

Para cada permiso:

  1. Por qué lo necesitas (caso de uso específico)
  2. Cuándo se utilizará
  3. Cómo se almacenan o comparten los datos
  4. Si es opcional o requerido
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';
}

Asegúrate de que las etiquetas de privacidad de la App Store reflejen con precisión:

  • Recopilación del historial de compras
  • Direcciones de email (para recibos)
  • Device IDs (para prevención de fraude)
  • Datos de uso (para analytics)

Las etiquetas de privacidad incorrectas son un motivo común de rechazo en 2025. Audita tu recolección de datos con cuidado.

Checklist previo al envío

  1. Probar todos los flujos de compra

    • Comprar cada nivel de suscripción
    • Probar periodos de prueba gratuitos
    • Verificar que las ofertas de introducción apliquen bien
    • Probar la restauración de compras
    • Verificar Family Sharing (si está activo)
    • Prueba en varios dispositivos
  2. Verificar la consistencia de precios

    • Check App Store metadata matches in-app prices
    • Verificar que todas las divisas sean correctas
    • Confirm free trial durations match descriptions
    • Check introductory offer terms are accurate
  3. Revisar todo el copy

    • Eliminar texto de relleno
    • Verificar que los claims sean testeables
    • Revisar gramática y ortografía
    • Ensure descriptions match current build
    • Eliminar menciones a la competencia
  4. Testear permisos

    • Solicitar solo los permisos necesarios
    • Mostrar explicaciones claras antes de solicitar
    • Testear flujos de “Deny” (la app debe seguir funcionando)
    • Verificar que las descripciones en Info.plist sean claras
  5. Preparar cuenta de prueba

    • Crea una cuenta de prueba válida para la revisión
    • Documenta las credenciales en la información de App Review
    • Verifica que el revisor acceda al paywall y complete la compra
    • Añade cuentas extra o switches en el campo Notes si es necesario
  6. Revisa los metadatos

    • Las capturas coinciden con la UI actual
    • La URL de soporte tiene información de contacto real
    • La URL de la política de privacidad está completa
    • La clasificación de edad coincide con el contenido del build
    • El video de preview muestra la versión actual
    • La descripción detalla correctamente las funciones
    • La política de privacidad es accesible en la app y en la tienda
  7. Escribe notas de revisión detalladas

    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.

Cronología de la revisión en App Store

Revisión estándar: 24-48 horas Periodos pico: 3-5 días (lanzamientos en festivos) Fines de semana: Sin revisiones procesadas Revisión acelerada: Disponible para correcciones críticas (vía App Store Connect)

Estados comunes que verás en App Store Connect:

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

1. Claridad en las suscripciones

  • Se requiere comparar los planes lado a lado
  • Sin “dark patterns” que oculten opciones más baratas
  • Rutas claras de downgrade/upgrade

2. Precisión de los metadatos

  • Las capturas deben coincidir con el build revisado
  • Se requieren capturas de iPad si el soporte está activo
  • La URL de soporte y la política de privacidad deben estar activas

3. Calidad de privacidad y detalles de revisión

  • Las declaraciones de privacidad deben coincidir con lo que recolectan tus SDKs
  • La info de contacto y notas de App Review deben estar completas
  • Las credenciales de demo deben ser válidas durante toda la revisión

4. Preparación para el envío

  • Apple actualiza los requisitos de SDK seguido; confirma el deadline antes de subir un release build
  • TestFlight es el lugar más seguro para verificar el flujo de revisión antes de enviar

Buenas prácticas para el plugin Native Purchases

Sección titulada “Buenas prácticas para el plugin Native Purchases”
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. Lee el rechazo con atención

    • Anota la directriz específica citada (ej. 3.1.1, 5.1.1)
    • Entiende exactamente qué marcó Apple
  2. Corrige el problema a fondo

    • No solo pongas un parche: soluciona la causa raíz
    • Testea la solución exhaustivamente
    • Documenta qué cambios realizaste
  3. Responde en el Resolution Center

    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. Reenvía cuanto antes

    • Los reenvíos suelen revisarse más rápido
    • Normalmente, dentro de 24 horas

Si crees que el rechazo es incorrecto:

Proceso de aclaración de la App Store

  1. Haz clic en “Apelar” en App Store Connect
  2. Aporta pruebas claras:
    • Capturas que demuestren el cumplimiento
    • Referencias a directrices específicas
    • Explicación de cómo cumples los requisitos
  3. Sé profesional y objetivo
  4. Incluye una cuenta de prueba si la función es difícil de hallar

Ejemplo de solicitud de documentos

Si sigues teniendo problemas:

¿Tienes problemas con la revisión de tu app o necesitas ayuda personalizada? Reserva una consultoría con nuestro equipo para soporte especializado en:

  • Revisión y optimización de IAP
  • Estrategia y preparación para App Store
  • Lista de revisión para el envío
  • Resolución de rechazos y apelaciones
  • Pruebas y validación completas

¡Nuestros expertos han ayudado a cientos de apps a pasar la revisión!

Si estás usando iOS App Store Review Guidelines para IAP para planificar la aprobación y distribución en la tienda, conéctalo con Uso de @capgo/native-purchases para la capacidad nativa al usar @capgo/native-purchases, @capgo/capacitor-in-app-review para el detalle de implementación en @capgo/capacitor-in-app-review, Usando @capgo/capacitor-in-app-review para la capacidad nativa en «Usando @capgo/capacitor-in-app-review», @capgo/capacitor-native-market para el detalle de implementación en @capgo/capacitor-native-market, y Usando @capgo/capacitor-native-market para la capacidad nativa en «Usando @capgo/capacitor-native-market.»