SDK de iOS
Swift, utilizable desde Objective-C. Sin dependencias. Incluye un manifiesto de privacidad. Plan Pro y superiores.
Requisitos
- iOS 13+.
- Swift u Objective-C.
- Una clave del SDK: en el panel, abre tu app → Ajustes → Claves del SDK → Nueva clave. Solo se muestra una vez, así que cópiala en ese momento.
Instalación
En Xcode, elige File → Add Package Dependencies…, pega la dirección del repositorio, elige Up to Next Major
Version desde 0.3.3 y añade la biblioteca Unolink al target de tu app.
https://github.com/unolink-dev/unolink-sdk
Unolink se instala con Swift Package Manager, no con CocoaPods. Si tu proyecto también usa CocoaPods para otras bibliotecas y pod install falla con un error de codificación (Ruby 4, o una configuración regional que no es UTF-8), ejecútalo en UTF-8:
LANG=en_US.UTF-8 pod install
Configuración
Llama a configure una vez, lo antes posible: en el init() de tu App con @main, o en
application(_:didFinishLaunchingWithOptions:).
import Unolink
@main
struct MyApp: App {
init() {
#if DEBUG
Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(debug: true))
#else
Unolink.configure(apiKey: "ulk_…")
#endif
}
var body: some Scene { WindowGroup { ContentView() } }
}
Una biblioteca compilada no puede ver tus ajustes de compilación, así que pasa tú debug: true desde las builds de depuración, como arriba. Eso
marca la instalación como dispositivo de prueba.
Objective-C:
@import Unolink;
[Unolink configureWithApiKey:@"ulk_…" options:[UNLOptions new]];
Opciones
| Opción | Por defecto | Qué hace |
|---|---|---|
debug | false | Marca esta instalación como dispositivo de prueba. Los paneles ocultan los dispositivos de prueba salvo que Incluir dispositivos de prueba esté activado. |
logLevel | .warn | Cuánto se escribe en la consola de Xcode, prefijo [Unolink]: .none, .error, .warn, .info, .debug. |
baseURL | https://api.unolink.dev | La API del SDK. Déjala como está. |
Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(logLevel: .debug, debug: true))
La clave es pública: va dentro de tu app y solo puede enviar datos de esa app. Consulta Claves del SDK.
Eventos del embudo
Añade una línea en cada momento importante. Se convierten en los pasos de Embudo y Recorridos.
Unolink.onboardingCompleted() // the last onboarding screen is done
Unolink.paywallViewed(placement: "onboarding") // a paywall appeared; placement says which one
Unolink.paywallSkipped(placement: "onboarding") // closed without buying
Unolink.signUp(method: "apple") // an account was created
Unolink.signUpSkipped() // went on as a guest (0.3.2+)
Sin RevenueCat, informa tú de las pruebas y compras. El importe es un Decimal, así que los precios nunca se redondean:
Unolink.trialStarted(productId: "pro_yearly")
Unolink.purchase(amount: product.price, currency: "USD", productId: product.id)
Unolink.purchaseCancelled(productId: product.id) // closed the purchase sheet
Unolink.purchaseFailed(productId: product.id, reason: "payment_failed")
Tus propios eventos aceptan un nombre y hasta 20 propiedades:
Unolink.track("level_up", properties: ["level": 3])
Objective-C:
[Unolink paywallViewedWithPlacement:@"onboarding" properties:nil];
[Unolink purchaseWithAmount:[NSDecimalNumber decimalNumberWithString:@"49.99"] currency:@"USD" productId:nil properties:nil];
La lista completa, con los nombres que llegan al panel, está en Eventos.
ID de usuario y RevenueCat
Si usas RevenueCat, conéctalo en tu app → Ajustes → RevenueCat. Después, no llames a
purchase ni a trialStarted: RevenueCat envía él mismo las pruebas, compras, renovaciones, cancelaciones y reembolsos, y
Unolink ignora las llamadas de compra de la app para que nada cuente dos veces.
Para unir esas compras a la instalación, informa del propio ID de usuario de app de RevenueCat. Con el SDK 0.3.2 o
posterior, una línea lo mantiene al día. Llámala una vez al iniciar, antes o después de configure:
Unolink.connectRevenueCat { Purchases.isConfigured ? Purchases.shared.appUserID : nil }
Unolink lee el ID al iniciar, cada vez que la app se activa y antes de cada evento, y solo lo envía cuando ha cambiado.
Después de Purchases.logIn y Purchases.logOut, llama a Unolink.revenueCatUserChanged() para enviar el nuevo ID de
inmediato. Devuelve nil mientras RevenueCat no esté configurado: leer Purchases.shared antes de eso detiene la app.
Sin ella (o antes de la 0.3.2), llama a setUserId con el ID de RevenueCat después de Purchases.configure, después de
cada Purchases.logIn y Purchases.logOut, y en cada inicio. Usa uno u otro, no los dos:
// after Purchases.configure, logIn and logOut, and on every launch
Unolink.setUserId(Purchases.shared.appUserID)
Para un invitado, eso es el ID anónimo de RevenueCat, así que una compra hecha antes de registrarse se une a la instalación
de inmediato. Después de logIn, es el ID de la cuenta. Cuenta cada ID que haya informado una instalación, así que la compra
del invitado se mantiene unida. Consulta Invitados y cuentas.
Unolink nunca guarda el ID en sí, solo un hash unidireccional distinto para cada una de tus apps.
Deep links en iPhone
Los deep links diferidos son solo para Android. Apple no da a las apps ningún install referrer, así que tu app no puede saber qué
enlace se tocó, y Unolink nunca hace fingerprinting de los dispositivos para adivinarlo. Unolink.onDeferredDeepLink(_:) existe para que el código
se pueda compartir entre plataformas, pero en iPhone hoy no se llama.
En el panel, las instalaciones de iPhone se asocian al clic del enlace del que vinieron, sin fingerprinting. La asociación no se envía a la app. Desactívala por app en sus Ajustes.
Tus enlaces siguen enviando a los visitantes de iPhone directamente al App Store y contando sus clics, y el SDK sigue contando cada instalación y cada evento.
Otras llamadas
| Llamada | Qué hace |
|---|---|
Unolink.installId | El ID aleatorio de esta instalación, o nil antes de configure. No identifica a ninguna persona ni dispositivo. |
Unolink.flush() | Envía ya los eventos en cola. Normalmente no hace falta. |
Unolink.setEnabled(false) | Desactiva la medición y elimina los eventos en cola, para tu ajuste de exclusión voluntaria. true la vuelve a activar. |
Cómo se comporta
- Primer arranque: crea un ID de instalación aleatorio en Application Support (excluido de la copia de seguridad de iCloud, nunca en el llavero), así que una reinstalación o un teléfono nuevo es una instalación nueva.
- Eventos automáticos:
first_open,session_start(al arrancar, o tras 30 minutos en segundo plano) yapp_background. Son gratis. - Los eventos se guardan en el dispositivo (hasta 1.000) y se envían en lotes cada 15 segundos mientras la app está activa, y cuando pasa a segundo plano. Sin conexión, esperan y se reintentan.
- Nunca bloquea el hilo principal y nunca lanza excepciones.
Dispositivos de prueba
Configura con debug: true en las builds de depuración, como arriba. Sus datos son reales, pero están ocultos hasta que activas Incluir
dispositivos de prueba en Embudo y Recorridos. Más en Pruebas.
Privacidad
- Sin IDFA, sin aviso de App Tracking Transparency, sin fingerprinting.
- El manifiesto de privacidad incluido declara interacción con el producto (tus eventos) e historial de compras (las compras que informas), usados para analíticas, no vinculados a la identidad, y ningún rastreo. Usa las mismas respuestas en la etiqueta de privacidad de tu App Store.
- Un ID de instalación aleatorio, versión de la app, versión del sistema operativo, versión del SDK, teléfono o tablet, idioma. El país viene del borde de la red. Las direcciones IP nunca se guardan.
- Nunca pongas nombres, emails ni otros datos personales en las propiedades de los eventos.
Solución de problemas
- ¿No aparece nada en el panel? Activa Incluir dispositivos de prueba: las builds de depuración con
debug: trueestán ocultas por defecto. - ¿Sigue sin aparecer nada? Configura con
UnolinkOptions(logLevel: .debug, debug: true)y busca[Unolink]en la consola de Xcode. Una clave incorrecta o revocada se registra como error. - ¿Algunas instalaciones en iPhone no muestran enlace? Es lo esperado: no todas las instalaciones en iPhone se pueden asociar a un clic, y esas se muestran en su propia fila. Consulta Deep links en iPhone.
Más en Solución de problemas.