Mobil Informatikai Rendszerek FCM – Firebase Cloud Messaging GCM, C2DM, Push notification
2016. november 13.
Sicz-Mesziár János sicz- m e sziar.janos @ nik. u ni - ob u d a.h u
Push notification A Push notification lehetővé teszi, hogy szerver oldalról küldjünk üzenetet a kliens alkalmazásnak. Jellemzői:
A kliensek folyamatosan low-level (TCP/IP) alapon kapcsolódnak a kiszolgáló szerver parkhoz.
Minimális üzenet méret kiküldésére alkalmasak. 256Kb - 4K
Delay és TTL támogatás, disconnect kezelés
Egyedileg vagy akár több kliens is megcímezhető.
Tetszőleges tartalom.
Mobil platformonként más-más kiszolgáló szerver park áll rendelkezésre.
Sávszél és energia hatékony megoldás Sicz-Mesziár János
11/13/2016
2
Push notification – data flow
Sicz-Mesziár János
11/13/2016
3
Push notification - szolgáltatások Apple:
APNS: Apple Push Notification Service
Google:
C2DM: Cloud to Device Message: Régebben, mára deprecated lett, a GCM váltotta
GCM: Google Cloud Messaging 4K message, 2 irányú XMPP protokol, FCM váltja
FCM: Firebase Cloud Messaging
Microsoft:
WNS: Windows Push Notification Services
+ Web Push API: https://developer.mozilla.org/en/docs/Web/API/Push_API Sicz-Mesziár János
11/13/2016
4
FCM – Firebase Cloud Messaging Cross-platform üzenet küldési szolgáltatás Célja, hogy egy egységes rendszer fogja össze a különböző aszinkron üzenet értesítési megoldásokat.
Alábbiak támogatottak:
Android: lényegében a GCM-re épül
iOS: APNS feletti megoldás
Web
C++
Unity
Bővebben:
https://firebase.google.com/do cs/cloud-messaging/
Sicz-Mesziár János
11/13/2016
5
FCM üzenet küldése
HTTP Post üzenet küldése Firebase szerverére
https://fcm.googleapis.com/fcm/send
Kérés felépítése:
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{ "collapse_key": "score_update", "time_to_live": 108, "data": { "score": "5x1", "time": "15:10" }, "to" : ["bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."] } Sicz-Mesziár János
11/13/2016
6
FCM üzenet küldése (2) Firebase szerver válasza
{ "multicast_id": 216,
"success": 3, "failure": 3, "canonical_ids": 1, "results": [
{ "message_id": "1:0408" }, { "error": "Unavailable" }, { "error": "InvalidRegistration" }, { "message_id": "1:1516" },
{ "message_id": "1:2342", "registration_id": "32" }, { "error": "NotRegistered"} ] } Sicz-Mesziár János
11/13/2016
7
FCM üzenet fogadása - Android
Minimum Android 2.3
Firebase project készítése
Új projekt létrehozása a Firebase console-on https://firebase.google.com/console/
Alkalmazás package név és SHA-1 lenyomat megadása keytool -list -v -keystore "C:\Users\[user_name]\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
Config (JSON) fájl hozzáadása az Android alkalmazáshoz /project/app
Sicz-Mesziár János
11/13/2016
8
FCM üzenet fogadása – Android (2)
Gradle-ben új függőség dependencies { compile 'com.google.firebase:firebase-messaging:9.8.0' }
AndroidManifest.xml-ben két service regisztrálása <service android:name=".MyFirebaseMessagingService">
<service android:name=".MyFirebaseInstanceIDService">
Sicz-Mesziár János
11/13/2016
9
FCM üzenet fogadása – Android (3)
MyFirebaseInstanceIDService.java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); sendRegistrationToServer(refreshedToken); } private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server.
} }
A token megváltozhat, ha:
Felhasználó eltávolítja / újratelepíti az alkalmazást
Felhasználó törli az alkalmazás adatokat
Alkalmazás helyreállításra kerül egy új készüléken (új install)
Az alkalmazás törli az Instance ID-t
Sicz-Mesziár János
11/13/2016
10
FCM üzenet fogadása – Android (4)
MyFirebaseMessagingService.java
public class MyFirebaseMessagingService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage remoteMessage) { // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } } private void sendNotification(String messageBody) { // TODO show notification } }
Sicz-Mesziár János
11/13/2016
11
FCM üzenet fogadása – Android (5)
A bejövő üzenetek automatikusan is meg tudnak jelenni a notification bar-on.
Foreground vs Background
Bővebben: https://firebase.google.com/docs/cloudmessaging/android/receive
Sicz-Mesziár János
11/13/2016
12