Migrar el SDK de Adapty Unity a v. 4.0

El SDK de Adapty Unity 4.0 (beta) introduce los flows y renombra las APIs de paywall en consecuencia. Las nuevas APIs funcionan tanto con el nuevo Flow Builder como con el Paywall Builder existente — no se requieren cambios de configuración en el Adapty Dashboard.

Referencia rápida

v3v4
Adapty.GetPaywall(placementId, locale, ...)Adapty.GetFlow(placementId, ...)
Adapty.GetPaywallForDefaultAudience(placementId, locale, ...)Adapty.GetFlowForDefaultAudience(placementId, ...)
Adapty.GetPaywallProducts(paywall, ...)Adapty.GetPaywallProducts(flow, ...)
Adapty.LogShowPaywall(paywall, ...)Adapty.LogShowFlow(flow, ...)
AdaptyPaywallAdaptyFlow
AdaptyUI.CreatePaywallView(paywall, ...)AdaptyUI.CreateFlowView(flow, ...)
AdaptyUICreatePaywallViewParametersAdaptyUICreateFlowViewParameters
AdaptyUIPaywallViewAdaptyUIFlowView
AdaptyUI.PresentPaywallView(view, ...) / DismissPaywallView(view, ...)AdaptyUI.PresentFlowView(view, ...) / DismissFlowView(view, ...)
Adapty.SetPaywallsEventsListener(listener)Adapty.SetFlowsEventsListener(listener)
AdaptyPaywallsEventsListenerIAdaptyFlowsEventsListener
AdaptyEventListenerIAdaptyEventListener
AdaptyOnboardingsEventsListenerIAdaptyOnboardingsEventsListener
PaywallViewDidPerformAction, PaywallViewDidAppear y otros callbacks PaywallView...FlowViewDidPerformAction, FlowViewDidAppear y otros callbacks FlowView...
PaywallViewDidFailRenderingFlowViewDidReceiveError
Adapty.SetFallbackPaywalls(...) (obsoleto en v3)eliminado — usa Adapty.SetFallback(fileName, ...)
Builder.SetIDFACollectionDisabled(...) (obsoleto en v3)eliminado — usa Builder.SetAppleIDFACollectionDisabled(...)
paywall.Products (una lista de AdaptyProductReference)eliminado — usa ProductIdentifiers o VendorProductIds, o llama a GetPaywallProducts(flow) para obtener los productos completos
AdaptyProductReferenceeliminado como tipo público — consulta Modelo de datos
paywall.RemoteConfigStringeliminado — usa flow.RemoteConfig?.Data

AdaptyPaywallProduct mantiene su nombre — los productos siguen perteneciendo a un flow, y GetPaywallProducts también mantiene su nombre, ahora tomando un AdaptyFlow. Los métodos GetFlow y GetFlowForDefaultAudience ya no aceptan un parámetro locale. Las APIs de compra y perfil (MakePurchase, RestorePurchases, GetProfile, Identify, UpdateProfile) y los respaldos mediante SetFallback no han cambiado. Los métodos de onboarding siguen funcionando pero están obsoletos — consulta Obsolescencia de la API de Onboarding. Algunos comportamientos predeterminados han cambiado — consulta Cambios en el comportamiento predeterminado.

Instalación

v4.0 es una versión preliminar, así que fija la etiqueta beta exacta. Para instalarla mediante el Unity Package Manager, añade la etiqueta a la URL de Git:

https://github.com/adaptyteam/AdaptySDK-Unity.git?path=/Packages/com.adapty.unity-sdk#4.0.0-beta.1

Si instalas mediante el paquete de Unity, descarga adapty-unity-plugin-4.0.0-beta.1.unitypackage desde la versión 4.0.0-beta.1. Consulta Instalar el SDK de Adapty para la configuración completa.

Con v4 llegan dos cambios en la configuración de compilación:

  • Las dependencias de iOS cambian a Swift Package Manager. El SDK nativo de Adapty para iOS 4.0 se declara como un paquete remoto de Swift en lugar de un pod de CocoaPods. Actualiza el External Dependency Manager a la versión 1.2.188 o posterior — las versiones anteriores no son compatibles con las dependencias de Swift Package Manager. Los pasos de CocoaPods (iOS Resolver -> Install Cocoapods, abrir Unity-iPhone.xcworkspace) ya no aplican.
  • El destino de despliegue de iOS debe ser 15.0 o posterior. Un nuevo validador de compilación en el Unity Editor detiene la compilación para iOS si el destino es inferior.

Las versiones nativas del SDK de Adapty se actualizan a la 4.x en ambas plataformas y se resuelven automáticamente; no se necesitan cambios adicionales en la compilación.

Recuperar flows

GetPaywall → GetFlow

El tipo devuelto cambia de AdaptyPaywall a AdaptyFlow, y el parámetro locale se elimina — cuando renderizas un flow, el idioma se resuelve automáticamente; para paywalls personalizados, todos los idiomas se devuelven en flow.RemoteConfigs:

- Adapty.GetPaywall("YOUR_PLACEMENT_ID", "en", (paywall, error) => {
+ Adapty.GetFlow("YOUR_PLACEMENT_ID", (flow, error) => {
      if (error != null) {
          // handle the error
          return;
      }
-     // use the paywall
+     // use the flow
  });

GetPaywallForDefaultAudience se renombra de la misma manera:

- Adapty.GetPaywallForDefaultAudience("YOUR_PLACEMENT_ID", "en", (paywall, error) => { /* ... */ });
+ Adapty.GetFlowForDefaultAudience("YOUR_PLACEMENT_ID", (flow, error) => { /* ... */ });

GetPaywallProducts(paywall) → GetPaywallProducts(flow)

GetPaywallProducts mantiene su nombre pero ahora acepta un AdaptyFlow:

- Adapty.GetPaywallProducts(paywall, (products, error) => {
+ Adapty.GetPaywallProducts(flow, (products, error) => {
      if (error != null) {
          // handle the error
          return;
      }
      // use the products
  });

Modelo de datos

GetFlow devuelve un AdaptyFlow en lugar de un AdaptyPaywall, y la forma del objeto ha cambiado:

Propiedad de AdaptyPaywall en v3Propiedad de AdaptyFlow en v4Acción
RemoteConfig (única, nullable)RemoteConfigs (lista)Un flow lleva un Remote Config por idioma configurado. Lee el que corresponda al usuario desde flow.RemoteConfigs. El atajo flow.RemoteConfig devuelve la primera entrada.
(nuevo)Paywalls (lista de AdaptyFlowPaywall)Cada entrada es una variación de paywall en el flow, con su propio Name, VariationId y ProductIdentifiers. Los métodos de web paywall reciben un AdaptyFlowPaywall; consulta Métodos de web paywall.
ProductIdentifiers, VendorProductIdsse conservanEn AdaptyFlow, estos agregan los productos de todas las variaciones de paywall. Cada variación también expone sus propios ProductIdentifiers y VendorProductIds. Para obtener productos, sigue llamando a GetPaywallProducts(flow).
HasViewConfigurationeliminadoElimina cualquier comprobación de HasViewConfiguration de tu código — CreateFlowView devuelve un error en su lugar (consulta Mostrar flows).
Products (lista de AdaptyProductReference)eliminadoAdaptyProductReference ya no es público, y con él desaparecen los valores PromotionalOfferId, WinBackOfferId y AndroidOfferId que contenía. Usa ProductIdentifiers — una lista de AdaptyProductIdentifier con VendorProductId y el campo exclusivo de Android BasePlanId (el AndroidBasePlanId de v3) — o llama a GetPaywallProducts(flow) cuando necesites objetos AdaptyPaywallProduct completos con precios y ofertas.
RemoteConfigStringeliminadoLee el string directamente desde el Remote Config: flow.RemoteConfig?.Data, o la entrada correspondiente en flow.RemoteConfigs.
(nuevo)FlowVersionId (nullable)El identificador de versión del flow, o null cuando no está disponible.

AdaptyPaywallProduct gana un campo nuevo: FlowProductId, el identificador del producto dentro del flow, que es null para los productos que no pertenecen a un flow.

Métodos de paywall web

OpenWebPaywall y CreateWebPaywallUrl mantienen sus nombres, pero el argumento paywall ahora acepta un AdaptyFlowPaywall — una de las variaciones en flow.Paywalls. Aún puedes pasar un AdaptyPaywallProduct en su lugar:

- Adapty.OpenWebPaywall(paywall, AdaptyWebPresentation.ExternalBrowser, (error) => { /* ... */ });
+ var flowPaywall = flow.Paywalls.FirstOrDefault();
+ if (flowPaywall != null) {
+     Adapty.OpenWebPaywall(flowPaywall, AdaptyWebPresentation.ExternalBrowser, (error) => { /* ... */ });
+ }

Seguimiento de visualizaciones de flows

LogShowPaywall → LogShowFlow

LogShowPaywall ha sido renombrado a LogShowFlow y ahora acepta un AdaptyFlow. El evento sigue registrándose en la misma variación, por lo que las métricas del embudo y de las pruebas A/B siguen funcionando sin cambios en el dashboard.

- Adapty.LogShowPaywall(paywall, (error) => { /* ... */ });
+ Adapty.LogShowFlow(flow, (error) => { /* ... */ });

Al igual que en la v3, no es necesario llamar a este método al mostrar flows o paywalls renderizados por el Flow Builder o el Paywall Builder — Adapty registra esas vistas automáticamente.

Mostrando flows

CreatePaywallView → CreateFlowView

Renombra el método de fábrica y pasa el AdaptyFlow. El tipo de vista devuelto cambia de AdaptyUIPaywallView a AdaptyUIFlowView, pero sus métodos (Present, Dismiss) no cambian, y el objeto de parámetros opcionales mantiene los mismos campos (LoadTimeout, PreloadProducts, CustomTags, CustomTimers, CustomAssets, ProductPurchaseParameters) bajo el nuevo nombre AdaptyUICreateFlowViewParameters, además de dos nuevos — Locale y EnableSafeAreaPaddings:

- AdaptyUI.CreatePaywallView(paywall, parameters, (view, error) => {
+ AdaptyUI.CreateFlowView(flow, parameters, (view, error) => {
      if (error != null) {
          // handle the error
          return;
      }
      view.Present((error) => { /* handle the error */ });
  });

CreateFlowView devuelve un error si el flow no tiene ninguna vista configurada — esto reemplaza la comprobación HasViewConfiguration de la v3:

- if (paywall.HasViewConfiguration) {
-     AdaptyUI.CreatePaywallView(paywall, null, (view, error) => { /* ... */ });
- }
+ AdaptyUI.CreateFlowView(flow, (view, error) => {
+     if (error != null) {
+         // the flow has no view configured, or view creation failed
+         return;
+     }
+     view.Present((error) => { /* handle the error */ });
+ });

Una vista de flow es de un solo uso: después de llamar a Dismiss, la vista se destruye, por lo que debes llamar a CreateFlowView de nuevo para mostrar el flow otra vez.

Rellenos de área segura en Android

AdaptyUICreateFlowViewParameters añade EnableSafeAreaPaddings, que controla los rellenos de área segura en Android en tiempo de ejecución. Se ignora en iOS y su valor predeterminado es true:

var parameters = new AdaptyUICreateFlowViewParameters()
    .SetEnableSafeAreaPaddings(false);

Manejo de eventos

Las interfaces de listener siguen ahora la convención de prefijo I de C#, y no se mantienen alias heredados; renombra AdaptyEventListener a IAdaptyEventListener y AdaptyOnboardingsEventsListener a IAdaptyOnboardingsEventsListener en todos los lugares donde las implementes.

El listener de eventos de flow se renombra de AdaptyPaywallsEventsListener a IAdaptyFlowsEventsListener, su método de registro de SetPaywallsEventsListener a SetFlowsEventsListener, y sus callbacks cambian el prefijo PaywallView por FlowView. Los cuerpos de los handlers existentes no necesitan cambios de código: solo hay que renombrar la interfaz y los métodos:

- public class MyListener : MonoBehaviour, AdaptyPaywallsEventsListener {
-     public void PaywallViewDidFinishPurchase(
-         AdaptyUIPaywallView view,
+ public class MyListener : MonoBehaviour, IAdaptyFlowsEventsListener {
+     public void FlowViewDidFinishPurchase(
+         AdaptyUIFlowView view,
          AdaptyPaywallProduct product,
          AdaptyPurchaseResult purchasedResult
      ) {
          // custom logic after purchase
      }
      // ...
  }

- Adapty.SetPaywallsEventsListener(myListener);
+ Adapty.SetFlowsEventsListener(myListener);

Un callback ha sido renombrado: PaywallViewDidFailRendering pasa a llamarse FlowViewDidReceiveError. Se activa para los mismos errores de renderizado que antes, además de otros errores de ejecución no relacionados con compras:

- public void PaywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) { }
+ public void FlowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) { }

Consulta Gestionar eventos de flow y paywall para ver la lista completa de callbacks.

Nuevas APIs

  • Adapty.SetObserverModeResolver(...) con un IAdaptyUIObserverModeResolver — gestiona las compras y restauraciones iniciadas desde flows mientras el SDK se ejecuta en modo Observer. Antes esto solo estaba disponible en los SDKs nativos de iOS y Android. Consulta Presentar flows en modo Observer.
  • Adapty.SetSystemRequestsHandler(...) con un IAdaptyUISystemRequestsHandler — reservado para solicitudes del sistema desde un flow: permisos del SO (FlowViewDidAskPermission) y solicitudes de valoración de la app (FlowViewDidRequestAppReview). Los flows aún no desencadenan estas solicitudes, por lo que no necesitas registrar un handler.
  • AdaptyUICreateFlowViewParameters.Locale (configúralo con SetLocale) — renderiza un flow o paywall con una localización del Builder específica en lugar de la que Adapty resuelve a partir del dispositivo. Un flow se localiza cuando se crea su vista, por lo que este es el único lugar para elegir su localización; la vista creada indica la localización con la que se construyó en view.Locale. Consulta Usar localizaciones y códigos de idioma.
  • El nuevo callback FlowViewDidReceiveAnalyticEvent en IAdaptyFlowsEventsListener está reservado para eventos analíticos personalizados de un flow. Los flows aún no emiten estos eventos a tu código, así que impleméntalo con un cuerpo vacío.
  • AdaptyUI.OpenUrl(url, openIn, ...) y AdaptyUI.RequestAppReview(...) — el manejo nativo detrás de las acciones open_url y las solicitudes de valoración de la app. Llama a OpenUrl desde FlowViewDidPerformAction para mantener el comportamiento de URL predeterminado; RequestAppReview respalda el prompt de valoración predeterminado, que los flows aún no desencadenan.

Cambios en el comportamiento predeterminado

Estos cambios no causan errores de compilación, así que compruébalos en tiempo de ejecución:

  • Finalización de la compra: En v3, la vista se cerraba automáticamente tras una compra exitosa. En v4, un flow permanece abierto tras una compra o un error hasta que lo cierres tú — el SDK no aplica ningún comportamiento por defecto. Llama a view.Dismiss(...) en FlowViewDidFinishPurchase una vez que el usuario obtenga acceso.
  • Botón Atrás de Android: El botón Atrás del sistema (o el gesto de retroceso) se entrega a FlowViewDidPerformAction como una acción SystemBack y ya no cierra un flow por sí solo — igual que en iOS, donde un flow no puede cerrarse con un gesto del sistema. Ofrece a los usuarios una salida explícita (un botón Close o una acción on_device_back), o cierra la vista tú mismo al gestionar la acción.
  • Las vistas son de un solo uso: Después de Dismiss, la vista se destruye. Llama a CreateFlowView de nuevo para mostrar el flow otra vez.
  • Transacciones en modo Observer: ReportTransaction ya no devuelve un error de decodificación cuando tiene éxito — en v3 la respuesta de éxito se parseaba incorrectamente, por lo que un reporte exitoso siempre terminaba con un error.

Baja de la API de onboarding

La API de onboarding heredada está en desuso desde v4.0 en favor del Flow Builder. Sigue funcionando, pero se eliminará en una versión futura, así que planifica la migración de tus onboardings al Flow Builder.

Símbolos en desuso: GetOnboarding, GetOnboardingForDefaultAudience, AdaptyUI.CreateOnboardingView, AdaptyUI.PresentOnboardingView, AdaptyUI.DismissOnboardingView y Adapty.SetOnboardingsEventsListener.