卸载跟踪
通过将 Firebase Cloud Messaging (FCM) 与 Singular SDK 集成,跟踪应用程序的卸载情况,以衡量用户保留率并优化重新参与活动。
重要:Google 已于 2018 年 4 月弃用 GCM API。 所有卸载跟踪实施均使用 Firebase Cloud Messaging (FCM)。
前提条件
配置奇异平台
在应用程序中实施卸载跟踪之前,请按照 "设置 Android 卸载跟踪 "指南在 Singular 平台中配置您的应用程序。
系统要求
卸载跟踪需要 Firebase Cloud Messaging 和特定的设备配置。
FCM 要求(源):
- 安卓版本:设备必须运行 Android 4.1 (API 16) 或更高版本
- Google Play 服务:设备必须安装 Google Play Store 应用程序
- 模拟器支持:支持带有 Google API 的 Android 4.1 或更高版本模拟器
- 分发:应用程序可在 Google Play Store 之外分发,同时仍支持卸载跟踪
注意:不支持的 Android 版本或没有 Google Play 服务的设备上的用户将不会被跟踪卸载。
实施步骤
第 1 步:整合 Firebase 云消息服务
在您的应用程序中设置 Firebase 云消息(如果尚未配置)。
请按照谷歌官方指南在 Android 上设置 Firebase 云消息客户端应用程序。 其中包括
- 将 Firebase 添加到您的 Android 项目中
-
在
app/build.gradle中添加 FCM SDK 依赖关系 - 创建一个 Firebase 消息服务类
- 申请通知权限(Android 13+)
第2步:配置AndroidManifest.xml
在 Android 清单中注册 Firebase 消息服务,以接收 FCM 消息。
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
重要:将.MyFirebaseMessagingService 替换为扩展FirebaseMessagingService 的类的完整限定名称。
步骤 3:注册 FCM 设备令牌
读取FCM设备令牌并将其发送给Singular,以便卸载跟踪。
获取并设置令牌
获取FCM令牌,并在SDK初始化后立即向Singular注册。
import com.google.firebase.messaging.FirebaseMessaging
import com.singular.sdk.Singular
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initialize Singular SDK
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
Singular.init(applicationContext, config)
// Retrieve and register FCM token
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "Fetching FCM token failed", task.exception)
return@addOnCompleteListener
}
// Get FCM token
val token = task.result
// Register token with Singular
Singular.setFCMDeviceToken(token)
Log.d("FCM", "FCM token registered with Singular: $token")
}
}
}
import com.google.firebase.messaging.FirebaseMessaging;
import com.singular.sdk.Singular;
import com.singular.sdk.SingularConfig;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize Singular SDK
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET");
Singular.init(getApplicationContext(), config);
// Retrieve and register FCM token
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w("FCM", "Fetching FCM token failed", task.getException());
return;
}
// Get FCM token
String token = task.getResult();
// Register token with Singular
Singular.setFCMDeviceToken(token);
Log.d("FCM", "FCM token registered with Singular: " + token);
}
});
}
}
最佳做法:在Singular.init() 后立即注册 FCM 令牌,以确保卸载跟踪从第一个应用程序会话开始启用。
处理令牌刷新
每当 FCM 令牌刷新时,就用 Singular 更新令牌,以保持准确的卸载跟踪。
import com.google.firebase.messaging.FirebaseMessagingService
import com.singular.sdk.Singular
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// Send updated token to Singular
Singular.setFCMDeviceToken(token)
Log.d("FCM", "New FCM token registered: $token")
// Also send token to your server if needed
sendTokenToServer(token)
}
private fun sendTokenToServer(token: String) {
// Implement your server communication logic here
}
}
import com.google.firebase.messaging.FirebaseMessagingService;
import com.singular.sdk.Singular;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(@NonNull String token) {
super.onNewToken(token);
// Send updated token to Singular
Singular.setFCMDeviceToken(token);
Log.d("FCM", "New FCM token registered: " + token);
// Also send token to your server if needed
sendTokenToServer(token);
}
private void sendTokenToServer(String token) {
// Implement your server communication logic here
}
}
重要:FCM 令牌可随时刷新(应用程序更新、设备还原等)。请始终执行onNewToken() 以保持 Singular 的更新。
其他配置方法
在初始化过程中设置令牌
如果在 SDK 初始化之前就有 FCM 令牌,可在SingularConfig 对象中进行配置。
// Get token synchronously (if cached)
val cachedToken = getStoredFCMToken() // Your caching logic
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
.withFCMDeviceToken(cachedToken)
Singular.init(applicationContext, config)
// Get token synchronously (if cached)
String cachedToken = getStoredFCMToken(); // Your caching logic
SingularConfig config = new SingularConfig("SDK_KEY", "SDK_SECRET")
.withFCMDeviceToken(cachedToken);
Singular.init(getApplicationContext(), config);
方法签名:
public SingularConfig withFCMDeviceToken(String token)
验证和故障排除
验证实施
确认卸载跟踪工作正常。
- 检查日志:验证 FCM 令牌注册是否出现在日志中
- 测试令牌生成:确保首次启动应用程序时生成令牌
- 监控仪表盘:检查 Singular 仪表板,查看 24-48 小时后的卸载跟踪数据
- 测试令牌刷新:清除应用程序数据并验证令牌更新是否正确
常见问题
- 令牌未生成:验证是否正确添加了 FCM 依赖项,是否在项目中配置了 Firebase
-
令牌未更新:检查您的 FirebaseMessagingService 是否实现了
onNewToken()回调 - 缺少数据:确保设备满足 FCM 要求(Android 4.1+,已安装 Google Play 服务
- 配置错误:确认已在 Singular 平台设置中启用卸载跟踪功能
其他资源:有关详细的故障排除,请参阅《卸载跟踪设置指南》和Firebase Cloud Messaging 文档。