Saltar al contenido

Obtener la aprobación de su aplicación en App Store requiere prestar especial atención a las pautas de Apple, especialmente al implementar suscripciones y compras dentro de la aplicación. Esta guía cubre todo lo que necesita saber para pasar la revisión en su primer envío.

iOS App Store Proceso de revisión

Requisitos de compra dentro de la aplicación

Section titled “Requisitos de compra dentro de la aplicación”

Apple requiere una divulgación clara de los precios antes de cualquier compra:

Elementos imprescindibles:

  • Mostrar el precio exacto antes del botón de compra.
  • Mostrar frecuencia de facturación (por ejemplo, “$9,99/mes”)
  • Indique claramente lo que los usuarios obtienen por su dinero.
  • Indique cuándo se producirán los cargos.

Rechazo común:

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

:::precaución Consistencia de precios Todos los precios deben coincidir en:

  • App Store listado de metadatos
  • Pantallas de compra dentro de la aplicación
  • Pantallas de gestión de suscripciones.

Even a $1 discrepancy between store listing ($4.99) and app ($5.99) will trigger automatic rejection. :::

Divulgaciones requeridas:

  • All available subscription tiers displayed together
  • Comparación clara de funciones por nivel
  • No se puede acceder automáticamente a niveles premium mediante trucos de interfaz de usuario
  • Instrucciones de cancelación fáciles de localizar

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

Ejemplo de interfaz de usuario compatible:

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 requerida:

Every app with IAP must provide a way for users to restore previous purchases without contacting 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>

Por qué falla:

  • La aplicación falla al iniciarse
  • El flujo de compra no se completa
  • Las funciones que se muestran en las capturas de pantalla no funcionan

Prevención:

  • Prueba en dispositivos reales (no solo simuladores)
  • Pruebe todos los flujos de suscripción de un extremo a otro
  • Verificar los trabajos de validación de recibos.
  • Verificar el manejo de errores de red

Por qué falla:

  • Las capturas de pantalla muestran funciones que no están en la versión actual.
  • Description mentions functionality that doesn’t exist
  • Pricing in metadata differs from in-app pricing

Lista de verificación 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

Por qué falla:

  • Requesting camera/location/health without explanation
  • Permission requests buried multiple screens deep
  • Descripciones de permisos vagas o genéricas

Prevención:

Update your Info.plist with clear explanations:

<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 “aplicación número uno del mundo” sin pruebas
  • Funciones “ilimitadas” que tienen límites ocultos
  • Tácticas de urgencia falsas (“¡Solo quedan 2 lugares!”)

Description Guidelines Examples

Additional Description Guidelines

Prevención:

  • Sea específico y objetivo en las descripciones.
  • Evite los superlativos sin evidencia
  • No presiones a los usuarios con una escasez falsa.

Por qué falla:

  • No se menciona cómo cancelar
  • Botón de cancelación oculto u oscurecido
  • Multi-step cancellation process without Apple’s native flow

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();
}
```## Privacidad y uso de datos (Sección 5.1.1)
Apple ha endurecido significativamente los requisitos de privacidad en 2025.
### Divulgaciones requeridas
**Para cada permiso:**
1. Por qué lo necesitas (caso de uso específico)
2. Cuándo se utilizará
3. Cómo se almacenan/comparten los datos
4. Si es opcional o obligatorio
### Ejemplo: flujo de permisos adecuado
```typescript
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úrese de que sus App Store etiquetas de privacidad reflejen con precisión:

  • Colección de historial de compras.
  • Direcciones de correo electrónico (para recibos)
  • ID de dispositivos (para prevención de fraude)
  • Datos de uso (para análisis)

Las etiquetas de privacidad inexactas serán un motivo de rechazo común en 2025. Audite cuidadosamente su recopilación de datos.

Lista de verificación previa al envío

  1. Pruebe todos los flujos de compra

    • Compre cada nivel de suscripción
    • Pruebe pruebas gratuitas
    • Verificar que las ofertas de lanzamiento se apliquen correctamente
    • Prueba de compras de restauración
    • Verificar Compartir en familia (si está habilitado)
    • Prueba en múltiples dispositivos
  2. Verificar la coherencia de los precios

    • Verifique que App Store metadatos coincidan con los precios en la aplicación
    • Verifique que todas las monedas sean correctas
    • Confirmar las duraciones de las pruebas gratuitas que coincidan con las descripciones
    • Verifique que los términos de la oferta introductoria sean precisos
  3. Revisar todas las copias

    • Eliminar texto de marcador de posición
    • Verificar que las afirmaciones sean comprobables
    • Revisar gramática y ortografía.
    • Asegúrese de que las descripciones coincidan con la versión actual.
    • Eliminar menciones de la competencia.
  4. Permisos de prueba

    • Solicitar sólo los permisos necesarios
    • Mostrar explicaciones claras antes de realizar la solicitud.
    • Pruebe los flujos “Denegar” (la aplicación aún debería funcionar)
    • Verifique que las descripciones de Info.plist sean claras
  5. Preparar cuenta de prueba

    • Crear cuenta de prueba de zona de pruebas
    • Documentar las credenciales de inicio de sesión en las notas de revisión de la aplicación.
    • Verificar que la cuenta de prueba tenga una suscripción activa
    • Pruebe que el revisor pueda completar el flujo de compra.
  6. Verificar metadatos

    • Las capturas de pantalla coinciden con la interfaz de usuario actual
    • El video de vista previa de la aplicación (si corresponde) muestra la versión actual
    • La descripción describe con precisión las características
    • La clasificación por edades coincide con el contenido.
    • Se puede acceder a la política de privacidad desde la aplicación
  7. Escriba notas de revisión detalladas

    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    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.

App Store Cronograma de revisión

Revisión estándar: 24-48 horas Períodos pico: 3-5 días (App Store lanzamientos de días festivos) Fines de semana: No se procesan reseñas Revisión acelerada: Disponible para correcciones de errores críticos (solicitud a través de App Store Connect)

Actualizaciones de las directrices de 2025

Section titled “Actualizaciones de las directrices de 2025”

1. Divulgación de funcionalidad de IA Si su aplicación utiliza IA para alguna función, debe:

  • Etiquetar claramente el contenido generado por IA
  • Explicar cómo se utiliza la IA.
  • Medidas de seguridad del contenido del documento.

2. Claridad de suscripción mejorada

  • Se requieren comparaciones de planes en paralelo
  • No hay “patrones oscuros” que oculten opciones más baratas
  • Borrar rutas de degradación/actualización

3. Intensificación de la privacidad

  • Se aumentó la aplicación de la Sección 5.1.1.
  • Más escrutinio sobre la justificación de la recopilación de datos.
  • Requisitos más estrictos para las aplicaciones infantiles.

Qué cambió desde 2024- Ahora se permiten envíos modulares (actualice las páginas de productos de forma independiente)

Section titled “Qué cambió desde 2024- Ahora se permiten envíos modulares (actualice las páginas de productos de forma independiente)”
  • Los eventos dentro de la aplicación se pueden enviar por separado
  • Aplicación más estricta de las IU de suscripción engañosas
  • Nueva orientación sobre aplicaciones de criptomonedas/NFT

Mejores prácticas para el complemento de compras nativas

Section titled “Mejores prácticas para el complemento de compras nativas”
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. Lea atentamente el rechazo

    • Tenga en cuenta la directriz específica citada (p. ej., 3.1.1, 5.1.1)
    • Comprenda exactamente lo que marcó Apple
  2. Solucione el problema a fondo

    • No se limite a parchear: solucione la causa raíz
    • Pruebe la solución exhaustivamente
    • Documenta lo que cambiaste
  3. Responder en el Centro de resoluciones

    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. Vuelva a enviarlo de inmediato

    • Los nuevos envíos suelen revisarse más rápido
    • Generalmente dentro de las 24 horas

Si cree que el rechazo es incorrecto:

App Store Proceso de Aclaración

  1. Haga clic en “Apelar” en App Store Connect
  2. Proporcionar pruebas claras:
    • Capturas de pantalla que muestran el cumplimiento
    • Referencias a directrices específicas
    • Explicación de cómo cumples los requisitos.
  3. Sea profesional y objetivo
  4. Incluya una cuenta de prueba si es difícil encontrar la funcionalidad

Ejemplo de solicitud de documentos

Si todavía tienes problemas:

¿Tiene problemas con la revisión de la aplicación o necesita asistencia personalizada? Reserve una llamada de consulta con nuestro equipo para obtener asistencia dedicada con:

  • Revisión y optimización de la implementación de IAP.
  • App Store revisión de preparación y estrategia
  • Revisión de la lista de verificación de envío
  • Resolución de rechazo y recursos
  • Pruebas y validación completas.

¡Nuestros expertos han ayudado con éxito a cientos de aplicaciones a pasar la revisión!