Guías de revisión de la App Store de iOS para IAP
Copia un prompt de configuración con los pasos de instalación y la guía completa en markdown para este plugin.
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.

Antes de enviar
Sección titulada “Antes de enviar”Completa la configuración en App Store Connect
Sección titulada “Finalizar la configuración en App Store Connect”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
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) y2048 x 2732(12.9 pulgadas) - No estires capturas de iPhone para simular soporte en iPad
Simula el flujo del revisor en TestFlight
Sección titulada “Simula el proceso del revisor en TestFlight”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
Requisitos de compras in-app
Sección titulada “Requisitos de In-App Purchase”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. :::
Presentación del plan de suscripción
Sección titulada “Presentación del plan de suscripción”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

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> );}Restaurar compras
Sección titulada “Restaurar compras”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>Motivos comunes de rechazo
Sección titulada “Motivos comunes de rechazo”1. Crashes o fallos de funcionalidad
Sección titulada “1. Crashes o fallos de funcionalidad”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
2. Discrepancias en metadatos
Sección titulada “2. Metadata Mismatches”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

Prevención:
// Document exactly what's in each tierconst 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 description3. 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:
<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>4. Marketing engañoso
Sección titulada “4. Marketing engañoso”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!”)


Prevención:
- Sé específico y objetivo en las descripciones
- Evita superlativos sin evidencia
- No presiones a los usuarios con falsa escasez
5. Proceso de cancelación oculto
Sección titulada “5. Proceso de cancelación oculto”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 cancellationfunction 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();}Privacidad y uso de datos (Sección 5.1.1)
Sección titulada “Privacidad y uso de datos (Sección 5.1.1)”Apple ha endurecido significativamente los requisitos de privacidad en 2025.
Divulgaciones obligatorias
Sección titulada “Divulgaciones obligatorias”Para cada permiso:
- Por qué lo necesitas (caso de uso específico)
- Cuándo se utilizará
- Cómo se almacenan o comparten los datos
- Si es opcional o requerido
Ejemplo: Flujo de permisos correcto
Sección titulada “Ejemplo: Flujo de permisos correcto”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';}Etiquetas de privacidad
Sección titulada “Privacy Nutrition Labels”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
Sección titulada “Checklist previo al envío”
-
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
-
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
-
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
-
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
-
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
-
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
-
Escribe notas de revisión detalladas
Contact:Name: Jane DeveloperEmail: review@yourapp.comPhone: +1 555-0100Test Account:Email: reviewer@test.comPassword: TestPass123!This account does not expire during review.Testing Instructions:1. Log in with test account above2. Tap "Upgrade to Premium" button3. Select "Monthly Premium" subscription4. Complete purchase (no charge in sandbox)5. Verify premium features unlockNote: Subscription pricing is clearly shown before purchase.Cancellation instructions are in Settings > Account.
Cronograma de revisión
Sección titulada “Review Timeline”
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 ReviewIn ReviewPending Developer ReleaseRejected
Enfoque de envíos para 2026
Sección titulada “2026 Submission Focus”Áreas de enfoque actuales
Sección titulada “Current Focus Areas”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”Implementa un manejo de errores adecuado
Sección titulada “Implementa un manejo de errores adecuado”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.'); } }}Muestra estados de carga
Sección titulada “Muestra estados de carga”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> );}Muestra los términos con claridad
Sección titulada “Muestra los términos con claridad”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> );}Si rechazan tu app
Sección titulada “Si tu app es rechazada”Pasos para resolverlo
Sección titulada “Pasos para resolverlo”-
Lee el rechazo con atención
- Anota la directriz específica citada (ej. 3.1.1, 5.1.1)
- Entiende exactamente qué marcó Apple
-
Corrige el problema a fondo
- No solo pongas un parche: soluciona la causa raíz
- Testea la solución exhaustivamente
- Documenta qué cambios realizaste
-
Responde en el Resolution Center
Thank you for your feedback. I have addressed the issue:Issue: Subscription pricing not clear upfrontFix: Added explicit pricing display on subscription selectionscreen showing "$9.99/month" before purchase button. Also addedcancellation instructions on the same screen.The changes are in this submission and can be tested using theprovided test account. -
Reenvía cuanto antes
- Los reenvíos suelen revisarse más rápido
- Normalmente, dentro de 24 horas
Proceso de apelación
Sección titulada “Proceso de apelación”Si crees que el rechazo es incorrecto:

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

Recursos adicionales
Sección titulada “Recursos adicionales”- Guías de revisión de la Apple App Store
- Guías de compras in-app
- Buenas prácticas para suscripciones
- Ayuda de App Store Connect
- Especificaciones de capturas de pantalla
- Información de la versión de la plataforma
Soporte
Sección titulada “Soporte”Si sigues teniendo problemas:
- Revisa la Documentación de Native Purchases
- Verificar problemas comunes de resolución
- Contacta con Apple Developer Support para dudas sobre guidelines
¿Necesitas ayuda experta?
Sección titulada “¿Necesitas ayuda experta?”¿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!
Sigue las iOS App Store Review Guidelines para IAP
Sección: “Sigue adelante con las iOS App Store Review Guidelines para IAP”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.»