AppLovin MAX
- 在 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。
- 在 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}¤cy={CURRENCY}&custom_data={CUSTOM_DATA}&ts={TS}&platform={PLATFORM}&placement={PLACEMENT}&network_name={NETWORK_NAME}GET .../apps/:app_id/ad-networks 会以 callback_path 返回这个字符串。
- 映射广告位:
ads unit-set --id app_xxx --name revive --applovin a1b2c3d4e5f60718。 - 在客户端调用
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 回调,测试广告不发。开发期间请使用测试模式。
Provider 示例
Section titled “Provider 示例”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 加载广告。