《小印記》源碼分享--極光推送服務器篇

筆者這幾天剛完成《小印記》的推送功能,今天特分享一下在作的過程當中實際解決的問題。若是讀者學到了有用的東西,但願能前往App Store下載《小印記》支持一下筆者,謝謝!java

《小印記》iOS源碼分享--自定義彈框篇android

《小印記》iOS源碼分享--極光推送實踐篇ios

《小印記》iOS源碼分享--HTTPS配置篇git

《小印記》iOS源碼分享--網絡層封裝篇github


前言

筆者建議先去極光推送官網下載-> Demo,由於官網demo裏面有須要的 jar 包,筆者這裏把須要的jar整理了一下,讀者能夠直接去下載:https://github.com/Jacedy/jpush-jarapi

關鍵源碼分享

package com.jk.dao.impl.user;

import java.text.SimpleDateFormat;
import java.util.Date;

import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

import com.jk.common.base.Result;
import com.google.gson.JsonObject;
import com.jk.dao.user.RemoteNoticeDao;

public class RemoteNoticeDaoImpl implements RemoteNoticeDao {

	private static final String appKey ="9de85312fa00e09baf*****";
	private static final String masterSecret = "d42ac8a024b7add0fe*****";
	
	static JPushClient jPushClient = new JPushClient(masterSecret, appKey);
	
    /**
     * 推送給指定的Alias用戶
     * @param alias 別名
     * @param alertMap	alert配置(title、subtitle、body)
     * @param extraJsonObject	額外增長字段
     * @return 0推送失敗,1推送成功
     */
    public Result sendToAlias(String alias,JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	Result result = new Result();
        try {
            PushPayload pushPayload= this.buildPushObject_Alias_alertWithTitle(alias,alertJsonObject,extraJsonObject);
            System.out.println(pushPayload);
            PushResult pushResult=jPushClient.sendPush(pushPayload);
            System.out.println(pushResult);
            result.setError_no(String.valueOf(pushResult.statusCode));
            result.setError_msg(String.valueOf(pushResult.msg_id));
            
        } catch (APIConnectionException e) {
            e.printStackTrace();
 
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
 
         return result;
    }
    
    /**
     * 推送給指定的Tags用戶
     * @param Tags tags
     * @param alertMap	alert配置(title、subtitle、body)
     * @param extraJsonObject	額外增長字段
     * @return 0推送失敗,1推送成功
     */
    public Result sendToTags(String tags,JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	Result result = new Result();
        try {
            PushPayload pushPayload= this.buildPushObject_Tags_alertWithTitle(tags,alertJsonObject,extraJsonObject);
            System.out.println(pushPayload);
            PushResult pushResult=jPushClient.sendPush(pushPayload);
            System.out.println(pushResult);
            result.setError_no(String.valueOf(pushResult.statusCode));
            result.setError_msg(String.valueOf(pushResult.msg_id));
            
        } catch (APIConnectionException e) {
            e.printStackTrace();
 
        } catch (APIRequestException e) {
            e.printStackTrace();
        }
 
         return result;
    }
 
    /**
     * 發送給全部安卓用戶
     * @param alertMap	alert配置(title、subtitle、body)
     * @param extraJsonObject	額外增長字段
     * @return 0推送失敗,1推送成功
     */
    public Result sendToAndroid(JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	Result result = new Result();
        try {
            PushPayload pushPayload= this.buildPushObject_android_all_alertWithTitle(alertJsonObject, extraJsonObject);
            System.out.println(pushPayload);
            PushResult pushResult=jPushClient.sendPush(pushPayload);
            System.out.println(pushResult);
            result.setError_no(String.valueOf(pushResult.statusCode));
            result.setError_msg(String.valueOf(pushResult.msg_id));
            
        } catch (Exception e) {
 
            e.printStackTrace();
        }
 
         return result;
    }
 
    /**
     * 發送給全部IOS用戶
     * @param alertMap	alert配置(title、subtitle、body)
     * @param extraJsonObject	額外增長字段
     * @return 0推送失敗,1推送成功
     */
    public Result sendToIOS(JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	Result result = new Result();
        try {
            PushPayload pushPayload= this.buildPushObject_ios_all_alertWithTitle(alertJsonObject, extraJsonObject);
            System.out.println(pushPayload);
            PushResult pushResult=jPushClient.sendPush(pushPayload);
            System.out.println(pushResult);
            result.setError_no(String.valueOf(pushResult.statusCode));
            result.setError_msg(String.valueOf(pushResult.msg_id));
            
        } catch (Exception e) {
 
            e.printStackTrace();
        }
 
         return result;
    }
 
    /**
     * 發送給全部用戶
     * @param alertMap	alert配置(title、subtitle、body)
     * @param extraJsonObject	額外增長字段
     * @return 0推送失敗,1推送成功
     */
    public Result sendToAll(JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	Result result = new Result();
        try {
            PushPayload pushPayload= this.buildPushObject_android_and_ios(alertJsonObject, extraJsonObject);
            System.out.println(pushPayload);
            PushResult pushResult=jPushClient.sendPush(pushPayload);
            System.out.println(pushResult);
            result.setError_no(String.valueOf(pushResult.statusCode));
            result.setError_msg(String.valueOf(pushResult.msg_id));
            
        } catch (Exception e) {
 
            e.printStackTrace();
        }
 
        return result;
    }
    
    
    
    public PushPayload buildPushObject_android_and_ios(JsonObject alertJsonObject, JsonObject extraJsonObject) {
  
    	System.out.println("----------buildPushObject_android_and_ios_alertWithTitle");
    	extraJsonObject.addProperty("customId", this.getCustomId());
    	
    	return PushPayload.newBuilder()
                .setPlatform(Platform.android_ios())
                .setAudience(Audience.all())
                .setNotification(Notification.newBuilder()
                        .setAlert(alertJsonObject)
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setAlert(alertJsonObject)
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                .build()
                        )
                        .addPlatformNotification(IosNotification.newBuilder()
                                //傳一個IosAlert對象,指定apns body、title、subtitle等
                                .setAlert(alertJsonObject)
                                //直接傳alert
                                //此項是指定此推送的badge自動加1
                                .incrBadge(1)
                                //此字段的值default表示系統默認聲音;傳sound.caf表示此推送以項目裏面打包的sound.caf聲音來提醒,
                                // 若是系統沒有此音頻則以系統默認聲音提醒;此字段若是傳空字符串,iOS9及以上的系統是無聲音提醒,如下的系統是默認聲音
                                .setSound("default")
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                //容許後臺推送
                                .setContentAvailable(true)
                                .build()
                        )
                        .build()
                )
                //Platform指定了哪些平臺就會像指定平臺中符合推送條件的設備進行推送。 jpush的自定義消息,
                // sdk默認不作任何處理,不會有通知提示。建議看文檔http://docs.jpush.io/guideline/faq/的
                // [通知與自定義消息有什麼區別?]瞭解通知和自定義消息的區別
                .setMessage(Message.newBuilder()
                        .setMsgContent(alertJsonObject.toString())
                        .setTitle(extraJsonObject.toString())
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用來指定本推送要推送的apns環境,false表示開發,true表示生產;對android和自定義消息無心義
                        .setApnsProduction(false)
                        //此字段是給開發者本身給推送編號,方便推送者分辨推送記錄
                        //.setSendno(1)
                        //此字段的值是用來指定本推送的離線保存時長,若是不傳此字段則默認保存一天,最多指定保留十天,單位爲秒
                        .setTimeToLive(864000)
                        .build()
                )
                .build();
    }
 
    private PushPayload buildPushObject_android_all_alertWithTitle(JsonObject alertJsonObject, JsonObject extraJsonObject) {
    	
    	System.out.println("----------buildPushObject_android_all_alertWithTitle");
    	extraJsonObject.addProperty("customId", this.getCustomId());
        
        return PushPayload.newBuilder()
                //指定要推送的平臺,all表明當前應用配置了的全部平臺,也能夠傳android等具體平臺
                .setPlatform(Platform.android())
                //指定推送的接收對象,all表明全部人,也能夠指定已經設置成功的tag或alias或該應應用客戶端調用接口獲取到的registration id
                .setAudience(Audience.all())
                //jpush的通知,android的由jpush直接下發,iOS的由apns服務器下發,Winphone的由mpns下發
                .setNotification(Notification.newBuilder()
                        //指定當前推送的android通知
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setAlert(alertJsonObject)
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                .build())
                        .build()
                )
                //Platform指定了哪些平臺就會像指定平臺中符合推送條件的設備進行推送。 jpush的自定義消息,
                // sdk默認不作任何處理,不會有通知提示。建議看文檔http://docs.jpush.io/guideline/faq/的
                // [通知與自定義消息有什麼區別?]瞭解通知和自定義消息的區別
                .setMessage(Message.newBuilder()
                        .setMsgContent(alertJsonObject.toString())
                        .setTitle(extraJsonObject.toString())
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用來指定本推送要推送的apns環境,false表示開發,true表示生產;對android和自定義消息無心義
                        .setApnsProduction(false)
                        //此字段是給開發者本身給推送編號,方便推送者分辨推送記錄
                        //.setSendno(1)
                        //此字段的值是用來指定本推送的離線保存時長,若是不傳此字段則默認保存一天,最多指定保留十天,單位爲秒
                        .setTimeToLive(864000)
                        .build())
                .build();
    }
    
    private PushPayload buildPushObject_Alias_alertWithTitle(String alias,JsonObject alertJsonObject, JsonObject extraJsonObject) {
        
    	System.out.println("----------buildPushObject_Alias_alert");
        //建立一個IosAlert對象,可指定APNs的alert、title等字段
//        IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody(alertJsonObject.get("title").toString(), alertJsonObject.get("subtitle").toString(), alertJsonObject.get("body").toString()).build();
        extraJsonObject.addProperty("customId", this.getCustomId());
        
        return PushPayload.newBuilder()
                //指定要推送的平臺,all表明當前應用配置了的全部平臺,也能夠傳android等具體平臺
                .setPlatform(Platform.all())
                //指定推送的接收對象,all表明全部人,也能夠指定已經設置成功的tag或alias或該應應用客戶端調用接口獲取到的registration id
                .setAudience(Audience.alias(alias))
                //jpush的通知,android的由jpush直接下發,iOS的由apns服務器下發,Winphone的由mpns下發
                .setNotification(Notification.newBuilder()
                        //指定當前推送的android通知
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setAlert(alertJsonObject)
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                .build())
                                
                        //指定當前推送的iOS通知
                        .addPlatformNotification(IosNotification.newBuilder()
                        		//傳一個IosAlert對象,指定apns title、subtitle、body等
                                .setAlert(alertJsonObject)
                                //直接傳alert
                                //此項是指定此推送的badge自動加1
                                .incrBadge(1)
                                //此字段的值default表示系統默認聲音;傳sound.caf表示此推送以項目裏面打包的sound.caf聲音來提醒,
                                // 若是系統沒有此音頻則以系統默認聲音提醒;此字段若是傳空字符串,iOS9及以上的系統是無聲音提醒,如下的系統是默認聲音
                                .setSound("default")
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                //容許後臺推送
                                .setContentAvailable(true)
                                .build())
 
                        .build())
                //Platform指定了哪些平臺就會像指定平臺中符合推送條件的設備進行推送。 jpush的自定義消息,
                // sdk默認不作任何處理,不會有通知提示。建議看文檔http://docs.jpush.io/guideline/faq/的
                // [通知與自定義消息有什麼區別?]瞭解通知和自定義消息的區別
                .setMessage(Message.newBuilder()
                		.setTitle(extraJsonObject.toString())
                        .setMsgContent(alertJsonObject.toString())
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用來指定本推送要推送的apns環境,false表示開發,true表示生產;對android和自定義消息無心義
                        .setApnsProduction(false)
                        //此字段是給開發者本身給推送編號,方便推送者分辨推送記錄
                        //.setSendno(1)
                        //此字段的值是用來指定本推送的離線保存時長,若是不傳此字段則默認保存一天,最多指定保留十天;
                        .setTimeToLive(864000)
                        .build())
 
                .build();
 
    }
    
    private PushPayload buildPushObject_Tags_alertWithTitle(String tags, JsonObject alertJsonObject, JsonObject extraJsonObject) {
        
    	System.out.println("----------buildPushObject_Tags_alert");
        //建立一個IosAlert對象,可指定APNs的alert、title等字段
//        IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody(alertJsonObject.get("title").toString(), alertJsonObject.get("subtitle").toString(), alertJsonObject.get("body").toString()).build();
        extraJsonObject.addProperty("customId", this.getCustomId());
        
        return PushPayload.newBuilder()
                //指定要推送的平臺,all表明當前應用配置了的全部平臺,也能夠傳android等具體平臺
                .setPlatform(Platform.all())
                //指定推送的接收對象,all表明全部人,也能夠指定已經設置成功的tag或alias或該應應用客戶端調用接口獲取到的registration id
                .setAudience(Audience.tag(tags))
                //jpush的通知,android的由jpush直接下發,iOS的由apns服務器下發,Winphone的由mpns下發
                .setNotification(Notification.newBuilder()
                        //指定當前推送的android通知
                        .addPlatformNotification(AndroidNotification.newBuilder()
                                .setAlert(alertJsonObject)
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                .build())
                                
                        //指定當前推送的iOS通知
                        .addPlatformNotification(IosNotification.newBuilder()
                        		//傳一個IosAlert對象,指定apns title、subtitle、body等
                                .setAlert(alertJsonObject)
                                //直接傳alert
                                //此項是指定此推送的badge自動加1
                                .incrBadge(1)
                                //此字段的值default表示系統默認聲音;傳sound.caf表示此推送以項目裏面打包的sound.caf聲音來提醒,
                                // 若是系統沒有此音頻則以系統默認聲音提醒;此字段若是傳空字符串,iOS9及以上的系統是無聲音提醒,如下的系統是默認聲音
                                .setSound("default")
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                //容許後臺推送
                                .setContentAvailable(true)
                                .build())
 
                        .build())
                //Platform指定了哪些平臺就會像指定平臺中符合推送條件的設備進行推送。 jpush的自定義消息,
                // sdk默認不作任何處理,不會有通知提示。建議看文檔http://docs.jpush.io/guideline/faq/的
                // [通知與自定義消息有什麼區別?]瞭解通知和自定義消息的區別
                .setMessage(Message.newBuilder()
                		.setTitle(extraJsonObject.toString())
                        .setMsgContent(alertJsonObject.toString())
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用來指定本推送要推送的apns環境,false表示開發,true表示生產;對android和自定義消息無心義
                        .setApnsProduction(false)
                        //此字段是給開發者本身給推送編號,方便推送者分辨推送記錄
                        //.setSendno(1)
                        //此字段的值是用來指定本推送的離線保存時長,若是不傳此字段則默認保存一天,最多指定保留十天;
                        .setTimeToLive(864000)
                        .build())
 
                .build();
 
    }
 
    private PushPayload buildPushObject_ios_all_alertWithTitle(JsonObject alertJsonObject, JsonObject extraJsonObject) {
        
    	System.out.println("----------buildPushObject_ios_registrationId_alertWithTitle");
        //建立一個IosAlert對象,可指定APNs的alert、title等字段
//        IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody(alertJsonObject.get("title").toString(), alertJsonObject.get("subtitle").toString(), alertJsonObject.get("body").toString()).build();
        extraJsonObject.addProperty("customId", this.getCustomId());
        
        return PushPayload.newBuilder()
                //指定要推送的平臺,all表明當前應用配置了的全部平臺,也能夠傳android等具體平臺
                .setPlatform(Platform.ios())
                //指定推送的接收對象,all表明全部人,也能夠指定已經設置成功的tag或alias或該應應用客戶端調用接口獲取到的registration id
                .setAudience(Audience.all())
                //jpush的通知,android的由jpush直接下發,iOS的由apns服務器下發,Winphone的由mpns下發
                .setNotification(Notification.newBuilder()
                        //指定當前推送的android通知
                        .addPlatformNotification(IosNotification.newBuilder()
                                //傳一個IosAlert對象,指定apns title、subtitle、body等
                                .setAlert(alertJsonObject)
                                //直接傳alert
                                //此項是指定此推送的badge自動加1
                                .incrBadge(1)
                                //此字段的值default表示系統默認聲音;傳sound.caf表示此推送以項目裏面打包的sound.caf聲音來提醒,
                                // 若是系統沒有此音頻則以系統默認聲音提醒;此字段若是傳空字符串,iOS9及以上的系統是無聲音提醒,如下的系統是默認聲音
                                .setSound("default")
                                //此字段爲透傳字段,不會顯示在通知欄。用戶能夠經過此字段來作一些定製需求,如特定的key傳要指定跳轉的頁面(value)
                                .addExtra("extra", extraJsonObject)
                                //容許後臺推送
                                .setContentAvailable(true)
                                .build())
                        .build()
                )
                //Platform指定了哪些平臺就會像指定平臺中符合推送條件的設備進行推送。 
                //jpush的自定義消息,sdk默認不作任何處理,不會有通知提示。建議看文檔http://docs.jpush.io/guideline/faq/的
                // [通知與自定義消息有什麼區別?]瞭解通知和自定義消息的區別
                .setMessage(Message.newBuilder()
                		.setTitle(extraJsonObject.toString())
                        .setMsgContent(alertJsonObject.toString())
                        .build())
 
                .setOptions(Options.newBuilder()
                        //此字段的值是用來指定本推送要推送的apns環境,false表示開發,true表示生產;對android和自定義消息無心義
                        .setApnsProduction(false)
                        //此字段是給開發者本身給推送編號,方便推送者分辨推送記錄
                        //.setSendno(1)
                        //此字段的值是用來指定本推送的離線保存時長,若是不傳此字段則默認保存一天,最多指定保留十天,單位爲秒
                        .setTimeToLive(864000)
                        .build())
                .build();
    }
    
    public String getCustomId() {
    	SimpleDateFormat df = new SimpleDateFormat("MMddHHmmssS");
    	int i = (int)(Math.random()*100);
    	String customId = String.format("%s%d", df.format(new Date()), i);
    	return customId;
    }
}

最後附上《小印記》截圖,但願讀者多多支持 服務器

相關文章
相關標籤/搜索