アンインストールトラッキング
Firebase Cloud Messaging (FCM) を Singular SDK と連携することで、アプリの アンインストールをトラッキングし、ユーザーリテンションの測定と リエンゲージメントキャンペーンの最適化を実現します。
重要: Google は 2018 年 4 月に GCM API を非推奨にしました。 すべてのアンインストールトラッキングの実装には Firebase Cloud Messaging (FCM) を使用してください。
前提条件
Singular プラットフォームの設定
アプリでアンインストールトラッキングを実装する前に、Singular プラットフォーム でアプリを設定し、 Android アンインストールトラッキングのセットアップ に記載されている Android SDK + FCM 連携手順を完了してください。
システム要件
アンインストールトラッキングには Firebase Cloud Messaging と特定のデバイス 設定が必要です。
FCM 要件 ( 出典 ):
- Android バージョン: デバイスは Android 4.1 (API 16) 以上で動作している必要があります
- Google Play サービス: デバイスに Google Play ストアアプリ がインストールされている必要があります
- エミュレーターのサポート: Google API を搭載した Android 4.1+ エミュレーターがサポートされています
- 配布: Google Play ストア以外で配布されるアプリでも アンインストールトラッキングをサポートできます
注意: サポートされていない Android バージョンや Google Play サービスがないデバイスのユーザーは、アンインストールトラッキングの対象に なりません。
実装手順
手順 1: Firebase Cloud Messaging の統合
まだ設定されていない場合は、アプリに Firebase Cloud Messaging をセットアップ してください。
Google の公式ガイド Android で Firebase Cloud Messaging クライアントアプリをセットアップ に従ってください。これには以下が含まれます:
- Android プロジェクトに Firebase を追加
-
FCM SDK の依存関係を
app/build.gradleに追加 - Firebase Messaging Service クラスを作成
- 通知権限をリクエスト (Android 13+)
手順 2: AndroidManifest.xml の FCM 設定を確認
FCM サービスと権限の確認
アプリが Firebase Cloud Messaging とすでに連携されており、Android マニフェストが FCM メッセージを受信するための FirebaseMessagingService を宣言していることを確認してください。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.your.package">
<!-- FCM Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application>
<!-- App Firebase Messaging Service -->
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
重要:
.MyFirebaseMessagingService
を
FirebaseMessagingService
を継承するクラスの完全修飾名に置き換えてください。アプリ内で
com.google.firebase.MESSAGING_EVENT
インテントを処理するサービスは 1 つだけにしてください。
手順 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 トークンを登録してください。
Singular.setFCMDeviceToken()
は、
Singular.init()
の完了前に呼び出された場合や、トークン引数が
null
または空の場合、エラーを出さずに何もしません。トークン登録が機能していない
ように見える場合は、SDK が先に初期化されており、Firebase から返された
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 トークンはいつでも更新される可能性があります
(アプリ更新、デバイス復元など)。Singular を最新の状態に保つために、
必ず
onNewToken()
を実装してください。
代替の設定方法
初期化時にトークンを設定する
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 fcmDeviceToken);
withFCMDeviceToken
は、初期化時点で保持しているトークンを SDK にシードするだけです。トークン
更新のサブスクライブは行いません。Singular の記録を最新の状態に保つには、
引き続き
FirebaseMessagingService.onNewToken
を実装し、そこから
Singular.setFCMDeviceToken(newToken)
を呼び出す必要があります。この設定メソッドも、渡されたトークンが
null
または空の場合は、エラーを出さずに何もしません。
検証とトラブルシューティング
実装の検証
アンインストールトラッキングが正しく動作していることを確認します。
- ログを確認: FCM トークン登録がログに表示されることを確認
- トークン生成のテスト: 初回アプリ起動時にトークンが生成 されることを確認
- ダッシュボードの監視: 24〜48 時間後に Singular ダッシュ ボードでアンインストールトラッキングデータを確認
- トークン更新のテスト: アプリデータを消去し、トークンが 正しく更新されることを確認
よくある問題
- トークンが生成されない: FCM の依存関係が正しく追加され、 プロジェクトに Firebase が設定されていることを確認
-
トークンが更新されない:
onNewToken()コールバックが FirebaseMessagingService に実装されていることを確認 - データが欠落している: デバイスが FCM 要件 (Android 4.1+、 Google Play サービスのインストール) を満たしていることを確認
- 設定エラー: Singular プラットフォーム設定でアンインストール トラッキングが有効になっていることを確認
関連リソース: 詳細なトラブルシューティングについては、 アンインストールトラッキングセットアップガイド と Firebase Cloud Messaging ドキュメント を参照してください。