Documentación del SDK
Integra el SDK de Android de Appaloo en tu app y publica tus anuncios con unas pocas líneas de código.
Integra el SDK de iOS de Appaloo en tu app y publica tus anuncios con unas pocas líneas de código.
Instalación
Añade el SDK de Appaloo a tu proyecto de Android desde nuestro repositorio Maven. El SDK apunta a Android API 30+.
settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://download.appaloo.io/appaloo-sdk/android") }
}
}
app/build.gradle.kts
dependencies {
implementation("io.appaloo:sdk:1.0.3")
}
settings.gradle
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url 'https://download.appaloo.io/appaloo-sdk/android' }
}
}
app/build.gradle
dependencies {
implementation 'io.appaloo:sdk:1.0.3'
}
Inicialización
Crea un AppalooClient con el UUID de tu anuncio. Si integras varios anuncios, puedes crear un cliente para cada uno: es un objeto ligero.
import com.appaloo.AppalooClient
private val appaloo = AppalooClient(
adId = "{adID}",
)
import com.appaloo.AppalooClient;
private final AppalooClient appaloo = new AppalooClient("{adID}");
Anuncios intersticiales
Los anuncios intersticiales son anuncios a pantalla completa que pueden servir como pausa natural entre pantallas o como un anuncio independiente activado por una acción del usuario.
Los usuarios pueden cerrar estos anuncios tras una cuenta atrás de 15 segundos o, en los anuncios de vídeo, cuando termina el vídeo.
import com.appaloo.AppalooClient
import com.appaloo.AdDetails
import com.appaloo.InterstitialCallbacks
class MainActivity : AppCompatActivity() {
private val appaloo = AppalooClient("{adID}")
private fun showAd() {
appaloo.loadInterstitial(this, object : InterstitialCallbacks {
override fun onAdLoaded(adDetails: AdDetails) {
Log.d("Appaloo", "Showing ad for ${adDetails.appName}")
}
override fun onAdLoadFailed(errorCode: Int, message: String) {
Log.w("Appaloo", "Ad failed: $errorCode - $message")
}
})
}
}
import com.appaloo.AppalooClient;
import com.appaloo.AdDetails;
import com.appaloo.InterstitialCallbacks;
public class MainActivity extends AppCompatActivity {
private final AppalooClient appaloo =
new AppalooClient("{adID}", "https://appaloo.io");
private void showAd() {
appaloo.loadInterstitial(this, new InterstitialCallbacks() {
@Override
public void onAdLoaded(AdDetails adDetails) {
Log.d("Appaloo", "Showing ad for " + adDetails.getAppName());
}
@Override
public void onAdLoadFailed(int errorCode, String message) {
Log.w("Appaloo", "Ad failed: " + errorCode + " - " + message);
}
});
}
}
Anuncios recompensados
Los anuncios recompensados son anuncios de vídeo que premian al usuario por verlos completos. Suelen usarse para incentivar a los usuarios a completar una tarea o a interactuar con la app.
El mismo flujo que loadInterstitial, pero el SDK invoca onAdFinished solo después de que el usuario haya visto el anuncio completo. Concede tu recompensa dentro de este callback.
import com.appaloo.AppalooClient
import com.appaloo.AdDetails
import com.appaloo.RewardedCallbacks
class GameActivity : AppCompatActivity() {
private val appaloo = AppalooClient("{adID}")
private fun grantBonusLife() {
appaloo.loadRewarded(this, object : RewardedCallbacks {
override fun onAdLoaded(adDetails: AdDetails) {
// Ad is on screen; do not credit yet.
}
override fun onAdFinished(adDetails: AdDetails) {
// User finished watching: credit the reward here.
player.lives += 1
}
override fun onAdLoadFailed(errorCode: Int, message: String) {
Log.w("Appaloo", "Reward unavailable ($errorCode)")
}
})
}
}
import com.appaloo.AppalooClient;
import com.appaloo.AdDetails;
import com.appaloo.RewardedCallbacks;
public class GameActivity extends AppCompatActivity {
private final AppalooClient appaloo =
new AppalooClient("{adID}", "https://appaloo.io");
private void grantBonusLife() {
appaloo.loadRewarded(this, new RewardedCallbacks() {
@Override
public void onAdLoaded(AdDetails adDetails) {
// Ad is on screen; do not credit yet.
}
@Override
public void onAdFinished(AdDetails adDetails) {
// User finished watching: credit the reward here.
player.lives += 1;
}
@Override
public void onAdLoadFailed(int errorCode, String message) {
Log.w("Appaloo", "Reward unavailable (" + errorCode + ")");
}
});
}
}
Importante: otorga la recompensa únicamente dentro de onAdFinished. onAdLoaded se dispara en cuanto se renderiza el anuncio, antes de que el usuario lo haya visto.
Anuncios integrados
Los anuncios integrados son anuncios pequeños que se insertan en tu propio diseño. Puedes usarlos dentro de un feed de noticias, un directorio, una galería de fotos y mucho más.
import com.appaloo.AppalooClient
import android.view.ViewGroup
class FeedActivity : AppCompatActivity() {
private val appaloo = AppalooClient("{adID}")
private fun addInlineAd(container: ViewGroup) {
val adView = appaloo.loadInline(this)
container.addView(adView)
}
}
import com.appaloo.AppalooClient;
import android.view.View;
import android.view.ViewGroup;
public class FeedActivity extends AppCompatActivity {
private final AppalooClient appaloo = new AppalooClient("{adID}");
private void addInlineAd(ViewGroup container) {
View adView = appaloo.loadInline(this);
container.addView(adView);
}
}
En Jetpack Compose, envuélvela en un AndroidView:
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.appaloo.AdDetails
import com.appaloo.AppalooClient
import com.appaloo.InlineCallbacks
@Composable
fun AppalooInlineAd(modifier: Modifier = Modifier) {
val appaloo = remember { AppalooClient("{adID}") }
var hasAd by remember { mutableStateOf(true) }
if (hasAd) {
AndroidView(
modifier = modifier.fillMaxWidth().height(275.dp),
factory = { ctx ->
appaloo.loadInline(ctx, object : InlineCallbacks {
override fun onAdLoaded(adDetails: AdDetails) {}
override fun onAdLoadFailed(errorCode: Int, message: String) {
hasAd = false
}
})
},
)
}
}
@Composable
fun Feed() {
LazyColumn {
item { Text("A post") }
item { AppalooInlineAd() }
item { Text("Another post") }
}
}
Anuncios de banner
Los banners son una franja compacta anclada a todo el ancho. loadBanner devuelve una View que colocas donde quieras, normalmente anclada en la parte inferior de la pantalla. Se rellena cuando se sirve un anuncio y se contrae a altura cero si no hay ninguno disponible.
import com.appaloo.AppalooClient
import com.appaloo.AdDetails
import com.appaloo.BannerCallbacks
import android.view.ViewGroup
class MainActivity : AppCompatActivity() {
private val appaloo = AppalooClient("{adID}")
private fun addBanner(container: ViewGroup) {
val adView = appaloo.loadBanner(this, object : BannerCallbacks {
override fun onAdLoaded(adDetails: AdDetails) {
Log.d("Appaloo", "Banner for ${adDetails.appName}")
}
override fun onAdLoadFailed(errorCode: Int, message: String) {
Log.w("Appaloo", "Banner failed: $errorCode - $message")
}
})
container.addView(adView)
}
}
import com.appaloo.AppalooClient;
import com.appaloo.AdDetails;
import com.appaloo.BannerCallbacks;
import android.view.View;
import android.view.ViewGroup;
public class MainActivity extends AppCompatActivity {
private final AppalooClient appaloo = new AppalooClient("{adID}");
private void addBanner(ViewGroup container) {
View adView = appaloo.loadBanner(this, new BannerCallbacks() {
@Override
public void onAdLoaded(AdDetails adDetails) {
Log.d("Appaloo", "Banner for " + adDetails.getAppName());
}
@Override
public void onAdLoadFailed(int errorCode, String message) {
Log.w("Appaloo", "Banner failed: " + errorCode + " - " + message);
}
});
container.addView(adView);
}
}
En Jetpack Compose, envuélvela en un AndroidView:
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.appaloo.AdDetails
import com.appaloo.AppalooClient
import com.appaloo.BannerCallbacks
@Composable
fun AppalooBannerAd(modifier: Modifier = Modifier) {
val appaloo = remember { AppalooClient("{adID}") }
var hasAd by remember { mutableStateOf(true) }
var hasLoadedAd by remember { mutableStateOf(false) }
if (hasAd) {
AndroidView(
modifier = modifier.fillMaxWidth().height(64.dp),
factory = { ctx ->
appaloo.loadBanner(ctx, object : BannerCallbacks {
override fun onAdLoaded(adDetails: AdDetails) { hasLoadedAd = true }
override fun onAdLoadFailed(errorCode: Int, message: String) {
// Keep the current banner if an automatic refresh fails.
if (!hasLoadedAd) hasAd = false
}
})
},
)
}
}
@Composable
fun HomeScreen() {
Column {
// your app content
Spacer(Modifier.weight(1f))
AppalooBannerAd()
}
}
Anuncios de apertura
Los anuncios de apertura son anuncios breves a pantalla completa, adecuados para el arranque de la app o su regreso a primer plano.
import com.appaloo.AppalooClient
import com.appaloo.AdDetails
import com.appaloo.InterstitialCallbacks
class MainActivity : AppCompatActivity() {
private val appaloo = AppalooClient("{adID}")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
appaloo.loadAppOpen(this, object : InterstitialCallbacks {
override fun onAdLoaded(adDetails: AdDetails) {
Log.d("Appaloo", "App Open ad for ${adDetails.appName}")
}
override fun onAdLoadFailed(errorCode: Int, message: String) {
Log.w("Appaloo", "App Open failed: $errorCode - $message")
}
})
}
}
import com.appaloo.AppalooClient;
import com.appaloo.AdDetails;
import com.appaloo.InterstitialCallbacks;
public class MainActivity extends AppCompatActivity {
private final AppalooClient appaloo = new AppalooClient("{adID}");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// A brief full-screen ad for launch / return-to-foreground that
// auto-dismisses after ~5 seconds. Reuses InterstitialCallbacks.
appaloo.loadAppOpen(this, new InterstitialCallbacks() {
@Override
public void onAdLoaded(AdDetails adDetails) {
Log.d("Appaloo", "App Open ad for " + adDetails.getAppName());
}
@Override
public void onAdLoadFailed(int errorCode, String message) {
Log.w("Appaloo", "App Open failed: " + errorCode + " - " + message);
}
});
}
}
Seguridad de los datos
El SDK no recopila ningún identificador publicitario ni identificadores del dispositivo. Los únicos datos que informa son qué anuncios ve o toca un usuario, lo que mantiene breve tu formulario de Seguridad de los datos de Google Play.
Qué declarar
Declara los eventos de visualización y clic de anuncios en Actividad de la aplicación (Interacciones en la aplicación): se recopilan, se cifran en tránsito y no se vinculan a un identificador persistente. Elige Funcionalidad de la aplicación o Publicidad como finalidad, según cómo describas Appaloo.
Lo que el SDK no recopila
Sin ID de publicidad de Google (AAID), sin ANDROID_ID, sin información del dispositivo y sin ubicación. El SDK solicita únicamente el permiso INTERNET. No añadas el permiso AD_ID en su nombre.
Instalación
El SDK de Appaloo se distribuye como un XCFramework precompilado servido directamente desde nuestra CDN. Apunta a iOS 15+ y no incluye dependencias adicionales.
Xcode (Añadir paquete local)
Coloca este paquete Swift de un solo archivo en tu proyecto y, en Xcode, elige File → Add Package Dependencies → Add Local… y selecciona la carpeta. Xcode descarga y verifica el binario desde la CDN.
mkdir AppalooSDK && curl -fsSL \
https://download.appaloo.io/appaloo-sdk/ios/AppalooSDK/Package.swift \
-o AppalooSDK/Package.swift
Package.swift
O, si tu app es en sí un paquete Swift, declara el target binario directamente:
targets: [
.binaryTarget(
name: "AppalooSDK",
url: "https://download.appaloo.io/appaloo-sdk/ios/AppalooSDK-1.0.4.xcframework.zip",
checksum: "3aae03b7fb81068b71c4d45d3c302d32d6668308adb38060ac0498d4c2613ae0"
),
.target(name: "MyApp", dependencies: ["AppalooSDK"]),
]
Inicialización
Crea un AppalooClient con el UUID de tu anuncio. Si integras varios anuncios, puedes crear un cliente para cada uno: es un objeto ligero.
import AppalooSDK
private let appaloo = AppalooClient(adId: "{adID}")
Anuncios intersticiales
Los anuncios intersticiales son anuncios a pantalla completa que pueden servir como pausa natural entre pantallas o como un anuncio independiente activado por una acción del usuario.
Los usuarios pueden cerrar estos anuncios tras una cuenta atrás de 15 segundos o, en los anuncios de vídeo, cuando termina el vídeo.
import UIKit
import AppalooSDK
final class MainViewController: UIViewController, InterstitialCallbacks {
private let appaloo = AppalooClient(adId: "{adID}")
private func showAd() {
appaloo.loadInterstitial(from: self, callbacks: self)
}
func onAdLoaded(adDetails: AdDetails) {
print("Showing ad for \(adDetails.appName)")
}
func onAdLoadFailed(errorCode: Int, message: String) {
print("Ad failed: \(errorCode) - \(message)")
}
}
InterstitialCallbacks
public protocol InterstitialCallbacks: AnyObject {
func onAdLoaded(adDetails: AdDetails)
func onAdLoadFailed(errorCode: Int, message: String)
}
Anuncios recompensados
Los anuncios recompensados son anuncios de vídeo que premian al usuario por verlos completos. Suelen usarse para incentivar a los usuarios a completar una tarea o a interactuar con la app.
El mismo flujo que loadInterstitial, pero el SDK invoca onAdFinished solo después de que el usuario haya visto el anuncio completo. Concede tu recompensa dentro de este callback.
import UIKit
import AppalooSDK
final class GameViewController: UIViewController, RewardedCallbacks {
private let appaloo = AppalooClient(adId: "{adID}")
private func grantBonusLife() {
appaloo.loadRewarded(from: self, callbacks: self)
}
func onAdLoaded(adDetails: AdDetails) {
// Ad is on screen; do not credit yet.
}
func onAdFinished(adDetails: AdDetails) {
// User finished watching: credit the reward here.
player.lives += 1
}
func onAdLoadFailed(errorCode: Int, message: String) {
print("Reward unavailable (\(errorCode))")
}
}
RewardedCallbacks
public protocol RewardedCallbacks: AnyObject {
func onAdLoaded(adDetails: AdDetails)
func onAdFinished(adDetails: AdDetails)
func onAdLoadFailed(errorCode: Int, message: String)
}
Importante: otorga la recompensa únicamente dentro de onAdFinished. onAdLoaded se dispara en cuanto se renderiza el anuncio, antes de que el usuario lo haya visto.
Anuncios integrados
Los anuncios integrados son anuncios pequeños que se insertan en tu propio diseño. Puedes usarlos dentro de un feed de noticias, un directorio, una galería de fotos y mucho más.
import UIKit
import AppalooSDK
final class FeedViewController: UIViewController {
private let appaloo = AppalooClient(adId: "{adID}")
private func addInlineAd(to stack: UIStackView) {
// Returns a 100%-wide, ~275pt-tall card that fills itself in once an ad is
// served (and collapses if none is available). Tapping it expands the ad.
let adView = appaloo.loadInline()
stack.addArrangedSubview(adView)
}
}
En SwiftUI, envuélvela en un UIViewRepresentable:
import SwiftUI
import AppalooSDK
// Wrap the inline view for SwiftUI.
struct AppalooInlineAd: UIViewRepresentable {
let client: AppalooClient
func makeUIView(context: Context) -> AppalooInlineAdView { client.loadInline() }
func updateUIView(_ view: AppalooInlineAdView, context: Context) {}
}
struct FeedView: View {
let appaloo = AppalooClient(adId: "{adID}")
var body: some View {
List {
Text("A post")
AppalooInlineAd(client: appaloo).frame(height: 275)
Text("Another post")
}
}
}
Anuncios de banner
Los banners son una franja compacta anclada a todo el ancho. loadBanner devuelve un AppalooBannerAdView que colocas donde quieras, normalmente anclado en la parte inferior de la pantalla. Se rellena cuando se sirve un anuncio y se contrae a altura cero si no hay ninguno disponible.
import UIKit
import AppalooSDK
final class MainViewController: UIViewController, BannerCallbacks {
private let appaloo = AppalooClient(adId: "{adID}")
private func addBanner(to container: UIView) {
let adView = appaloo.loadBanner(callbacks: self)
adView.translatesAutoresizingMaskIntoConstraints = false
container.addSubview(adView)
NSLayoutConstraint.activate([
adView.leadingAnchor.constraint(equalTo: container.leadingAnchor),
adView.trailingAnchor.constraint(equalTo: container.trailingAnchor),
adView.bottomAnchor.constraint(equalTo: container.safeAreaLayoutGuide.bottomAnchor),
])
}
func onAdLoaded(adDetails: AdDetails) {
print("Banner for \(adDetails.appName)")
}
func onAdLoadFailed(errorCode: Int, message: String) {
print("Banner failed: \(errorCode) - \(message)")
}
}
En SwiftUI, envuélvela en un UIViewRepresentable:
import SwiftUI
import AppalooSDK
// Wrap the banner view for SwiftUI.
struct AppalooBannerAd: UIViewRepresentable {
let client: AppalooClient
func makeUIView(context: Context) -> AppalooBannerAdView { client.loadBanner() }
func updateUIView(_ view: AppalooBannerAdView, context: Context) {}
}
struct ContentView: View {
let appaloo = AppalooClient(adId: "{adID}")
var body: some View {
VStack {
Text("My app content")
Spacer()
AppalooBannerAd(client: appaloo).frame(height: 64)
}
}
}
Anuncios de apertura
Los anuncios de apertura son anuncios breves a pantalla completa, adecuados para el arranque de la app o su regreso a primer plano.
import UIKit
import AppalooSDK
final class AppCoordinator: InterstitialCallbacks {
private let appaloo = AppalooClient(adId: "{adID}")
func showAppOpenAd(from presenter: UIViewController) {
appaloo.loadAppOpen(from: presenter, callbacks: self)
}
func onAdLoaded(adDetails: AdDetails) {
print("App Open ad for \(adDetails.appName)")
}
func onAdLoadFailed(errorCode: Int, message: String) {
print("App Open failed: \(errorCode) - \(message)")
}
}
Seguridad de los datos
El SDK no recopila IDFA ni identificadores del dispositivo. Los únicos datos que informa son qué anuncios ve o toca un usuario y, como no lleva ningún identificador entre apps, no requiere el aviso de App Tracking Transparency.
Etiqueta de privacidad de la app
Declara los Datos publicitarios en Datos no vinculados contigo, marcados como No usados para rastrearte. Eso es todo lo que informa el SDK.
English
Français
Deutsch