基於FCM的消息推送功能

需求背景

我方項目須要支持客戶端消息推送,iOS終端能夠藉由蘋果自己的apns很方便的實現,可是對於Android來講,必須集成第三方的SDK來處理。考慮到項目須要以及成本,咱們選擇使用谷歌的FCM框架來實現,由於咱們項目針對消息的可到達率要求並不高,並且推送消息的性質是業務低關注度的,重點是咱們的項目仍是海外項目,因此一番評估以後發現FCM徹底可以知足咱們的需求。json

文檔分析

一、Firebase雲消息傳遞服務器簡介api

二、FCM服務器協議服務器

三、使用舊版HTTP協議發送app

四、使用HTTP方式構建服務器框架

五、請求受權說明工具

六、向舊版協議發送請求提供受權google

七、使用HTTP舊版協議模式發送請求url

八、舉例spa

項目運用

Capation&D的這個項目基於SpringBoot,JDK1.8進行開發。code

一、Maven依賴

1 <dependency>
2     <groupId>com.google.api-client</groupId>
3     <artifactId>google-api-client</artifactId>
4     <version>1.24.1</version>
5 </dependency>

二、編寫工具類

 1 /**
 2  * @Project:captainad-supply-chain
 3  * @PackageName:com.captainad.supply-chain.common.push
 4  * @Author:Captainad
 5  * @blogsite:https://www.cnblogs.com/captainad/
 6  * @DateTime:2018/8/9 15:52.
 7  * @Description: 基於Google Firebase框架實現的實時消息推送功能,目前僅支持Android設備
 8  */
 9 @Slf4j
10 @Component
11 public class FcmPushService {
12 
13     @Autowired
14     private GetSetCacheService getSetCacheService;
15 
16     @Autowired
17     private HttpAskInterface httpAskInterface;
18 
19     /**
20      * 消息推送,推送的消息用於提示,而且點擊提示消息將會跳轉連接至指定頁面
21      * A: Captain&D
22      * W: https://www.cnblogs.com/captainad/
23      * @param deviceToken
24      * @param title
25      * @param body
26      * @param route
27      * @throws Exception
28      */
29     @Async
30     public void push(final String deviceToken, final String title, final String body,
31                      final String route, final Integer dataType, final String dataMsg) 
32             throws Exception {
33         log.info("[START]開始推送FCM消息");
34         // 請求標頭
35         Map<String, String> requestHeader = new HashMap<>();
36         requestHeader.put("Content-Type", "application/json; UTF-8");
37         requestHeader.put("Authorization", "Bearer " + getAccessToken());
38 
39         // 請求體
40         JSONObject json = new JSONObject();
41 
42         JSONObject message = new JSONObject();
43         message.put("token", deviceToken);
44         JSONObject data = new JSONObject();
45 
46         // 發送彈窗提示信息
47         if(!StringUtils.isEmpty(title) && !StringUtils.isEmpty(body)) {
48             JSONObject notification = new JSONObject();
49             notification.put("title", title);
50             notification.put("body", body);
51             message.put("notification", notification);
52 
53             data.put("route", route);
54             // flag: 0-無需跳轉,1-須要跳轉
55             data.put("routeFlag", StringUtils.isEmpty(route) ? "0" : "1");
56         }
57 
58         // 發送數據
59         if(!StringUtils.isEmpty(dataMsg)) {
60             data.put("dataType", String.valueOf(dataType));
61             data.put("params", dataMsg);
62         }
63 
64         message.put("data", data);
65         json.put("message", message);
66 
67         log.info("請求json內容===> {}", json.toString());
68         // https://fcm.googleapis.com/v1/projects/bluepay-tesla/messages:send
69         String fcmApiUrl = getSetCacheService.getConfigValue("fcm_api_path");
70         HttpResponse httpResponse = httpAskInterface.synSendPost(fcmApiUrl, json.toString(), requestHeader);
71         log.info("fcm響應內容===> {}", httpResponse);
72         log.info("[END]推送FCM消息結束");
73     }
74 
75     /**
76      * 獲取定時刷新的令牌
77      * A: Captain&D
78      * W: https://www.cnblogs.com/captainad/
79      * @return
80      * @throws IOException
81      */
82     private String getAccessToken() throws Exception {
83         String jsonPath = getSetCacheService.getConfigValue("fcm_access_token_json");
84         URL url = new URL(jsonPath);
85         HttpURLConnection conn = (HttpURLConnection)url.openConnection();
86         InputStream inputStream = conn.getInputStream();
87 
88         GoogleCredential googleCredential = GoogleCredential
89                 .fromStream(inputStream)
90                 .createScoped(Arrays.asList("https://www.googleapis.com/auth/firebase.messaging"));
91         googleCredential.refreshToken();
92         if(inputStream != null) {
93             inputStream.close();
94         }
95         return googleCredential.getAccessToken();
96     }
97 
98 }

使用總結

咱們只須要申請一個Google開發者帳號以及自身企業的一些相關信息,就可以很方便的使用Firebase雲消息傳遞(FCM)提供的衆多消息傳遞選項和功能,上面基於項目的須要實現了Android支持的版本,值得說起的時候,給特定設備推送消息時,須要提早獲取到設備的deviceToken,由於它指代了一臺惟一特定的設備。另外,若是想批量發送消息的,能夠自行擴展出來。

參考資料

一、https://firebase.google.cn/docs/cloud-messaging/concept-options?hl=zh-cn

相關文章
相關標籤/搜索