更新记录

1.0.0(2026-07-14)

插件首次发布


平台兼容性

uni-app(4.71)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × 5.0 12 ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.71)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 12 × ×

gt-appsflyer-uts

适用于 uni-app、uni-app x 的 AppsFlyer 移动归因插件,支持 Android 和 iOS。

插件提供 SDK 初始化、应用内事件上报、安装归因、App Open Attribution、统一深度链接(UDL)、AppsFlyer UID、GAID/IDFA、客户用户 ID、OneLink 邀请链接、邀请事件、卸载测量和 iOS ATT 授权等能力。

支持平台

平台 最低版本 AppsFlyer SDK 版本
Android Android 5.0(API 21) af-android-sdk:6.15.2
iOS iOS 12.0 AppsFlyerFramework:6.15.3

仅支持 App-Android 和 App-iOS,不支持 Web、小程序和 HarmonyOS。

使用前准备

1. 配置 AppsFlyer 应用

  1. 登录 AppsFlyer 后台并添加应用。
  2. Android 应用填写与打包项目一致的包名。
  3. iOS 应用填写与打包项目一致的 Bundle ID,并取得 App Store 数字 ID。
  4. 在 AppsFlyer 后台取得 Dev Key,初始化插件时通过 devKey 传入。

调试基座、正式包的 Android 包名和 iOS Bundle ID 必须与 AppsFlyer 后台登记的信息一致。iOS 的 App Store ID 只填写数字,不要包含 id 前缀。

2. 制作自定义基座

本插件包含 Android、iOS 原生 SDK,标准基座不包含插件代码。安装插件或升级插件版本后,需要重新制作并安装对应平台的自定义基座;直接云端正式打包时,重新提交正式包即可。

3. Android 注意事项

  • 最低支持 Android 5.0(API 21)。
  • 插件依赖 Install Referrer 和 Google Advertising ID 组件。
  • 使用 getGaid 或广告标识相关归因能力时,应根据应用投放地区、上架商店要求和用户授权情况完成隐私披露。
  • collectAndroidIdcollectImei 默认关闭,仅在业务确有需要且符合隐私要求时开启。

4. iOS 注意事项

  • 最低支持 iOS 12.0,仅包含真机所需的 arm64 架构。
  • 插件已包含 NSUserTrackingUsageDescription,上架前请在 utssdk/app-ios/Info.plist 中改成与应用实际用途一致的说明。
  • iOS 14 及以上读取有效 IDFA 前,需要通过 requestTrackingAuthorization 请求 ATT 授权。
  • 如需等待 ATT 结果后再发送归因数据,可在 initSdk 中设置 waitForAttAuthorizationSeconds,并在超时时间内请求 ATT。
  • Windows 上调试 iOS UTS 插件时,需要云端制作包含本插件的 iOS 自定义基座。

5. OneLink 与深度链接

使用 OneLink 邀请链接或 UDL 前,需要先在 AppsFlyer 后台创建 OneLink 模板,并按照 AppsFlyer 要求配置 Android App Links、iOS Universal Links 及关联域名。inviteOneLinkTemplateId 填写 OneLink 模板 ID。

引入插件

import {
  setRequestListener,
  setConversionListener,
  setDeepLinkListener,
  initSdk,
  logEvent,
  setCustomerUserId,
  getAppsFlyerUID,
  getSdkVersion,
  getGaid,
  generateInviteLink,
  logInvite,
  stop,
  updateServerUninstallToken,
  requestTrackingAuthorization
} from '@/uni_modules/gt-appsflyer-uts'

初始化

建议先注册需要的监听器,再调用一次 initSdk。重复初始化会返回 code: 400

setRequestListener((res) => {
  console.log('AppsFlyer 启动结果:', res)
})

setConversionListener((res) => {
  console.log('AppsFlyer 安装归因结果:', res)
})

setDeepLinkListener((res) => {
  console.log('AppsFlyer 深度链接结果:', res)
})

const config = {
  devKey: '你的 AppsFlyer Dev Key',
  appleAppStoreId: '你的 iOS App Store 数字 ID',
  debugMode: false,
  observeInstallAttribution: true,
  observeDeferredDeepLinks: true,
  waitForAttAuthorizationSeconds: 60
} as UTSJSONObject

initSdk(config, (res) => {
  console.log('AppsFlyer 初始化结果:', res)
})

setRequestListenerinitSdk 的回调都会收到 SDK 启动结果;不需要两份启动日志时,保留其中一种即可。

页面级注册长期监听时,建议在页面卸载时解除,避免已经销毁的页面继续接收回调:

onUnload(() => {
  setRequestListener(null)
  setConversionListener(null)
  setDeepLinkListener(null)
})

initSdk 配置

字段 类型 必填 平台 默认值 说明
devKey string Android、iOS - AppsFlyer Dev Key。
appleAppStoreId string iOS 是 iOS '' App Store 数字 ID,不含 id 前缀。也可使用字段名 appId
debugMode boolean Android、iOS false 是否开启 AppsFlyer 调试日志,正式环境建议关闭。
observeInstallAttribution boolean Android、iOS true 是否向 setConversionListener 分发安装归因和 App Open Attribution。
observeDeferredDeepLinks boolean Android、iOS true 是否向 setDeepLinkListener 分发 UDL 结果。
inviteOneLinkTemplateId string Android、iOS '' OneLink 模板 ID,必须在 SDK 启动前设置。
waitForAttAuthorizationSeconds number iOS 0 等待 ATT 授权的最长秒数。大于 0 时生效。
collectAndroidId boolean Android false 是否采集 Android ID。开启前请完成合规评估。
collectImei boolean Android false 是否采集 IMEI。开启前请完成权限与合规评估。

API

setRequestListener

监听 SDK 启动结果。code: 200 表示启动成功,code: 440 表示启动失败。传空参数可解除监听。

setRequestListener((res) => {
  console.log(res.code, res.msg)
})

setConversionListener

监听安装归因与 App Open Attribution。payload 是 JSON 字符串。

code 事件 说明
201 conversionData 安装或转化数据。
202 appOpenAttribution App Open Attribution 数据。
401 attributionFailure App Open Attribution 失败。
402 conversionDataFail 安装归因数据获取失败。

安装归因通常与首次安装、首次启动及 AppsFlyer 后台归因状态有关,不会在每次调用 initSdk 时都返回新数据。

setDeepLinkListener

监听 AppsFlyer 统一深度链接结果。成功时返回 code: 203,链接信息位于 payload JSON 字符串中。传空参数可解除监听。

setDeepLinkListener((res) => {
  const payloadText = res.payload
  if (payloadText != null) {
    console.log('深度链接数据:', payloadText)
  }
})

logEvent

上报应用内事件。事件参数支持字符串、数字和布尔值。

const eventParams = {
  af_revenue: 9.99,
  af_currency: 'USD',
  af_content_id: 'demo_sku'
} as UTSJSONObject

logEvent('af_purchase', eventParams, (res) => {
  console.log('事件上报结果:', res)
})

无事件参数时,第二个参数传 null

setCustomerUserId

设置业务侧用户 ID。建议在 initSdk 前设置,以便后续归因数据关联用户。

setCustomerUserId('user_10001', (res) => {
  console.log('用户 ID 设置结果:', res)
})

getAppsFlyerUID

获取 AppsFlyer UID,成功结果的 payload 格式为 {"appsFlyerUID":"..."}

getAppsFlyerUID((res) => {
  console.log('AppsFlyer UID:', res.payload)
})

getSdkVersion

获取当前 AppsFlyer SDK 版本,成功结果的 payload 格式为 {"version":"..."}

getSdkVersion((res) => {
  console.log('SDK 版本:', res.payload)
})

getGaid

获取广告标识符。为方便跨平台统一调用,iOS 仍使用方法名 getGaid

  • Android:payload 包含 gaidisLimitAdTrackingEnabled
  • iOS:payload 包含 idfa。用户未授权 ATT 时,可能返回全零 IDFA。
getGaid((res) => {
  console.log('广告标识结果:', res.payload)
})

generateInviteLink

生成 OneLink 用户邀请链接。调用前需在 initSdk 中配置 inviteOneLinkTemplateId

const inviteOptions = {
  channel: 'app_invite',
  campaign: 'invite_campaign',
  deeplinkPath: 'invite/detail',
  userParams: {
    af_sub1: 'user_10001'
  }
} as UTSJSONObject

generateInviteLink(inviteOptions, (res) => {
  console.log('邀请链接:', res.payload)
})
字段 类型 必填 说明
channel string 邀请渠道。
campaign string 邀请活动名称。
brandDomain string AppsFlyer 后台已配置的品牌域名。
referrerName string 邀请人名称。
referrerImageUrl string 邀请人图片 URL。
deeplinkPath string 深度链接路径。
baseDeeplink string 基础深度链接。
userParams UTSJSONObject 添加到邀请链接中的自定义参数。

成功结果的 payload 格式为 {"url":"..."}

logInvite

记录邀请事件。

const invitePayload = {
  referrerId: 'user_10001'
} as UTSJSONObject

logInvite('app_invite', invitePayload, (res) => {
  console.log('邀请事件结果:', res)
})

stop

暂停或恢复 AppsFlyer SDK。传 true 暂停数据发送,传 false 恢复。

stop(true, (res) => {
  console.log('暂停结果:', res)
})

updateServerUninstallToken

向 AppsFlyer 注册卸载测量 Token。

  • Android:传入 FCM Token 字符串。
  • iOS:传入 APNs deviceToken 的十六进制或 Base64 字符串。
updateServerUninstallToken('你的 FCM 或 APNs Token', (res) => {
  console.log('卸载 Token 更新结果:', res)
})

卸载测量还需要在 Firebase、APNs 和 AppsFlyer 后台完成相应配置,仅调用该方法不能独立完成卸载测量接入。

requestTrackingAuthorization

请求 iOS ATT 授权。Android 调用时返回成功,msgnot applicable on Android

requestTrackingAuthorization((res) => {
  console.log('ATT 授权结果:', res.payload)
})

iOS 14 及以上的 payload.status 对应系统原始状态:0 未决定、1 受限制、2 拒绝、3 已授权;iOS 14 以下返回 -1

返回结果

所有异步 API 使用统一回调结构:

{
  code: 200,
  msg: 'ok',
  payload: '{"key":"value"}'
}
字段 类型 说明
code number 状态码。200 表示普通调用成功,监听事件会使用 201202203
msg string 结果或错误说明。
payload string 可选的 JSON 字符串。使用前先判断是否为 null

状态码说明

code 类型 回调来源 说明
200 成功 所有普通 API、setRequestListener 调用成功或 SDK 启动成功。具体结果查看 msg,有返回数据时读取 payload
201 成功事件 setConversionListener 收到安装或转化数据,payload 为归因数据 JSON 字符串。
202 成功事件 setConversionListener 收到 App Open Attribution 数据,payload 为归因数据 JSON 字符串。
203 成功事件 setDeepLinkListener 收到统一深度链接(UDL)数据,payload 为深度链接 JSON 字符串。
400 失败 普通 API 参数错误、上下文不可用、重复初始化、JSON 无效或原生 API 调用失败。具体原因查看 msg
401 失败事件 setConversionListener App Open Attribution 失败,错误信息位于 msg
402 失败事件 setConversionListener 安装或转化数据获取失败,错误信息位于 msg
440 失败 initSdksetRequestListener AppsFlyer SDK 启动失败,原生错误信息位于 msg

201202203 都是成功的监听事件,不应当作为错误处理。普通 API 通常使用 code == 200 判断成功;监听器应根据具体事件码分别处理:

setConversionListener((res) => {
  if (res.code == 201) {
    console.log('安装或转化数据:', res.payload)
  } else if (res.code == 202) {
    console.log('App Open Attribution:', res.payload)
  } else if (res.code == 401 || res.code == 402) {
    console.error('归因回调失败:', res.msg)
  }
})

setDeepLinkListener((res) => {
  if (res.code == 203) {
    console.log('深度链接数据:', res.payload)
  } else {
    console.error('深度链接处理失败:', res.msg)
  }
})

隐私与合规

AppsFlyer SDK 可能处理设备标识符、广告标识符、IP 地址、应用信息、安装信息和应用内事件,并将相关数据发送至 AppsFlyer 服务。开发者需要根据实际启用能力完成以下工作:

  • 在应用隐私政策中说明 AppsFlyer 的数据处理目的、类型和共享对象。
  • 按投放地区和应用商店要求,在采集广告标识符或上报事件前取得必要授权。
  • 在 Google Play 数据安全、App Store App Privacy 等上架表单中如实申报。
  • 不要在调试日志中长期输出归因数据、广告标识符或用户标识。

AppsFlyer 的具体数据处理规则以 AppsFlyer 隐私政策和开发者后台配置为准。

常见问题

  • 运行时提示插件不存在:当前安装的基座未包含本插件,请重新制作并安装自定义基座。
  • Android 没有安装归因数据:确认包名、Dev Key、Install Referrer、AppsFlyer 后台应用状态及测试设备是否按 AppsFlyer 测试流程重新安装。
  • iOS 没有安装归因数据:确认 Bundle ID、App Store ID、Dev Key 与 AppsFlyer 后台一致,并按测试流程重新安装应用。
  • IDFA 为全零:用户尚未授权 ATT、已拒绝授权或系统限制了广告跟踪。
  • 没有深度链接回调:确认 OneLink 模板、关联域名、Android App Links、iOS Universal Links 和 AppsFlyer 后台配置完整。
  • payload 无法直接读取字段:payload 是 JSON 字符串,需要先判空再解析。

AppsFlyer 官方开发文档:https://dev.appsflyer.com/hc/

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.INTERNET, android.permission.ACCESS_NETWORK_STATE, com.google.android.gms.permission.AD_ID;iOS 使用 IDFA/ATT 时需要 NSUserTrackingUsageDescription。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件通过 AppsFlyer 官方 SDK 采集并向 AppsFlyer 服务发送用于移动归因、广告效果衡量和深度链接分析的数据,可能包括设备标识符、广告标识符、应用信息、设备信息、IP 地址、安装及应用内事件。实际采集范围取决于开发者配置、用户授权和 AppsFlyer SDK 策略。插件不会将这些数据上传至插件作者服务器;AppsFlyer 的数据处理规则请参阅:https://www.appsflyer.com/cn/legal/privacy-policy/

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。