Medir las compras directas desde la app

Seleccionar plataforma: iOS+ Android Unity


Las compras directas desde la app (IAP) son contenido digital o funciones que puedes vender en una app para dispositivos móviles a través de la App Store de Apple o Google Play de manera que tu aplicación no tenga que procesar transacciones financieras. Algunos ejemplos de compras directas desde la aplicación incluyen contenido basado en suscripciones o artículos especiales de videojuegos.

Analytics muestra los eventos de IAP en el informe de compras directas desde la app.

En el caso de las apps de Unity, el SDK Analytics se integra en la App Store de Apple en iOS y Google Play en Android.

En la mayoría de los casos, el Analytics SDK recopila eventos de IAP automáticamente sin requerir llamadas a la API en tu app. Los requisitos de configuración y el comportamiento de seguimiento dependen de la plataforma de segmentación:

  • Android: Google Play transacciones se registran automáticamente después de vincular Google Play. No requiere cambios en los códigos.
  • iOS (StoreKit 1): Las transacciones de App Store realizadas con las APIs de StoreKit 1 se registran automáticamente. No requiere cambios en los códigos.
  • iOS (StoreKit 2): Las transacciones de App Store realizadas con las APIs de StoreKit 2 se deben registrar de forma manual con la API personalizada de Unity.

Antes de comenzar

Implementación

Android

En el caso de las apps para Android, puedes medir los eventos de IAP en cuanto te vincules a Google Play. No es necesario que escribas ningún código personalizado en tu proyecto de Unity para medir las compras.

iOS

En el caso de las apps para iOS, la estrategia de implementación depende de si tu app usa StoreKit 1 o StoreKit 2:

StoreKit 1

Si tu flujo de compra usa StoreKit 1, el SDK de Analytics registra automáticamente los eventos de IAP. No es necesario que agregues ningún código personalizado para registrar estas compras.

StoreKit 2

Si tu flujo de compra usa StoreKit 2, debes registrar manualmente las transacciones verificadas pasando la cadena de identificador de transacción a LogAppleTransactionAsync().

using Firebase.Analytics;

// Call this method once you have completed a StoreKit 2 transaction
// and have the transaction identifier.
public void LogPurchase(string transactionId) {
    FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWith(task => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.LogError("Failed to log Apple purchase transaction: " + task.Exception);
        } else {
            Debug.Log("Successfully logged Apple purchase transaction");
        }
    });
}
Recupera el ID de transacción con Unity IAP

Si tu proyecto usa el paquete estándar de Unity In-App Purchasing (UnityEngine.Purchasing), el método para recuperar el ID de transacción depende de la versión de la API de Unity IAP que uses.

Devolución de llamada de confirmación con Unity IAP v5.2 o versiones posteriores

En Unity IAP v5.2 y versiones posteriores, puedes acceder a la información de transacción específica de Apple directamente desde el objeto Order en la devolución de llamada de confirmación. Puedes pasar el OriginalTransactionID o el ID de transacción actual a LogAppleTransactionAsync():

using UnityEngine.Purchasing;
using Firebase.Analytics;
using Firebase.Extensions;

// Example using Unity IAP v5.2+ Order confirmation
void OnPurchaseConfirmed(Order order) {
    #if UNITY_IOS
    if (order is ConfirmedOrder confirmedOrder) {

        var appleInfo = confirmedOrder.Info.Apple;
        if (appleInfo != null) {

            string transactionId = appleInfo.OriginalTransactionID;

            if (!string.IsNullOrEmpty(transactionId)) {
                // Log the StoreKit 2 transaction with Firebase Analytics
                FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWithOnMainThread(task => {
                    if (task.IsFaulted || task.IsCanceled) {
                        Debug.LogError($"Failed to log Apple purchase transaction: {task.Exception}");
                    } else {
                        Debug.Log("Successfully logged Apple purchase transaction");
                    }
                });
            } else {
                Debug.LogWarning("Apple OriginalTransactionID is null or empty. Skipping Firebase logging.");
            }
        }
    } else if (order is FailedOrder failedOrder) {
        Debug.Log($"Purchase confirmation bypassed due to failure: {failedOrder.FailureReason}");
    }
    #endif
}
Devolución de llamada ProcessPurchase heredada

Si usas la devolución de llamada ProcessPurchase heredada, puedes extraer el identificador de transacción del producto comprado:

using UnityEngine.Purchasing;
using Firebase.Analytics;
using Firebase.Extensions;

public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args) {
    // Extract the transaction ID from the purchased product
    string transactionId = args.purchasedProduct.transactionID;

    #if UNITY_IOS
    // Log the StoreKit 2 transaction with Firebase Analytics
    FirebaseAnalytics.LogAppleTransactionAsync(transactionId).ContinueWithOnMainThread(task => {
        if (task.IsFaulted || task.IsCanceled) {
            Debug.LogError($"Failed to log Apple purchase transaction: {task.Exception}");
        } else {
            Debug.Log("Successfully logged Apple purchase transaction");
        }
    });
    #endif

    return PurchaseProcessingResult.Complete;
}

Registra eventos de compra directa desde la app de forma manual

Si necesitas hacer un seguimiento de las compras directas desde la app que se realizan fuera de Play Store o App Store (por ejemplo, a través de tiendas alternativas o procesos de pago personalizados, o bien otros mercados), puedes registrar estas transacciones de forma manual con el evento IN_APP_PURCHASE.

using Firebase.Analytics;

public void LogCustomInAppPurchase(string productName, double value, string currencyCode, int quantity = 1)
{
    FirebaseAnalytics.LogEvent(
        FirebaseAnalytics.EventInAppPurchase,
        new Parameter(FirebaseAnalytics.ParameterProductName, productName),
        new Parameter(FirebaseAnalytics.ParameterValue, value),
        new Parameter(FirebaseAnalytics.ParameterCurrency, currencyCode),
        new Parameter(FirebaseAnalytics.ParameterQuantity, quantity)
    );
}