我方項目須要支持客戶端消息推送,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