拉活服务技术接入文档更新时间: 2024-10-09 11:32:00

一、拉活服务

  • 拉活服务、拉活归因只有在4.70.0(versionCode: 40005440)及以上版本的小米应用商店客户端才支持。
  • 拉活服务基于直投2.0 开发,在不支持的机型(Pad和Fold)、不支持的模式(极简模式和无障碍模式)下,均无法使用拉活服务
上传文件

1、接入拉活服务

接入直投2.0时,需要申请开通直投2.0拉活服务能力【按需开通拉活能力、拉活状态回传、拉活归因能力】。开通后,生成直投dp时,需要拼接 milaunch=true参数,此参数参与直投签名的鉴权。

如dp:  mimarket://details?detailStyle=1&milaunch=true&xxx

2、接入拉活状态回传能力

通过接入拉活状态回传,小米应用商店会将拉活结果信息回传给调用的媒体APP。拉活状态回传能力通过后台配置更改来支持,与调用方的本身的权限相关,不需要使用deeplink来控制。
2.1 需要注册的广播

action:com.xiaomi.market.DIRECT_MAIL_STATUS

2.2 回传的参数信息

参数 描述 类型
packageName 目标应用包名 String
statusCode 6001 [未安装应用] 鉴权通过时,发送此code,表示打开了商店详情页 int
6002 [已安装应用] 鉴权通过时,打开了应用首页或者三方详情页
6003 [已安装应用] 鉴权未通过,打开了商店详情页

2.3 示例代码

object DirectMailStatusReceiver: BroadcastReceiver() {
val DM_STATUS = "com.xiaomi.market.DIRECT_MAIL_STATUS"

fun register(){
appContext.registerReceiver(this, IntentFilter(DM_STATUS))
}

override fun onReceive(context: Context?, intent: Intent?) {
when(intent?.action){
DM_STATUS ->{
val data = intent.extras
var statusCode = data?.getInt("statusCode")
var packageName = data?.getString("packageName")
}
}
}
}

3、接入拉活归因查询能力

说明

  • 应用只能查询其自身的归因信息
  • 用户手动清空小米应用商店缓存,会造成归因数据的缺失。
  • 用户卸载应用后,小米应用商店缓存的归因信息会丢失。
  • 对于同一包名,新保存的归因信息,会覆盖旧的归因信息。

3.1.归因参数查询

小米应用商店客户端提供查询接口,供三方调用,使用provider查询标准接口
var cursor = contentResolver.query(uri, null, null, null, null)

注意
使用该接口将涉及contentResolver的获取,ContentResolver对象会与小米应用商店进行通信,部分场景下将被识别为关联启动,请您注意如下。

  • 需要在隐私声明中加上关联启动相关条例。
  • 获取用户隐私同意后,再进行接口的调用。

3.2.请求参数

参数 类型
uriString String content://com.xiaomi.market.provider.DirectMailProvider/referrer/v3
projection String[] null
selection String null
selectionArgs String[] null
sortOrder String null

3.3.查询结果

  • 返回cursor中,如果有拉活归因信息,则查询 "launch_referrer"时,有值。对应信息为拉活信息的jsonString.
  • 返回cursor中,如果没有"launch_referrer",或者"launch_referrer"对应的value为空,则表明无拉活归因信息。
Cursor key 格式 字段定义 说明 Json 中参数key 类型 默认态 说明
package_name String 广告主应用包名
launch_referrer Json String 拉活归因信息 Json 中封装了按需返回的拉活归因信息。json中的参数key 为:
referrer、click_time、version、conversion_type、app_client_id、sign、is_first_open
referrer String 返回 拉活归因参数。格式为url参数格式,并且经过url encode处理,包含了callback/campaignId等归因信息。示例如下callback%3Dxxx%26adId%3D100161912%26campaignId%3D100057277%26groupId%3D100053825
click_time Long 返回 调起目标应用的客户端本地时间(单位:毫秒)
conversion_type String 返回 转化类型. download:下载; active:拉活
is_first_open Int 返回 是否当日首次调起。 0-否;1-是。
app_client_id String - 广告平台标识id
sign String - 调起签名
version Int 返回 商店拉活归因版本

3.4.示例

private val TAG = "ReferrerTest"
private val PROVIDER_URI = "content://com.xiaomi.market.provider.DirectMailProvider/referrer/v3"
const val PACKAGE_NAME = "package_name"
const val INSTALL_REFERRER = "install_referrer"
const val LAUNCH_REFERRER = "launch_referrer"

private fun getReferrerInfoTest(path: String): String? {
var testReferrerStr = ""
var packageName: String? = null
var installReferrer: String? = null
var launchReferrer: String? = null
var cursor: Cursor? = null
val uri: Uri = Uri.parse(PROVIDER_URI + path)
val contentResolver: ContentResolver = contentResolver
try {
cursor = contentResolver.query(uri, null, null, null, null)
if (cursor != null) {
cursor.moveToFirst()
packageName = getStringOrNull(cursor, PACKAGE_NAME)
installReferrer = getStringOrNull(cursor, INSTALL_REFERRER)
launchReferrer = getStringOrNull(cursor, LAUNCH_REFERRER)

val iterator = cursor.columnNames.iterator()
while (iterator.hasNext()) {
val columnName = iterator.next()
val value = when (columnName) {
PACKAGE_NAME -> packageName
INSTALL_REFERRER -> installReferrer
LAUNCH_REFERRER -> launchReferrer

else -> null
}
Log.i(TAG, "当前返回key 为: $columnName --> vaule 为: $value")
testReferrerStr += " $columnName -> $value , \n"

}

} else {
testReferrerStr = null
Log.i(TAG, "cursor = null")
}
} catch (e: Exception) {
//处理异常
Log.e(TAG, "${e.message}")
} finally {
cursor?.close()
}
return testReferrerStr
}

private fun getStringOrNull(cursor: Cursor, column: String): String? {
return if (cursor.columnNames.contains(column)) {
cursor.getStringOrNull(cursor.getColumnIndexOrThrow(column))
} else {
null
}
}

二、注意事项

  1. 使用拉活服务需优先接入直投2.0,直投2.0技术接入文档
  2. 接入完成后,小米应用商店为您分配的业务编码(appClientId)和密钥请注意妥善保存
  3. 本文使用的deeplink必须由广告服务端生成然后下发到广告sdk,一定不要在客户端生成
  4. 一个deeplink只能单台设备使用
  5. 生成deeplink时建议实时生成,目前默认24小时后deeplink会过期,如果nonce中的时间戳过期会鉴权失败

文档内容是否有帮助?
有帮助
无帮助