在 Android 上解密 Meta Install Referrer
Facebook 和 Instagram 能告诉你的应用,一次安装来自哪个广告系列、广告组和广告,浏览归因也包括在内。数据用只有你持有的密钥加密。
Google Play Install Referrer 只带同一会话内完成安装的 Meta 广告点击。其余的由 Meta Install Referrer 补上:Facebook、Instagram 和 Facebook Lite 应用会记下用户看过或点过的广告,再交给你的应用。
Play Install Referrer
- 同一会话内的点击
- 加密的 Meta 数据
- 也带 Google Ads 点击
Meta Install Referrer
- 点击、浏览和更早的会话
- 加密方式相同,密钥相同
- 区分点击还是浏览
开始之前
一个 Android 应用安装广告系列
投放在 Facebook、Instagram 或 Audience Network 上。
你的 Facebook App ID
广告实际使用的那个。
解密密钥
Meta for Developers › App settings › Basic › Android。需要管理员权限。
1. 首次启动时读取
AndroidManifest.xml
<queries>
<package android:name="com.facebook.katana" />
<package android:name="com.instagram.android" />
<package android:name="com.facebook.lite" />
</queries>Kotlin
val providers = listOf(
"com.facebook.katana.provider.InstallReferrerProvider",
"com.instagram.contentprovider.InstallReferrerProvider",
"com.facebook.lite.provider.InstallReferrerProvider",
)
fun readMetaReferrer(context: Context, facebookAppId: String): String? {
for (authority in providers) {
val uri = Uri.parse("content://$authority/$facebookAppId")
runCatching { context.contentResolver.query(uri, null, null, null, null) }
.getOrNull()?.use { cursor ->
if (cursor.moveToFirst()) {
return cursor.getString(cursor.getColumnIndexOrThrow("install_referrer"))
}
}
}
return null
}2. 在服务器上解密
绝不要把密钥打包进应用,谁解包 APK 都能读到。
Node.js
import crypto from 'node:crypto';
export function decryptMetaReferrer(installReferrer, keyHex) {
const {utm_content} = JSON.parse(installReferrer);
const {source} = typeof utm_content === 'string' ? JSON.parse(utm_content) : utm_content;
const sealed = Buffer.from(source.data, 'hex');
const decipher = crypto.createDecipheriv('aes-256-gcm', Buffer.from(keyHex, 'hex'), Buffer.from(source.nonce, 'hex'));
decipher.setAuthTag(sealed.subarray(-16));
return JSON.parse(Buffer.concat([decipher.update(sealed.subarray(0, -16)), decipher.final()]).toString());
}字段名整体错开了一级
campaign_groupcampaignadgroup
campaign_group
广告系列
广告管理工具里的“广告系列”。
campaign
广告组
不是广告系列。
adgroup
广告
用户看到的那条创意。
返回为空的时候
用 Appy,粘贴一次密钥就行
在 Enterprise 套餐中,你在后台添加密钥,在 SDK 里设置 App ID。解密在 Appy 的服务器上完成。
首次启动
Android,Appy SDK
- 点了你的 Appy 链接归到该链接
- Meta 广告,点击或浏览广告系列、广告组、广告
- Google Ads 点击归到 Google Ads
- 以上都不是自然量
延伸阅读
常见问题
解密密钥在哪里?
Meta for Developers 中,App settings › Basic 的 Android 部分。
Meta 用的是什么加密方式?
AES-256-GCM,密钥为 64 个十六进制字符。
包含浏览归因的安装吗?
包含。is_ct 为 0 表示浏览,为 1 表示点击。
campaign_name 就是广告系列吗?
不是,它是广告组。广告系列是 campaign_group_name。
继续探索
不用 SDK 的延迟深度链接:底层到底是怎么运作的
不嵌入归因 SDK,也能把链接意图带过应用安装这道坎。本文讲清 Android 和 iOS 上什么能真正穿过商店边界、什么会断掉,以及每种变通方案的隐私代价。
看清每次安装来自哪条链接:Appy 的 iOS 与 Android SDK
Appy 的链接现在能跟到应用商店之后。新的 SDK 为每条链接、每个二维码、每个营销活动统计安装、应用内事件和收入,还让新用户第一次打开就进入对的页面。
Chrome 让每部手机都自称 Android 10
Android 上的 Chrome 把每部手机都报成 Android 10、型号 K。这给延迟深度链接的匹配带来了什么问题,为什么 Critical-CH 会把每次点击算两遍,以及 Client Hints 如何找回真实的版本和型号。
想看更多内容?浏览 博客全部主题.