跳转到内容

AppLovin MAX

  1. 在 MAX 的 Account → General → Keys 复制 Event Key 并保存:
终端窗口
npx @kasskeep/cli ads credentials --id app_xxx --applovin-event-key-file - < ./max-event-key.txt

没有它,回调会返回 422 applovin_not_configured。

  1. 在 Ad Units 编辑激励广告位,设置 Server Side Callback URL。宏名称请原样保留:
https://api.kasskeep.com/v1/ads/applovin/<app_id>/s2s?event_id={EVENT_ID}&event_token={EVENT_TOKEN}&user_id={USER_ID}&ad_unit_id={AD_UNIT_ID}&amount={AMOUNT}&currency={CURRENCY}&custom_data={CUSTOM_DATA}&ts={TS}&platform={PLATFORM}&placement={PLACEMENT}&network_name={NETWORK_NAME}

GET .../apps/:app_id/ad-networks 会以 callback_path 返回这个字符串。

  1. 映射广告位:ads unit-set --id app_xxx --name revive --applovin a1b2c3d4e5f60718。
  2. 在客户端调用 AppLovinMAX.setUserId(appUserId),并把 customData 作为 RewardedAd.showAd 的第三个参数传入。Kasskeep.ads.showRewarded 会通过你的 provider 完成这两步。

{EVENT_TOKEN} 必须等于 sha1(EVENT_ID + Event Key) 的十六进制值,以常量时间比较;否则返回 400 invalid_signature。token 只覆盖事件 id,但每个事件 id 只记录一次,所以换一个 user_id 重放回调也拿不到第二份奖励。

MAX 参数 事件字段
user_id app_user_id
ad_unit_id network_ad_unit_id,映射为 ad_unit
amount reward_amount
currency reward_type
event_id network_transaction_id
custom_data custom_data
ts occurred_at
platform 顶层 platform

MAX 只为真实广告发送 S2S 回调,测试广告不发。开发期间请使用测试模式。

import AppLovinMAX, { RewardedAd } from "react-native-applovin-max";
import type { RewardedProvider } from "@kasskeep/react-native";
export const maxRewarded: RewardedProvider = {
network: "applovin",
setUserId: (appUserId) => AppLovinMAX.setUserId(appUserId),
showRewarded: ({ networkAdUnitId, customData }) =>
new Promise((resolve) => {
let rewarded = false;
const done = (status: "completed" | "skipped" | "failed") => {
RewardedAd.removeAdReceivedRewardEventListener();
RewardedAd.removeAdHiddenEventListener();
RewardedAd.removeAdDisplayFailedEventListener();
resolve({ status });
};
RewardedAd.addAdReceivedRewardEventListener(() => (rewarded = true));
RewardedAd.addAdHiddenEventListener(() => done(rewarded ? "completed" : "skipped"));
RewardedAd.addAdDisplayFailedEventListener(() => done("failed"));
RewardedAd.showAd(networkAdUnitId, undefined, customData);
}),
};

展示前先用 RewardedAd.loadAd 加载广告。