JAVA后端如何实现简单推送服务以及坑点

JAVA后端如何实现简单推送服务以及坑点

由于公司前段时间需要实现APP端消息推送服务,但是又需要自己来实现,不借助第三方服务(如极光推送等)。所以,没有办法,只能硬着头皮各种翻阅资料,查找技术,慢慢的对于推送功能的实现方法有了一定的了解。但是,有很多的文章并没有全面的介绍,过程中遇到各种坑。可谓是头痛不已,因此想自己做一个全面点的记录,希望给自己和后来人都带来方便。废话到此,进入正题。
实现的效果例子如下(由于公司保密要求,该图片来源于网络,但是样式相同,供参考):JAVA后端如何实现简单推送服务以及坑点_第1张图片

推送介绍:

在这里,把我们需要实现的推送情景做一个自我介绍,以便于各位参考自己是否属于或者适用于自己的场景。我们实现的推送是需要想大多数APP实现的PUSH功能相同,在某一特定情况下,需要在手机顶部弹出一个提示框(当前APP处于后台运行状态),或者在手机正中间弹出一个提示框,点击确认按钮,弹窗消失(当前处于APP操作界面)。

准备工作:

  1. 环境:需要外网环境,能够正常访问到谷歌服务器,所以你懂的,需要先开墙。
  2. 证书:IOS推送需要使用到证书,通常使用的为.p12后缀名的证书。此证书是由IOS开发人员通过BundleId打包生成的。与后台无关,可不用关心。但是如果生成的证书是带有密码的,此时需要提供给后端人员。
  3. 服务器地址:安卓推送采用流的形式,需要连接到google服务器,因此需要服务器地址和密钥。服务器地址固定:https://fcm.googleapis.com/fcm/send,
    密钥就是serverKey,而这个key是由安卓开发人员在firebase官网进行项目注册是生成的一个长字符串,通常由大小写英文字母以及‘:’和‘-’组成。后端也不用关心,只需要安卓开发人员将此key提供给我们即可。

代码如下:

(IOS)

public void pushIOS(){
     
	PushNotificationManager pushNotificationManager = new PushNotificationManager();

    try {
     
    	//推送环境分为开发和生产,false表示开发环境,true代表生产环境,两个的区别在于推送使用到的苹果服务器不同,
    	//开发=gateway.sandbox.push.apple.com
    	//生产=gateway.push.apple.com
    	//根据自己的环境决定
        boolean isProd = true;
        //三个参数分别表示:证书所在地址,密码,环境
        pushNotificationManager.initializeConnection(new AppleNotificationServerBasicImpl("D:\\Download\\certificate\\dev_rhb_july.p12", "", isProd));

        PushNotificationPayload payload = PushNotificationBigPayload.complex();
        payload.addCustomAlertTitle("标题");
        payload.addCustomAlertBody("内容");
        //badge表示IOS app右上角的小圆点个数,表示未读消息数量
        payload.addBadge(888888);
        payload.addSound("default");

        Device client = new BasicDevice();
        //这里参数表示的设备token,简称为deviceToken,是由app登录后,从IOS服务器获取到的一个设备token
        //此token可以唯一指定当前设备,如同身份证ID。使用token就可以定位到哪一台手机。
        client.setToken("8faef8adabc198b0185bd5d6f8d8c0688b204b50748899e1dff34a69e44f86e1");

        PushedNotification pushResult = pushNotificationManager.sendNotification(client, payload);
        pushNotificationManager.stopConnection();
    } catch (Exception ex) {
     
        ex.printStackTrace();
    }
}

(Android)

public void pushAndroid() {
     
    try {
     
        //设置Java代理,端口号是代理软件开放的端口,这个很重要。(内网环境需要设置代理情况下)
    	//System.setProperty("proxyHost", "localhost");
        //System.setProperty("proxyPort", "59255");

        URL url = new URL("https://fcm.googleapis.com/fcm/send");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setUseCaches(false);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "key=" + "serverKey");
        conn.setRequestProperty("Content-Type", "application/json");
        org.json.JSONObject json = new org.json.JSONObject();
        //这里参数是deviceToken
        json.put("to", "crsZ4Cbfuj8:APA91bHxu4bNdYs6xhTc6W4fVJsRwlDsEQvmiuQ3OXq7fQUXhGKIvlDkT4qMhqzSYr_wPi0Jf00kuocQrgwCuE0zXKcLtyfV98l4f95Cl-hLgbT1GbsXbG-Y9Uj9BYzXq3Ej1DvMYSac");
        org.json.JSONObject info = new org.json.JSONObject();
        info.put("title", "这是标题");
        info.put("body", "这是内容");
        json.put("notification", info);

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(json.toString());
        wr.flush();
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
     
            System.out.println(line);
        }
        wr.close();
        reader.close();
    } catch (Exception ex) {
     
        ex.printStackTrace();
    }
}

提醒:

上面是将功能代码贴出,并没有进行优化,例如:
1.没有将参数放入配置文件,实现动态配置
2.IOS推送代码中,没有将PushNotificationManager对象根据不同环境进行动态化配置
3.其中使用到的变量写死了

主要是方便大家阅读,可以看清楚整体逻辑。大家根据自己需要进行代码优化即可。

坑点总结:

  • 网上也有很多关于推送的贴子,但是都没有说到会遇到什么问题,结果导致大家,照葫芦画瓢以后,各种运行不了,实现不了功能。我自己也在这个过程中趟过很多坑,所以,把各种坑点总结,便于后来人躲过坑点。
  1. IOS推送功能无法使用
    可能性1:请检查获取到Device Token是否正确。
    可能性2:请检查IOS开发人员提供的证书是否有效,IOS开发人员可以自行检测。后端也可以将代码复制到main函数中进行检查证书有效性。当确定证书有效以后,请检查使用的证书和采用的环境是否一致。(投机取巧Tip:可以使用生产证书代替开发证书,因为生产证书可以用于开发环境推送,但是开发环境证书却不能用于生产环境。)
    可能性3:如果你复制的是网上的推送代码,这个时候还应该检查一下你使用的**PushNotificationBigPayload.complex();**这里用的是不是PushNotificationBigPayload对象,当发送文本信息过大,请采用PushNotificationBigPayload对象,而不要使用PushNotificationPayload对象。(当时这里遇到的大坑)

  2. Android推送功能无法使用
    可能性1:检查当前网络是否可以访问Google服务。
    可能性2:检查获取到的Device Token是否正确。
    可能性3:检查Android提供的server key是否有效。

备注:

遇到问题,首先就是检查各种参数是否正确,证书是否正确。反正就是查查查!后端使用main方法各种查吧!如果遇到问题,请留言。

*转载请注明出处

你可能感兴趣的:(java)