極光推送集成解決方案

1. 極光推送集成背景

? ? ? 最近在研究推送和長(zhǎng)連接,研究了幾家這方面的平臺(tái)之后瘫寝,最后綜合考慮選擇了極光推送。長(zhǎng)連接背砭妫活一直是一個(gè)大問(wèn)題焕阿,尤其的android方面,最近谷歌公司的幾次更新首启,android應(yīng)用蹦郝牛活是越來(lái)越難做,android方面的推送的到達(dá)率更是慘不忍睹毅桃。國(guó)內(nèi)android大環(huán)境大都以云端和客戶端保持長(zhǎng)連接的方式實(shí)現(xiàn)的褒纲。本文主要是說(shuō)一下極光推送普通集成和極光推送廠商通道的集成。

2. 推送普通集成方案

創(chuàng)建項(xiàng)目(見(jiàn)極光文檔:https://docs.jiguang.cn//jpush/guideline/intro/

①添加依賴

Project 根目錄的主 gradle 中配置了 jcenter 支持

implementation 'cn.jiguang.sdk:jpush:3.5.4'

implementation 'cn.jiguang.sdk:jcore:2.2.4'

②配置代碼

配置極光的key钥飞,app 的gradle文件中配置極光的key

ndk {

? ? ? ? ? ? abiFilters "armeabi", "armeabi-v7a", "x86", "arm64-v8a", "x86_64",'mips', 'mips64'

? ? ? ? }

? ? ? ? manifestPlaceholders = [

? ? ? ? ? ? ? ? JPUSH_PKGNAME : applicationId,

? ? ? ? ? ? ? ? JPUSH_APPKEY : "JPUSH KEY", //JPush 上注冊(cè)的包名對(duì)應(yīng)的 Appkey.

? ? ? ? ? ? ? ? JPUSH_CHANNEL : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.

? ? ? ? ]

權(quán)限配置

?<permission

? ? ? ? android:name="com.nade.nadejpush.permission.JPUSH_MESSAGE"

? ? ? ? android:protectionLevel="signature" />

? ? <!-- Required -->

? ? <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />

? ? <uses-permission android:name="android.permission.INTERNET" />

? ? <uses-permission android:name="android.permission.READ_PHONE_STATE" />

? ? <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

? ? <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

? ? <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

? ? <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

? ? <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

? ? <!-- Optional. Required for location feature -->

? ? <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

? ? <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于開(kāi)啟 debug 版本的應(yīng)用在 6.0 系統(tǒng)上的層疊窗口權(quán)限 -->

? ? <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

? ? <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

? ? <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

? ? <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

? ? <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

? ? <uses-permission android:name="android.permission.GET_TASKS" />

? ? <uses-permission android:name="android.permission.VIBRATE" />

服務(wù)和廣播配置?

<!-- Since JCore2.0.0 Required SDK核心功能-->

? ? ? ? <!-- 可配置android:process參數(shù)將Service放在其他進(jìn)程中莺掠;android:enabled屬性不能是false -->

? ? ? ? <!-- 這個(gè)是自定義Service,要繼承極光JCommonService读宙,可以在更多手機(jī)平臺(tái)上使得推送通道保持的更穩(wěn)定 -->

? ? ? ? <service android:name=".service.JPushService"

? ? ? ? ? ? android:enabled="true"

? ? ? ? ? ? android:exported="false"

? ? ? ? ? ? android:process=":pushcore">

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="cn.jiguang.user.service.action" />

? ? ? ? ? ? </intent-filter>

? ? ? ? </service>

? ? ? ? <service

? ? ? ? ? ? android:name="cn.jpush.android.service.PushService"

? ? ? ? ? ? android:enabled="true"

? ? ? ? ? ? android:exported="false" >

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.REGISTER" />

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.REPORT" />

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.PushService" />

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.PUSH_TIME" />

? ? ? ? ? ? </intent-filter>

? ? ? ? </service>

? ? ? ? <service

? ? ? ? ? ? android:name="cn.jpush.android.service.DaemonService"

? ? ? ? ? ? android:enabled="true"

? ? ? ? ? ? android:exported="true">

? ? ? ? ? ? <intent-filter >

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.DaemonService" />

? ? ? ? ? ? ? ? <category android:name="com.nade.nadejpush"/>

? ? ? ? ? ? </intent-filter>

? ? ? ? </service>

? ? ? ? <!-- Required since 3.0.7 -->

? ? ? ? <!-- 新的 tag/alias 接口結(jié)果返回需要開(kāi)發(fā)者配置一個(gè)自定的廣播 -->

? ? ? ? <!-- 3.3.0開(kāi)始所有事件將通過(guò)該類回調(diào) -->

? ? ? ? <!-- 該廣播需要繼承 JPush 提供的 JPushMessageReceiver 類, 并如下新增一個(gè) Intent-Filter -->

? ? ? ? <receiver

? ? ? ? ? ? android:name=".receiver.JPushReceiver"

? ? ? ? ? ? android:enabled="true"

? ? ? ? ? ? android:exported="false" >

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />

? ? ? ? ? ? ? ? <category android:name="com.nade.nadejpush" />

? ? ? ? ? ? </intent-filter>

? ? ? ? </receiver>

? ? ? ? <receiver

? ? ? ? ? ? android:name="cn.jpush.android.service.PushReceiver"

? ? ? ? ? ? android:enabled="true" >

? ? ? ? ? ? <intent-filter android:priority="1000">

? ? ? ? ? ? ? ? <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />

? ? ? ? ? ? ? ? <category android:name="com.nade.nadejpush"/>

? ? ? ? ? ? </intent-filter>

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="android.intent.action.USER_PRESENT" />

? ? ? ? ? ? ? ? <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

? ? ? ? ? ? </intent-filter>

? ? ? ? ? ? <!-- Optional -->

? ? ? ? ? ? <intent-filter>

? ? ? ? ? ? ? ? <action android:name="android.intent.action.PACKAGE_ADDED" />

? ? ? ? ? ? ? ? <action android:name="android.intent.action.PACKAGE_REMOVED" />

? ? ? ? ? ? ? ? <data android:scheme="package" />

? ? ? ? ? ? </intent-filter>

? ? ? ? </receiver>

這里需要自定義一個(gè)消息接收器 JPushReceiver

/**

?* 消息處理彻秆,配合服務(wù)端實(shí)現(xiàn)具體的邏輯

?*/

public class JPushReceiver extends JPushMessageReceiver {

? ? @Override

? ? public void onMessage(Context context, CustomMessage customMessage) {

? ? ? ? super.onMessage(context, customMessage);

? ? ? ? //消息到達(dá) 可指定類型,指定操作

? ? ? ? NotificationBar.showNotifiBar(context,"我是消息","我是消息內(nèi)容");

? ? ? ? Log.d("jpush", "onMessage: "+customMessage.message+"/"+customMessage.extra);

? ? }

? ? @Override

? ? public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {

? ? ? ? super.onNotifyMessageArrived(context, notificationMessage);

? ? ? ? // 通知到達(dá)

? ? ? ? Log.d("jpush", "onNotifyMessageArrived: "+notificationMessage.notificationExtras);

? ? }

? ? @Override

? ? public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {

? ? ? ? super.onNotifyMessageOpened(context, notificationMessage);

? ? ? ? // 點(diǎn)擊通知欄消息 可指定類型结闸,指定操作

? ? ? ? Log.d("jpush", "onNotifyMessageOpened: "+notificationMessage.notificationExtras);

? ? }

? ? @Override

? ? public void onRegister(Context context, String s) {

? ? ? ? super.onRegister(context, s);

? ? ? ? // 保存極光id

? ? ? ? Log.d("jpush", "onRegister: id="+s);

? ? }

? ? @Override

? ? public void onConnected(Context context, boolean b) {

? ? ? ? super.onConnected(context, b);

? ? ? ? Log.d("jpush", "onConnected: "+b);

? ? ? ? if (b) {

? ? ? ? ? ? // 鏈接監(jiān)聽(tīng) 保存極光id

? ? ? ? ? ? String registrationID = JPushInterface.getRegistrationID(context.getApplicationContext());

? ? ? ? ? ? Log.d("jpush", "onConnected: 連接成功獲取id="+registrationID);

? ? ? ? }

? ? }

}

③ 初始化

這里關(guān)于初始化方案這里分享兩種:

i.? 極光方案唇兑,在Application的onCreate中初始化,也就是在應(yīng)用啟動(dòng)時(shí)初始化極光桦锄,優(yōu)點(diǎn)快速準(zhǔn)確扎附;但會(huì)影響app啟動(dòng)速度。

ii.? 在啟動(dòng)頁(yè)初始化结耀,優(yōu)點(diǎn)app啟動(dòng)速度快帕棉。我個(gè)人覺(jué)得第二方案更好一點(diǎn)针肥,在優(yōu)化app啟動(dòng)時(shí),會(huì)有一些幫助。

RegistrationID的獲取香伴,也有兩個(gè)方案

i. 在初始化以后慰枕,獲取極光id 極光id是異步返回的,此處不一定獲取成功即纲。

?String registrationID = JPushInterface.getRegistrationID(getApplicationContext());

ii. JPushReceiver中獲取具帮,這里獲取更為安全,能確保你一定可以拿到id低斋,建議采用該種方案

?@Override

? ? public void onRegister(Context context, String s) {

? ? ? ? super.onRegister(context, s);

? ? ? ? // 保存極光id

? ? ? ? Log.d("jpush", "onRegister: 注冊(cè)成功后返回極光id="+s);

? ? }

? ? @Override

? ? public void onConnected(Context context, boolean b) {

? ? ? ? super.onConnected(context, b);

? ? ? ? Log.d("jpush", "onConnected: "+b);

? ? ? ? if (b) {

? ? ? ? ? ? // 鏈接監(jiān)聽(tīng) 保存極光id

? ? ? ? ? ? String registrationID = JPushInterface.getRegistrationID(context.getApplicationContext());

? ? ? ? ? ? Log.d("jpush", "onConnected: 連接成功獲取id="+registrationID);

? ? ? ? }

? ? }

到此處蜂厅,極光推送的基本集成就完成了;屆時(shí)可以在極光的管理中心膊畴,去測(cè)試推送了掘猿。

在普通集成的基礎(chǔ)上,我們開(kāi)始集成廠商通道唇跨;

3. 廠商通道的集成

? ? ?廠商通道稠通,直白點(diǎn)說(shuō)就是系統(tǒng)級(jí)推送,和 ios一樣买猖;推送至手機(jī)系統(tǒng)平臺(tái)改橘,由系統(tǒng)平臺(tái)作為系統(tǒng)通知展示。到達(dá)率得到了很大的保證玉控;目前極光支持 小米 華為 魅族 oppo vivo FCM這幾個(gè)平臺(tái)的廠商通道飞主;原理見(jiàn)下圖:

?①申請(qǐng)平臺(tái)項(xiàng)目(小米,華為創(chuàng)建項(xiàng)目高诺,審核通過(guò)后申請(qǐng)項(xiàng)目的推送服務(wù))

以小米為例

https://dev.mi.com/console/appservice/push.html

先在小米開(kāi)放平臺(tái)創(chuàng)建項(xiàng)目 填寫(xiě)各種資料碌识,審核通過(guò)后,就開(kāi)始申請(qǐng)小米推送服務(wù)虱而。審核通過(guò)后丸冕,去極光后臺(tái)配置id 和即可;配置好以后 ,開(kāi)始進(jìn)行代碼配置薛窥,Project 根目錄的主 gradle 中配置了華為支持

allprojects {

? ? repositories {

? ? ? ? google()


? ? ? ? maven { url "https://jitpack.io" }

? ? ? ? maven {url'http://developer.huawei.com/repo/'}

? ? }

}

在app的gradle添加廠商通道sdk依賴胖烛,這個(gè)使用的極光的

?implementation 'cn.jiguang.sdk.plugin:huawei:3.3.4'

? ? implementation 'cn.jiguang.sdk.plugin:xiaomi:3.3.4'

? ? implementation 'cn.jiguang.sdk.plugin:meizu:3.3.4'

? ? implementation 'cn.jiguang.sdk.plugin:oppo:3.3.4'

? ? implementation 'cn.jiguang.sdk.plugin:vivo:3.3.4'

在app的gradle 配置廠商平臺(tái)申請(qǐng)好的 id 和 key

?備注:這里使用的是各平臺(tái)項(xiàng)目的推送服務(wù)id, 各平臺(tái)項(xiàng)目的推送服務(wù)id,各平臺(tái)項(xiàng)目的推送服務(wù)id!W缑浴佩番!?

manifestPlaceholders = [

? ? ? ? ? ? ? ? JPUSH_PKGNAME : applicationId,

? ? ? ? ? ? ? ? JPUSH_APPKEY ?: "JPUSHKEY", //JPush上注冊(cè)的包名對(duì)應(yīng)的appkey.

? ? ? ? ? ? ? ? JPUSH_CHANNEL : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.

? ? ? ? ? ? ? ? HUAWEI_APPID ?: "100574375",//華為平臺(tái)注冊(cè)的appid

? ? ? ? ? ? ? ? XIAOMI_APPKEY : "MI-KEY",//小米平臺(tái)注冊(cè)的appkey

? ? ? ? ? ? ? ? XIAOMI_APPID ?: "MI-IS",//小米平臺(tái)注冊(cè)的appid

? ? ? ? ? ? ? ? MEIZU_APPKEY ?: "MZ-KEY",//魅族平臺(tái)注冊(cè)的appkey

? ? ? ? ? ? ? ? MEIZU_APPID ? : "MZ-ID",//魅族平臺(tái)注冊(cè)的appid

? ? ? ? ? ? ? ? OPPO_APPKEY ? : "OP-KEY", // OPPO平臺(tái)注冊(cè)的appkey

? ? ? ? ? ? ? ? OPPO_APPID ? ?: "OP-ID", // OPPO平臺(tái)注冊(cè)的appid

? ? ? ? ? ? ? ? OPPO_APPSECRET: "OP-SECRET"

? ? ? ? ? ? ? ? // vivo

? ? ? ? ? ? ? ? VIVO_APPKEY : "KEY",

? ? ? ? ? ? ? ? VIVO_APPID : "ID"

? ? ? ? ]

到此處就完成了。關(guān)于廠商通道的測(cè)試方法罢杉,去各大平臺(tái)的推送服務(wù)里的項(xiàng)目中趟畏,進(jìn)行手動(dòng)推送測(cè)試。以小米為例滩租,小米開(kāi)放平臺(tái) --- 應(yīng)用服務(wù) -- 消息推送 -- 全部應(yīng)用 --- 你的應(yīng)用 -- 創(chuàng)建推送 即可開(kāi)始測(cè)試

測(cè)試方法:

①保持長(zhǎng)鏈接時(shí)赋秀,手動(dòng)推送利朵,是否收到推送消息

②斷開(kāi)長(zhǎng)鏈接時(shí),手動(dòng)推送猎莲,是否收到推送消息

③斷開(kāi)長(zhǎng)鏈接時(shí)绍弟,手動(dòng)推送,打開(kāi)應(yīng)用后是否收到推送消息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末著洼,一起剝皮案震驚了整個(gè)濱河市樟遣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身笤,老刑警劉巖豹悬,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異液荸,居然都是意外死亡瞻佛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門娇钱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伤柄,“玉大人,你說(shuō)我怎么就攤上這事忍弛。” “怎么了考抄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵细疚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我川梅,道長(zhǎng)疯兼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任贫途,我火速辦了婚禮吧彪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丢早。我一直安慰自己姨裸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布怨酝。 她就那樣靜靜地躺著傀缩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪农猬。 梳的紋絲不亂的頭發(fā)上赡艰,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音斤葱,去河邊找鬼慷垮。 笑死揖闸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的料身。 我是一名探鬼主播汤纸,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惯驼!你這毒婦竟也來(lái)了蹲嚣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祟牲,失蹤者是張志新(化名)和其女友劉穎隙畜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體说贝,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡议惰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乡恕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片言询。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖傲宜,靈堂內(nèi)的尸體忽然破棺而出运杭,到底是詐尸還是另有隱情,我是刑警寧澤函卒,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布辆憔,位于F島的核電站,受9級(jí)特大地震影響报嵌,放射性物質(zhì)發(fā)生泄漏虱咧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一锚国、第九天 我趴在偏房一處隱蔽的房頂上張望腕巡。 院中可真熱鬧,春花似錦血筑、人聲如沸绘沉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梆砸。三九已至,卻和暖如春园欣,著一層夾襖步出監(jiān)牢的瞬間帖世,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留日矫,地道東北人赂弓。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哪轿,于是被迫代替她去往敵國(guó)和親盈魁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 今天下午窃诉,我?guī)е米觼?lái)到好利來(lái)蛋糕房做蛋糕杨耙,這是婷子這周的小愿望,今天可以實(shí)現(xiàn)了飘痛。走進(jìn)蛋糕房珊膜,婷子看著蛋糕模型,心...
    毒刺玫瑰閱讀 185評(píng)論 0 0
  • 得知阿姨去世已是五月的一天中午宣脉,朋友圈里一張黑白照來(lái)的太過(guò)突然车柠,赫然寫(xiě)著張玉敏因病與世長(zhǎng)辭了!先是一驚塑猖,眼淚順著眼...
    陽(yáng)光旅社閱讀 669評(píng)論 0 3
  • 講道理竹祷,這么隆重的事情應(yīng)該以排比句作為開(kāi)頭,但是羊苟,我還是決定講個(gè)故事塑陵。 隔壁桌的小王突然說(shuō)要結(jié)婚了,問(wèn)其原因蜡励,他說(shuō)...
    簡(jiǎn)書(shū)交友閱讀 2,858評(píng)論 9 30
  • 厭倦了與雨兼程 風(fēng)在夜里悄然離開(kāi) 方向即黎明曙光所在 方向即遼闊的大海 穿過(guò)破裂的墻壁 徘徊于一處人跡 轉(zhuǎn)瞬馳往青...
    Boty閱讀 180評(píng)論 0 0
  • 關(guān)鍵字 java 代理模式 動(dòng)態(tài)代理 自定義注解 泛型使用 AOP springboot 1.java靜態(tài)代理 遵...
    LH_0811閱讀 509評(píng)論 0 0