FCM---Android系统级推送---你还在用第三方推送?

本文已授权微信公众号 Android技术经验分享 独家发布

转载请注明出处:FCM---Android系统级推送---你还在用第三方推送?

Firebase Cloud Messaging

FCM是谷歌推出的最新的Android系统级别的消息推送服务(用来替换GCM)。
GCM(Google Cloud Message for Android)是Google发布的Android服务器推送(push)技术。
之前的C2DM(Android Cloud to Device Messaging)已与2012年6月26日被正式弃用。

注:国内可接收FCM推送,但必须安装谷歌服务。具体操作请参考官方文档。

官方文档

Android端Demo地址


图例

生命周期流程

下面是FCM的主要过程:

  1. Enabling FCM:运行在手机上注册了来接收消息的Android程序。
  2. Sending a message:发送消息到手机的第三方程序服务器。
  3. Receiving a message:从GCM服务器接收消息的Android程序。

Android端设置

  • 一项可以扩展 FirebaseMessagingService 的服务。如果您希望在后台进行接收应用通知之外的任何消息处理,则必须添加此服务。要在前台应用中接收通知、接收数据负载以及发送上游消息等,您必须扩展此服务。
  • 一项可以扩展 FirebaseInstanceIdService 的服务,用于处理注册令牌的创建、轮转和更新。如果要发送至特定设备或者创建设备群组,则必须添加此服务。

通过替换 FirebaseMessagingService.onMessageReceived 方法,您可以根据收到的消息执行操作,并获取消息数据:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...
 
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());
 
    // 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());
    }
 
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

检查 Google Play 服务 APK

实现连接服务器协议

Firebase Cloud Messaging服务器端包含两个组件:

  1. GCM 连接服务器,由 Google 提供。这些服务器从一个应用服务器获取消息,并将其发送至在设备上运行的客户端应用。Google 为 HTTP 和 XMPP 提供连接服务器。
  2. 一台应用服务器,您必须在您的环境中实现它。此应用服务器通过选定的FCM连接服务器,使用合适的 XMPP 或 HTTP 协议向客户端应用发送数据。

实现 HTTP 连接服务器协议

要对某个下游消息进行寻址或"确定其目标",应用服务器需要将 to 设置为接收客户端应用的注册令牌。您可以发送带有预定义字段的通知消息或自定义数据消息;请参阅消息负载中的通知和数据,了解关于负载支持的详细信息。本页中的示例用于说明如何通过 HTTP协议发送数据消息。

  • HTTP POST 请求
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
 
{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

高级消息传递选项

属性 范例
Sender ID (发送者 ID) 819786133815
API Key (API 密钥 ) AAAAvt8PsTc:APA91bFjsbsccwMDjxr7m04Fm9qEKVesfpm_3Gdy-9Wv_TC33nmi-9o6ksbUK1eK-TIyn9q6khLF7MHRSqj0DbxPyN4SVPZED0cEFE5E9ysz5VIZFZkOUHjuws7cKKfhSNhlQ9cYgL7kcdcjIOi7xYVYyyWSOjCaew
Registration Token (注册令牌) 由 FCM SDK 为每个客户端应用实例生成的 ID。 单一设备和设备群组消息传递需要该令牌。请注意,注册令牌必须保密。

通知

要发送通知,可设置 notification 键并针对通知消息的用户可见部分设置必要的预定义键选项集。
例如,这是 IM 应用中的 JSON 格式的通知消息。 用户可能会在设备上看到标题为"Portugal vs. Denmark"、文本为"great match!"的消息:

  • Authorization: key=AAAAvt8PsTc:APA91bFjsbsccwMDjxr7m04Fm9qEKVesfpm_3Gdy-9Wv_TC33nmi-9o6ksbUK1eK-
    TIyn9q6khLF7MHRSqj0DbxPyN4SVPZED0cEFE5E9ysz5VIZFZkOUHjuws7cKKfhSNhlQ9cYgL7kcdcjIOi7xYVYyyWSOjCaew
  • Content-Type: application/json
//单个客户端使用令牌通知
 {
    "to" : "eNh8RzL09LY:APA91bEKwVeY-FGl_h-9oTZ7BZQJ79xR_EtPBpnoq3ecuPwTpbLWgrVaTuqjoakDZCuf0SVVsc5QbnOOAWYpHuLH7_QYiwT7LE2XMSA_rokM6NB0HlwfcuY-oYNnZsqxveumhg7tR0G2",
   "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }

 {
    "to" : "eV1M0ZMn3Qc:APA91bHQiquRmGUPSuK8KaTf3N1tVMKp43WvX1TnPWSOVuHw6imb8digKv-yIRyESweHvkK7I8lNtzRllDSXb9WVswD9kX5dGUfs3uAH3U_m0qJxcHUe_F9YIiCwI3lTNnzP_TRlNw1-",
   "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }

//多个客户端通知,使用registration_ids数组
{
   "registration_ids" : ["eNh8RzL09LY:APA91bEKwVeY-FGl_h-9oTZ7BZQJ79xR_EtPBpnoq3ecuPwTpbLWgrVaTuqjoakDZCuf0SVVsc5QbnOOAWYpHuLH7_QYiwT7LE2XMSA_rokM6NB0HlwfcuY-oYNnZsqxveumhg7tR0G2",
    "eV1M0ZMn3Qc:APA91bHQiquRmGUPSuK8KaTf3N1tVMKp43WvX1TnPWSOVuHw6imb8digKv-yIRyESweHvkK7I8lNtzRllDSXb9WVswD9kX5dGUfs3uAH3U_m0qJxcHUe_F9YIiCwI3lTNnzP_TRlNw1-",
   "notification"]
  "notification" : {
      "body" : "是的。我成功了!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }

应用在后台运行时,通知将会传递至通知托盘。 对于在后台运行的应用,消息由下列回调处理:

  • iOS 上的 didReceiveRemoteNotification:
  • Android 上的 onMessageReceived()。数据包中的 notification 键包含通知。

设置消息优先级

 "priority" : "high",

下游消息语法

官方文档 : https://firebase.google.cn/docs/cloud-messaging/http-server-ref?hl=zh-cn#send-downstream

demo

http://www.jianshu.com/p/5d1982dd588b

注意

当firebase推送的时候,是分当前应用在前后台两种情况的。当应用在前台的时候,消息到来的时候会响应onMessageReceived函数,你就可以在里面想怎么处理就怎么处理了。当应用在后台或者被杀掉的时候,这个函数是不会响应的,它会直接吧参数发送到启动的Activity中,以下是google的文档说明:

Handle messages in a backgrounded app

When your app is in the background, Android directs notification messages to the system tray. A user tap on the notification opens the app launcher by default.

This includes messages that contain both notification and data payload. In these cases, the notification is delivered to the device's system tray, and the data payload is delivered in the extras of the intent of your launcher Activity.

处理方式:在后台的情况下你需要在应用的主Activity的onCreate方法中调用getIntent.getExtra()方法才能拿到推送到的参数

server 端建置

Google 稱開發者的 server 為 third party server,third party server 通常就是您的網站,至少要具備 2 個功能:
一是接收 Android 裝置上傳 GCM 註冊成功的 regId,
一是負責處理註銷 regId。

另外有個功能是用來發送訊息給 Android client 端 或 接收 client 端上傳的訊息,如果只有需要發送訊息的功能,那麼這支程式您可以放在您的網站(third party server)上 或是 放在公司內某個部門的電腦內;如果還要接收 client 端上傳的訊息,那這支程式就得放在您的網站上。

要納入考慮的是,當安裝您 app 的 Android 裝置數達成千上萬時,執行網站上的 php 可能會有效率上的問題。

接收註冊的程式 gcm_register.php:

if(isset($_POST['regId']))
{
    $regId = $_POST['regId'];
    $sql = "INSERT INTO 資料表 (gcm_id,...) VALUES ('$regId',...)";
    $pdo->exec($sql);
}
 

GCM 運作流程
安裝好的 app 第一次執行時,app 會向 Google 註冊並取得 regId,app 成功取得 regId 後便將 regId 傳送給您網站 gcm_register.php,您可在 ADT 的 log 中看到取得的 regId;regId 長達 162 字元, 如果您想將 regId 儲存於資料庫系統內,則您需要建立一個 table 存放 Android 裝置傳上來的 regId,存放 regId 的欄位長度最好大於 162 字元,因為以 Android 設備爆炸性成長的速度來看,如果愈來愈多開發人員採用 GCM,那麼 regId 長度勢必再增加...

當您的網站(third party server) 接收並儲存註冊 GCM 成功的 regId,爾後您的網站便可以發送訊息到已註冊的 app。

當您的 third party server 要發送訊息給有安裝您 app 的 Android 裝置時,您的 server 是將訊息發送給 Google GCM server,由 Google GCM server 再將訊息轉發給您 指定的 regId。

而當 Android 裝置解除安裝您的 app 時,Google GCM server 並不會立即通知您的 thrid party server,而是在下一次您發送訊息給該 Android 裝置時,Google GCM server 才會回應給您的 third party server 錯誤,錯誤的內容是該裝置並未註冊,所以您的 third party server 要在此時將該裝置的 regId 從您的資料庫中刪除。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,825评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,412评论 2 45
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 你说 我的爱 是枷锁 你想过属于你的生活 你想自己尝试不管对错 是的 我心底爱你胜过爱我 ...
    七七行记阅读 365评论 0 0
  • 文:迷妹乔小喵 大家对上班造型是什么印象,穿着漂亮又时尚的正装,精致的妆容和那5-10 cm的恨天高。高跟鞋让你的...
    迷妹乔小喵阅读 478评论 0 1