Android
Firebase Cloud Messaging
サーチ…
前書き
Firebase Cloud Messaging(FCM)は、クロスプラットフォームのメッセージングソリューションであり、確実にメッセージを確実に配信できます。
FCMを使用すると、新しい電子メールやその他のデータが同期できることをクライアントアプリケーションに通知できます。通知メッセージを送信して、ユーザーの再接続と保持を促すことができます。インスタントメッセージングなどのユースケースの場合、メッセージは最大4KB
ペイロードをクライアントアプリケーションに転送できます。
AndroidでFirebase Cloud Messaging Clientアプリケーションを設定する
インストールと設定の部分を完了して、あなたのアプリをFirebaseに接続します。
これでFirebaseにプロジェクトが作成されます。Firebase Cloud Messagingの依存関係をモジュールレベルの
build.gradle
ファイルに追加します:
dependencies {
compile 'com.google.firebase:firebase-messaging:10.2.1'
}
これで、AndroidでFCMを操作する準備が整いました。
FCMクライアントでは、 Android 2.3
以上を搭載し、Google Playストアアプリをインストールした端末、Android 2.3搭載のGoogle APIを搭載した端末が必要です。
AndroidManifest.xml
ファイルを編集する
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
登録トークン
FCM SDKは、アプリケーションの初期起動時に、クライアントアプリケーションインスタンス用の登録トークンを生成します。
単一のデバイスをターゲットにする、またはデバイスグループを作成する場合は、 FirebaseInstanceIdService
を拡張してこのトークンにアクセスする必要があります。
新しいトークンが生成されるたびにonTokenRefresh
コールバックがonTokenRefresh
、 FirebaseInstanceID.getToken()
メソッドを使用して現在のトークンを取得できます。
例:
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
}
私はあなたのwebViewで開くための画像、メッセージ、およびリンクをプッシュするために私のアプリで実装しているこのコード
これは私のFirebaseMessagingServiceです
public class MyFirebaseMessagingService extends FirebaseMessagingService {
Bitmap bitmap;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
String message = remoteMessage.getData().get("message");
//imageUri will contain URL of the image to be displayed with Notification
String imageUri = remoteMessage.getData().get("image");
String link=remoteMessage.getData().get("link");
//To get a Bitmap image from the URL received
bitmap = getBitmapfromUrl(imageUri);
sendNotification(message, bitmap,link);
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private void sendNotification(String messageBody, Bitmap image, String link) {
Intent intent = new Intent(this, NewsListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("LINK",link);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setLargeIcon(image)/*Notification icon image*/
.setSmallIcon(R.drawable.hindi)
.setContentTitle(messageBody)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(image))/*Notification with Image*/
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
public Bitmap getBitmapfromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}}
これはMainActivityでWebViewや他のブラウザのリンクを開き、必要に応じてインテントでリンクを開きます。
if (getIntent().getExtras() != null) {
if (getIntent().getStringExtra("LINK")!=null) {
Intent i=new Intent(this,BrowserActivity.class);
i.putExtra("link",getIntent().getStringExtra("LINK"));
i.putExtra("PUSH","yes");
NewsListActivity.this.startActivity(i);
finish();
}}
メッセージを受け取る
メッセージを受信するには、 FirebaseMessagingService
を拡張してonMessageReceived
メソッドをオーバーライドするサービスを使用します。
public class MyFcmListenerService extends FirebaseMessagingService {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
@Override
public void onMessageReceived(RemoteMessage message) {
String from = message.getFrom();
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
Map<String, String> data = message.getData();
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
//.....
}
アプリがバックグラウンドにあるとき、Androidはシステムトレイに通知メッセージを送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。
これには、通知とデータペイロード(および通知コンソールから送信されたすべてのメッセージ)の両方を含むメッセージが含まれます。このような場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティの意図の余分に配信されます。
ここで簡単な要約:
アプリ状態 | お知らせ | データ | 両方 |
---|---|---|---|
前景 | onMessageReceived | onMessageReceived | onMessageReceived |
バックグラウンド | システムトレイ | onMessageReceived | 通知:システムトレイ |
データ:意図の余分なもの。 |
トピックを購読する
クライアントアプリケーションは既存のトピックを購読することも、新しいトピックを作成することもできます。クライアントアプリケーションが新しいトピック名に加入すると、その名前の新しいトピックがFCMで作成され、その後、どのクライアントもそのトピックにサブスクライブできます。
トピックを購読するには、トピック名を指定してsubscribeToTopic()
メソッドを使用しsubscribeToTopic()
。
FirebaseMessaging.getInstance().subscribeToTopic("myTopic");