Controla los mensajes de App Store en el SDK de iOS
A veces App Store necesita mostrar a tus usuarios un mensaje sobre su suscripción: pedirles que acepten un aumento de precio, informarles de un problema de facturación o presentarles una oferta de recuperación. Por defecto, StoreKit muestra estos mensajes por su cuenta mientras la app está abierta, incluso encima de un paywall, un onboarding o una pantalla de pago.
Para elegir tú el momento, cambia el SDK a gestión manual de mensajes. El SDK añade entonces cada mensaje a una lista pendiente, y tu app muestra esa lista cuando llama a showStoreMessages.
En el modo manual, StoreKit no muestra mensajes por sí solo. Si tu app nunca llama a showStoreMessages, los usuarios nunca verán una solicitud de consentimiento de aumento de precio ni un aviso de problema de facturación.
Antes de empezar
Necesitas:
- Adapty iOS SDK 4.2 o posterior: Las versiones anteriores no tienen la API de mensajes de la store.
- iOS 16 o Mac Catalyst 16 o posterior: StoreKit no entrega mensajes a las apps en versiones anteriores, por lo que la API de mensajes de la store está marcada como disponible a partir de iOS 16. La API no está disponible en macOS.
El SDK de Adapty es compatible con iOS 15. Si tu app también es compatible con iOS 15, envuelve cada llamada a store messages en if #available(iOS 16.0, *), o marca el tipo que realiza la llamada con @available(iOS 16.0, *). Sin una de estas comprobaciones, la app no compilará. Los ejemplos de este artículo incluyen las comprobaciones. Si tu deployment target es iOS 16 o posterior, puedes omitirlas.
Habilitar la gestión manual
Para capturar los mensajes de App Store, establece storeMessagesHandling en .manual cuando actives el SDK:
let configurationBuilder = AdaptyConfiguration
.builder(withAPIKey: "YOUR_PUBLIC_SDK_KEY")
.with(storeMessagesHandling: .manual) // .auto is the default
El SDK comienza a capturar mensajes en cuanto se activa, y los mantiene en memoria durante la sesión actual de la app. Con el valor predeterminado .auto, el SDK no captura nada, y getPendingStoreMessageTypes y showStoreMessages no hacen nada.
Obtener tipos de mensajes pendientes
Para saber si hay mensajes en espera, llama a getPendingStoreMessageTypes. Devuelve los tipos de mensajes pendientes sin mostrarlos ni eliminarlos:
if #available(iOS 16.0, *) {
let pendingTypes = await Adapty.getPendingStoreMessageTypes()
if pendingTypes.contains(.billingIssue) {
// For example, skip the upsell and show the billing message first
}
}
Cada mensaje tiene uno de estos tipos:
| Tipo | Mensaje |
|---|---|
.generic | Un mensaje general de App Store. |
.priceIncreaseConsent | Una solicitud de consentimiento para un aumento de precio de suscripción. |
.billingIssue | Un aviso sobre un problema de facturación de suscripción. Disponible en iOS 16.4 y versiones posteriores. |
.winBackOffer | Una oferta de recuperación elegible. Disponible en iOS 18 y versiones posteriores. |
Un tipo de mensaje que el SDK no reconoce tiene el valor sin procesar storekit_<number>.
Mostrar mensajes pendientes
Cuando tu app llega a un punto donde una pantalla del sistema no interrumpirá al usuario — por ejemplo, después de que el usuario cierra un flow o termina un onboarding — llama a showStoreMessages:
El SDK muestra los mensajes uno tras otro. Cuando StoreKit muestra un mensaje, el SDK lo elimina de la lista de pendientes. Si StoreKit no puede mostrar un mensaje, el SDK escribe el error en el log de Adapty, conserva el mensaje para la próxima llamada y continúa con los demás mensajes.
Mostrar solo algunos tipos de mensajes
Para mostrar solo algunos de los mensajes pendientes, indica los tipos en for. Los demás mensajes permanecen pendientes:
try await Adapty.showStoreMessages(
for: [.billingIssue, .priceIncreaseConsent],
using: displayStoreKitMessage
)
Sin for, el SDK muestra todos los mensajes pendientes, incluidos los tipos que no reconoce.
Errores
showStoreMessages lanza un AdaptyError con uno de estos códigos:
| Código | Nombre | Causa |
|---|---|---|
| 3201 | operationInProgress | Otra llamada a showStoreMessages sigue mostrando mensajes. Espera a que termine e inténtalo de nuevo. |
| 3202 | resolverFailure | Solo UIKit: no pasaste una escena y el SDK no encontró ninguna escena activa en primer plano. Llama al método de nuevo cuando tu app esté en primer plano, o pasa la escena de forma explícita. |
| 9000 | operationInterrupted | La tarea que llamó al método fue cancelada. |