前言
最近在開發一款國際版的APP,專案中需要支援客戶端訊息推送,自己實現肯定是不可能的,需要尋找第三方的SDK。在做技術調研的時候決定使用google的FCM框架來實現,有個缺點就是大陸是接收不到的(fq可以)。那麼本章就給大家分享一下如何基於Spring Boot整合Firebase實現FCM訊息推送功能。
必要條件1、大陸開發者要準備好vpn(你懂的)。2、申請Google Firebase賬號。3、獲取Firebase祕鑰。4、有效的客戶端token令牌(app客戶端開發者提供)。
開發第一步:申請開發者賬號
地址:https://console.firebase.google.com/
第二步:新增一個專案
如下圖所示,新增一個專案:
新增專案
新增步驟
TPS:注意必須與android專案本地包名一致就是manifest中package的路徑一樣。
第三步:下載google-services.json檔案
點選左上角——設定(圖示)——專案設定,點選google-services.json下載,如下圖所示:
下載google-services.json檔案
將下載好的檔案放到Spring Boot專案的resources目錄下,例如:
第四步:整合Firebasepom引用firebase,要fq才能下載,如果沒有條件就需要手動匯入下載好的jar包。
<dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>6.5.0</version></dependency>第五步:編寫FCM推送訊息請求實體
這裡只是做了個傳送訊息的簡單封裝實體,方便資料傳輸:
import com.google.firebase.messaging.*;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiOperation;import lombok.extern.slf4j.Slf4j;import org.springframework.http.MediaType;import org.springframework.web.bind.annotation.*;import java.io.*;import java.util.*;@Api(value = "FireBase", description = "FireBase")@RequestMapping("/")@RestController@Slf4jpublic class FireBaseController { //渠道名字,也是APP的名字 public static String appName = "FCM後臺新增的專案名稱"; @ApiOperation(value = "批量FireBase推送", notes = "批量FireBase推送") @ApiImplicitParam(name = "fcmSendMessageReqDTO", value = "{\\"title\\":\\"測試標題\\",\\"body\\":\\"測試內容\\",\\"tokens\\":\\"1,2\\"}") @PostMapping(value = "/pushFireBaseAll", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public void pushFireBaseAll(@RequestBody FCMSendMessageReqDTO fcmSendMessageReqDTO) { log.info("進入批量FireBase推送 pushFireBaseAll:[{}]", fcmSendMessageReqDTO.toString()); //新增tokens List<String> tokens = Arrays.asList(fcmSendMessageReqDTO.getTokens().split(",")); //設定Java代理,埠號是代理軟體開放的埠,這個很重要。 System.setProperty("proxyHost", "127.0.0.1"); System.setProperty("proxyPort", "8081"); //如果FirebaseApp沒有初始化 if (!FireBaseUtil.isInit(appName)) { String jsonPath = "fcm/xxxx-firebase-adminsdk.json"; String dataUrl = "https://xxxx.firebaseio.com/"; //初始化FirebaseApp try { FireBaseUtil.initSDK(jsonPath, dataUrl, appName); FireBaseUtil.registrationTopic(appName, tokens, fcmSendMessageReqDTO.getTopic()); //設定主題 FireBaseUtil.sendTopicMes(appName, fcmSendMessageReqDTO.getTopic(), fcmSendMessageReqDTO.getTitle(), fcmSendMessageReqDTO.getBody()); //按主題推送 } catch (Exception e) { e.printStackTrace(); } } else { log.info("如果FirebaseApp已經初始化"); try { FireBaseUtil.registrationTopic(appName, tokens, fcmSendMessageReqDTO.getTopic()); //設定主題 FireBaseUtil.sendTopicMes(appName, fcmSendMessageReqDTO.getTopic(), fcmSendMessageReqDTO.getTitle(), fcmSendMessageReqDTO.getBody()); //按主題推送 } catch (IOException e) { e.printStackTrace(); } catch (FirebaseMessagingException e) { e.printStackTrace(); } } } @ApiOperation(value = "FireBase推送", notes = "FireBase推送") @ApiImplicitParam(name = "fcmSendMessageReqDTO", value = "{\\"title\\":\\"測試標題\\",\\"body\\":\\"測試內容\\",\\"tokens\\":\\"1\\"}") @PostMapping(value = "/pushFireBase", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public void pushFireBase(@RequestBody FCMSendMessageReqDTO fcmSendMessageReqDTO) { log.info("進入批量FireBase推送 pushFireBaseAll:[{}]", fcmSendMessageReqDTO.toString()); //新增tokens List<String> tokens = Arrays.asList(fcmSendMessageReqDTO.getTokens().split(",")); //設定Java代理,埠號是代理軟體開放的埠,這個很重要。 System.setProperty("proxyHost", "127.0.0.1"); System.setProperty("proxyPort", "8081"); //如果FirebaseApp沒有初始化 if (!FireBaseUtil.isInit(appName)) { String jsonPath = "fcm/xxxx-firebase-adminsdk.json"; String dataUrl = "https://xxxx.firebaseio.com/"; //初始化FirebaseApp try { FireBaseUtil.initSDK(jsonPath, dataUrl, appName); FireBaseUtil.pushSingle(appName, tokens.get(0), fcmSendMessageReqDTO.getTitle(), fcmSendMessageReqDTO.getBody()); //單推 } catch (Exception e) { e.printStackTrace(); } } else { log.info("如果FirebaseApp已經初始化"); try { FireBaseUtil.pushSingle(appName, tokens.get(0), fcmSendMessageReqDTO.getTitle(), fcmSendMessageReqDTO.getBody()); //單推 } catch (IOException e) { e.printStackTrace(); } catch (FirebaseMessagingException e) { e.printStackTrace(); } } }}
Spring Boot 專案中集成了swagger ,小夥伴在使用的時候可以去掉。程式碼是沒問題的,都已經測試過。
總結1、一定要確認網路是否可以FQ,如果不行是訪問不了firebase service的。否則會報以下錯誤,如圖所示:
2、xxx.json 存放位置的目錄要做好引用,小編是用mac執行的,如果是windows獲取json檔案的相對路徑會有問題。3、給特定裝置推送訊息時,需要提前獲取到裝置的deviceToken。總之,以上程式碼可以幫助大家快速入門,並且編寫出可以推送成功的示例,如果在使用中有什麼問題大家可以留言一起討論哦~~~4、中國產手機一般閹割了Google service的服務,需要自己去找第三方資源安裝,會產生以下問題:
A、應用“殺死”後基本收不到訊息。B、Android8 系統不管應用是否可用都出現收不到訊息問題。有資源的小夥伴可以多測試集中機型哦。5、裝置必須是android4.0以上,Google Play Services 必須是 11.2.0以上版本(這個沒有測試,擁有的資源基本都是6以上)。