##参考资源 Firebase 云消息传递官网 com.google.firebase.messagingAPI这个连接要FQ firebase推送后台接入--海外APP推送 fcm google 推送 java 服务端集成前端
##什么是FCM? 本篇文章主要讲实现,概念大略介绍一会儿啦! 推送服务在国内有不少服务商,可是若是是作海外 App ,推荐仍是使用 Google 本身的推送服务,毕竟海外经常使用的手机型号,都是有 Google 服务的。Google 的推送服务,之前叫作 GCM(Google Cloud Message)。而自从 Google 将 Firebase 收购以后,就将推送服务并到 Firebase 的一项服务中了,如今叫作 FCM。 ##FCM推送消息类型java
通知消息包含一组预约义的用户可见的键。与其相对,数据消息只包含用户定义的自定义键值对。通知消息能够包含可选数据有效负载。这两种消息类型的有效负载上限均为 4KB,但从 Firebase 控制台发送>消息时除外,在那种状况下,系统会强制执行 1024 个字符的限制。android
##编写Java推送功能前的准备 ####第一条:获取Android或者IOS程序在firebase上申请的json。这个json去前端工程师哪里要,这个必须有! ####第二条:获取firebase上面Android或者IOS程序的数据库,这个也得去前端工程师要!数据库
https://telecomm-76736ei.firebaseio.com/ 长得样式和上面差很少 ####第三条:得到一个有效的token,这个也得去前端工程师要! e1v12xfHs3g:APA91bFExfQRg1h4AZc3GqLHxW4ohe3D7Ca0xvGMJkSbY3qe9yXf4Xe10c1O4fHJ2I。 获取有效token的时候楼主可吃过大亏哦,注意里面的“:”经常被转义位“%3A”,大家要一万个当心。 ####第四条:你的电脑能FQ,由于这是发送到Google服务器的。国内是屏蔽访问国外网络请求的,若是你想FQ能够找我,我能够帮你! ####第五条,添加依赖,没有下面的log4j依赖会报错。json
<dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>6.5.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>
##Java代码api
import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.google.auth.oauth2.GoogleCredentials; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.messaging.AndroidConfig; import com.google.firebase.messaging.AndroidConfig.Builder; import com.google.firebase.messaging.AndroidNotification; import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.FirebaseMessagingException; import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; import com.google.firebase.messaging.TopicManagementResponse; /** * Google_FireBase推送工具类 * @author Feiqs * */ public class FireBaseUtil { //存放多个实例的Map private static Map<String,FirebaseApp> firebaseAppMap = new ConcurrentHashMap<>(); //获取AndroidConfig.Builder对象 private static com.google.firebase.messaging.AndroidConfig.Builder androidConfigBuilder=AndroidConfig.builder(); //获取AndroidNotification.Builder对象 private static AndroidNotification.Builder androidNotifiBuilder=AndroidNotification.builder(); /** * 判断SDK是否初始化 * @param appName * @return */ public static boolean isInit(String appName) { return firebaseAppMap.get(appName) != null; } /** * 初始化SDK * @param jsonPath JSON路径 * @param dataUrl firebase数据库 * @param appName APP名字 * @throws IOException */ public static void initSDK(String jsonPath, String dataUrl,String appName) throws IOException { FileInputStream serviceAccount = new FileInputStream(jsonPath); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .setDatabaseUrl(dataUrl).build(); //初始化firebaseApp FirebaseApp firebaseApp = FirebaseApp.initializeApp(options); //存放 firebaseAppMap.put(appName,firebaseApp); } /** * 单设备推送 * @param appName 应用的名字 * @param token 注册token * @param title 推送题目 * @param bady 推送内容 * @return * @throws IOException * @throws FirebaseMessagingException */ public static void pushSingle(String appName, String token, String title, String body) throws IOException, FirebaseMessagingException{ //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例为空的状况 if (firebaseApp == null) { return; } //构建消息内容 Message message = Message.builder().setNotification(new Notification(title,body)) .setToken(token) .build(); //发送后,返回messageID String response = FirebaseMessaging.getInstance(firebaseApp).send(message); System.out.println("单个设备推送成功 : "+response); } /** * 给设备订阅主题 * @param appName 应用的名字 * @param Tokens 设备的token,最大1000个 * @param topic 要添加的主题 * @return * @throws FirebaseMessagingException * @throws IOException */ public static void registrationTopic(String appName, List<String> tokens, String topic) throws FirebaseMessagingException, IOException { //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例不存在的状况 if(firebaseApp == null) { return; } //订阅,返回主题管理结果对象。 TopicManagementResponse response = FirebaseMessaging.getInstance(firebaseApp).subscribeToTopic(tokens, topic); System.out.println("添加设备主题,成功:" + response.getSuccessCount() + ",失败:" + response.getFailureCount()); } /** * 取消设备的订阅主题 * @param appName 应用的名字 * @param tokens 设备的token,最大1000个 * @param topic 取消的主题 * @return * @throws FirebaseMessagingException * @throws IOException */ public static void cancelTopic(String appName, List<String> tokens, String topic) throws FirebaseMessagingException, IOException { //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例不存在的状况 if(firebaseApp == null) { return; } //取消订阅,返回主题管理结果对象。 TopicManagementResponse response = FirebaseMessaging.getInstance(firebaseApp).unsubscribeFromTopic(tokens, topic); System.out.println("取消设备主题,成功:" + response.getSuccessCount() + ",失败:" + response.getFailureCount()); } /** * 按主题推送 * @param appName 应用的名字 * @param topic 主题的名字 * @param title 消息题目 * @param body 消息体 * @return * @throws FirebaseMessagingException * @throws IOException */ public static void sendTopicMes(String appName, String topic, String title, String body) throws FirebaseMessagingException, IOException { //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例不存在的状况 if(firebaseApp == null) { return; } //构建消息 Message message = Message.builder() .setNotification(new Notification(title,body)) .setTopic(topic) .build(); //发送后,返回messageID String response = FirebaseMessaging.getInstance(firebaseApp).send(message); System.out.println("主题推送成功: " + response); } /** * 单条Android设备推送消息(和pushSingle方法几乎没有区别) * @param appName 应用的名字 * @param token 注册token * @param title 推送题目 * @param bady 推送内容 * @throws FirebaseMessagingException */ public static void pushSingleToAndroid(String appName, String token, String title, String body) throws FirebaseMessagingException { //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例为空的状况 if (firebaseApp == null) { return; } androidConfigBuilder.setRestrictedPackageName("io.telecomm.telecomm"); androidNotifiBuilder.setColor("#55BEB7");// 设置消息通知颜色 androidNotifiBuilder.setIcon("https://www.shiku.co/images/favicon.png");// 设置消息图标 androidNotifiBuilder.setTitle(title);// 设置消息标题 androidNotifiBuilder.setBody(body);// 设置消息内容 AndroidNotification androidNotification=androidNotifiBuilder.build(); androidConfigBuilder.setNotification(androidNotification); AndroidConfig androidConfig=androidConfigBuilder.build(); //构建消息 Message message = Message.builder() .setToken(token) .setAndroidConfig(androidConfig) .build(); //发送后,返回messageID String response = FirebaseMessaging.getInstance(firebaseApp).send(message); System.out.println("单个安卓设备推送成功 : "+response); } /** * Android按主题推送(和sendTopicMes方法几乎没有区别) * @param appName 应用的名字 * @param topic 主题的名字 * @param title 消息题目 * @param body 消息体 * @return * @throws FirebaseMessagingException * @throws IOException */ public static void sendTopicMesToAndroid(String appName, String topic, String title, String body) throws FirebaseMessagingException, IOException { //获取实例 FirebaseApp firebaseApp = firebaseAppMap.get(appName); //实例为空的状况 if (firebaseApp == null) { return; } androidNotifiBuilder.setColor("#55BEB7");// 设置消息通知颜色 androidNotifiBuilder.setIcon("https://www.shiku.co/images/favicon.png");// 设置消息图标 androidNotifiBuilder.setTitle(title);// 设置消息标题 androidNotifiBuilder.setBody(body);// 设置消息内容 AndroidNotification androidNotification=androidNotifiBuilder.build(); androidConfigBuilder.setNotification(androidNotification); AndroidConfig androidConfig=androidConfigBuilder.build(); //构建消息 Message message = Message.builder() .setTopic(topic) .setAndroidConfig(androidConfig) .build(); String response = FirebaseMessaging.getInstance(firebaseApp).send(message); System.out.println("安卓主题推送成功: " + response); } }
##测试类服务器
import java.util.LinkedList; import java.util.List; /** *测试FCM * @author Feiqs * @version 建立时间:2019年4月23日 上午10:52:53 */ public class Test { private static final String String = null; //设备的token值 public static String token = "e1v12xfHs3g:APA91bFExfQRg1h4AZc3GqLHxW4ohe3D7Ca0xvGMJkSbY3qe9yXf4Xe10c1O4fHJ2IkbsNF6Z0lr97EV7G1ybP4GLDY5nGVa1ufLOtMAKhcXBfua1bGvubf5whjTLuFj6BQdflFz2n2w"; //渠道名字,也是APP的名字 public static String appName = "myAppName"; //主题名字 public static String topic = "China"; //通知消息题目 public static String title = "tip"; //通知消息内容 public static String body = "are you ok?"; //测试内容 public static void main(String args [] ) throws Exception { //添加tokens List<String> tokens = new LinkedList(); tokens.add(token); //设置Java代理,端口号是代理软件开放的端口,这个很重要。 System.setProperty("proxyHost", "localhost"); System.setProperty("proxyPort", "1080"); //若是FirebaseApp没有初始化 if(!FireBaseUtil.isInit(appName)) { String jsonPath = "path/to/serviceAccountKey.json" ; String dataUrl = "https://telecomm-773e6e.firebaseio.com/"; //初始化FirebaseApp FireBaseUtil.initSDK(jsonPath, dataUrl, appName); } FireBaseUtil.pushSingle(appName, token, title, body); //单推 FireBaseUtil.registrationTopic(appName, tokens, topic); //设置主题 FireBaseUtil.sendTopicMes(appName, topic, title, body); //按主题推送 FireBaseUtil.cancelTopic(appName, tokens, topic); //取消主题 //安卓设备推送 FireBaseUtil.pushSingleToAndroid(appName, token, title, body); FireBaseUtil.registrationTopic(appName, tokens, topic); //设置主题 FireBaseUtil.sendTopicMesToAndroid(appName, topic, title, body); } }
##总结网络