Server-to-Server - Guía de S2S para Apps Móviles

Descripción general

Esta guía cubre las señales de atribución específicas para móviles que se superponen a las mecánicas compartidas de S2S: Apple Search Ads, los install referrers de Google Play y Meta, el seguimiento de desinstalaciones y el recibo de instalación de iOS. Aplica a integraciones de apps iOS y Android que reportan sesiones y eventos server-to-server.

Antes de empezar: Estas funciones se construyen sobre el flujo de solicitudes S2S compartido. Consulta el hub de Fundamentos de S2S para los conceptos básicos, y la referencia del endpoint SESSION y la referencia del endpoint EVENT para la autenticación y los parámetros comunes.

Guía móvil relacionada: Para dirigir a los usuarios a tu app desde una campaña, consulta la Guía de Deep Linking para deep linking y deferred deep linking mediante S2S.


Atribución de Apple Search Ads

Integración de Search Ads en iOS

Apple Search Ads es una Self-Attributing Network (SAN) que requiere una implementación de atribución específica de la plataforma mediante los frameworks de Apple.

Soporte de frameworks:

  • AdServices (iOS 14.3 y posteriores): framework de AdServices. Ruta de integración actual y recomendada.
  • iAd (iOS 14.2 y anteriores): framework de iAd. Framework heredado, obsoleto según Apple; no se recomienda para nuevas integraciones.

Guía completa: Documentación de integración de Apple Search Ads


Implementación del framework AdServices

Recupera y envía el token de atribución mediante el framework AdServices para iOS 14.3 y posteriores.

Paso 1: Recuperar el token de atribución

Objective-C
#import <AdServices/AdServices.h>

NSError *error = nil;
Class AAAttributionClass = NSClassFromString(@"AAAttribution");
if (AAAttributionClass) {
    NSString *attributionToken = [AAAttributionClass attributionTokenWithError:&error];
    if (!error && attributionToken) {
        // Handle attributionToken
    }
}

Características del token:

  • Se genera en el dispositivo
  • Se almacena en caché durante 5 minutos; se genera un nuevo token tras la expiración si se llama a attributionToken()
  • Válido durante 24 horas

Paso 2: Enviar a Singular

Codifica el token en URL y agrégalo al endpoint SESSION como parámetro attribution_token en la primera sesión después de cada instalación y reinstalación.


Install Referrer de Google Play

Atribución de instalación en Android

El Install Referrer de Google Play proporciona la atribución de instalación más precisa en Android, ya que contiene información sobre el origen del usuario antes de llegar a la Play Store.

Requerido para:

Más información: Documentación del Install Referrer de Google

Pasos de implementación:

  1. Recupera el install referrer en la primera apertura de la app usando la Play Install Referrer API
  2. Reporta la sesión a través del endpoint SESSION incluyendo el parámetro JSON install_ref con los atributos requeridos

Atributos de install_ref:

Parámetro Detalles
referrer

Valor del referrer obtenido de la Play Install Referrer API (objeto JSON: codifícalo como cadena)

referrer_source

Especifica service

clickTimestampSeconds

Marca de tiempo del clic obtenida de la API (p. ej., 1550420123)

installBeginTimestampSeconds

Hora de inicio de la instalación obtenida de la API

current_device_time

Hora actual del dispositivo en milisegundos (p. ej., 1550420454906)


Install Referrer de Meta

Mejora de la atribución de Facebook

A partir del 18 de junio de 2025: La Advanced Mobile Measurement (AMM) de Meta elimina la necesidad de implementar el Install Referrer de Meta. No se recomienda si AMM está habilitado.

El Referrer de Meta es una solución de medición específica de Android que proporciona datos de atribución granulares a nivel de usuario para las instalaciones de apps, combinando las tecnologías del Install Referrer de Google Play y del Install Referrer de Meta.

Más información: FAQ del Referrer de Meta

Pasos de implementación:

  1. Recupera el install referrer de Meta en la primera apertura de la app según la documentación de Meta
  2. Reporta la sesión a través del endpoint SESSION incluyendo el parámetro JSON meta_ref con los atributos requeridos

Atributos de meta_ref:

Parámetro Detalles
is_ct

is_ct del Install Referrer de Meta (0 o 1)

install_referrer

install_referrer del Install Referrer de Meta

actual_timestamp

actual_timestamp del Install Referrer de Meta (p. ej., 1693978124)


Seguimiento de desinstalaciones

Configuración de notificaciones push silenciosas

Realiza el seguimiento de las desinstalaciones mediante notificaciones push silenciosas del dispositivo, enviando el push token con cada notificación de sesión.

Requisitos de configuración:

  1. Sigue la configuración de seguimiento de desinstalaciones específica de la plataforma:
  2. Agrega el token específico de la plataforma a la solicitud SESSION:
    • iOS: apns_token (token de dispositivo APNs)
    • Android: fcm (token de dispositivo FCM)

Recibo de instalación de iOS

Validación del recibo

Pasa el recibo de instalación de iOS en el parámetro install_receipt al reportar una sesión de iOS.

Swift
import Foundation
import StoreKit

class ReceiptManager {
    static func getInstallReceipt() -> String? {
        if #available(iOS 18.0, *) {
            let semaphore = DispatchSemaphore(value: 0)
            var result: String?

            Task {
                do {
                    let transaction = try await AppTransaction.shared
                    result = transaction.jwsRepresentation
                    semaphore.signal()
                } catch {
                    debugPrint("Failed to get app transaction: \(error.localizedDescription)")
                    semaphore.signal()
                }
            }

            semaphore.wait()
            return result

        } else {
            guard let receiptURL = Bundle.main.appStoreReceiptURL else {
                debugPrint("Receipt URL not found")
                return nil
            }

            do {
                let receiptData = try Data(contentsOf: receiptURL, options: .uncached)
                return receiptData.base64EncodedString(options: [])
            } catch {
                debugPrint("Failed to read receipt: \(error.localizedDescription)")
                return nil
            }
        }
    }
}