jpush推送
其正常工作的必要條件是:JPush SDK 與 JPush Server 的網(wǎng)絡(luò)保持著連接。請(qǐng)參考這篇文章來(lái)做進(jìn)一步的理解:極光推送技術(shù)原理:移動(dòng)無(wú)線網(wǎng)絡(luò)長(zhǎng)連接歼郭。
開(kāi)發(fā)者集成 JPush Android SDK 到其應(yīng)用里,JPush Android SDK 創(chuàng)建到 JPush Cloud 的長(zhǎng)連接儿奶,為 App 提供永遠(yuǎn)在線的能力挖腰。
當(dāng)開(kāi)發(fā)者想要及時(shí)地推送消息到達(dá) App 時(shí)词身,只需要調(diào)用 JPush API 推送,或者使用其他方便的智能推送工具贴捡,即可輕松與用戶交流忽肛。
圖中紅色部分,是 JPush 與 App 開(kāi)發(fā)者的接觸點(diǎn)烂斋。手機(jī)客戶端側(cè)屹逛,App 需要集成 JPush SDK础废;服務(wù)器端部分,開(kāi)發(fā)者調(diào)用 JPush REST API 來(lái)進(jìn)行推送罕模。
Android SDK 服務(wù)
JPush Android SDK 是作為 Android Service 長(zhǎng)期運(yùn)行在后臺(tái)的评腺,從而創(chuàng)建并保持長(zhǎng)連接,保持永遠(yuǎn)在線的能力淑掌。JPush可推送的內(nèi)容如下
- 其中
紅包
需要集成第三方SDK - 區(qū)別通知于自定義消息
通知即指在手機(jī)的通知欄(狀態(tài)欄)上會(huì)顯示的一條通知信息蒿讥。
自定義消息是極光推送自己的概念。
自定義消息不是通知抛腕,所以不會(huì)被SDK展示到通知欄上芋绸。其內(nèi)容完全由開(kāi)發(fā)者自己定義。
自定義消息主要用于應(yīng)用的內(nèi)部業(yè)務(wù)邏輯兽埃。一條自定義消息推送過(guò)來(lái)侥钳,有可能沒(méi)有任何界面顯示
使用Jcenter自動(dòng)集成說(shuō)明
使用jcenter自動(dòng)集成的開(kāi)發(fā)者适袜,不需要在項(xiàng)目中添加jar和so柄错,jcenter會(huì)自動(dòng)完成依賴;在AndroidManifest.xml中不需要添加任何JPush SDK 相關(guān)的配置苦酱,jcenter會(huì)自動(dòng)導(dǎo)入售貌。
如果開(kāi)發(fā)者需要修改組件屬性,可以在本地的 AndroidManifest 中定義同名的組件并配置想要的屬性疫萤,然后用 xmlns:tools 來(lái)控制本地組件覆蓋 jcenter 上的組件颂跨。
集成步驟
- 當(dāng)然先要注冊(cè)開(kāi)發(fā)者賬號(hào)
- 下載對(duì)應(yīng)平臺(tái)的SDK(android/ios/windowsphone/...)
- 配置
- 開(kāi)發(fā)
- 測(cè)試推送
來(lái)一波最easy的demo
以android項(xiàng)目為例,使用Android Studio自動(dòng)集(jcenter)成極光推送
- 創(chuàng)建AS項(xiàng)目
- 在JPUSH平臺(tái)創(chuàng)建應(yīng)用扯饶,獲取
appkey
,創(chuàng)建時(shí)需提供項(xiàng)目的包名 - 在
module:app
下的build.gradle
中添加依賴
compile 'cn.jiguang.sdk:jpush:3.0.3' // 此處以JPush 3.0.3 版本為例恒削。 compile 'cn.jiguang.sdk:jcore:1.1.1' // 此處以JCore 1.1.1 版本為例。
-
module:app
下的build.gradle
>defaultConfig{}
中添加以下代碼
ndk {
//選擇要添加的對(duì)應(yīng)cpu類(lèi)型的.so庫(kù)尾序。
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "eabbe4d26af31ef9b397c3a7", //JPush上注冊(cè)的包名對(duì)應(yīng)的appkey.
JPUSH_CHANNEL : "developer-default", //暫時(shí)填寫(xiě)默認(rèn)值即可.
]
配置完畢了钓丰,點(diǎn)擊一下如圖按鈕,as自動(dòng)集成所需每币,不報(bào)錯(cuò)就可以進(jìn)行下一項(xiàng)了
- 在項(xiàng)目的Application中進(jìn)行初始化JPUSH的SDK
@Override
public void onCreate() {
super.onCreate();
//初始化
JPushInterface.init(this);
//開(kāi)啟調(diào)試
JPushInterface.setDebugMode(true);
}
- 在JPUSH控制臺(tái)進(jìn)行推送測(cè)試
測(cè)試結(jié)果提示:
- 按以上操作就簡(jiǎn)單集成了携丁,后臺(tái)推送的消息也能準(zhǔn)確接收到
- 在系統(tǒng)通知欄可以看見(jiàn)圖標(biāo)為
android
中經(jīng)典的icon(機(jī)器人圖標(biāo)) -
發(fā)送通知
和富媒體消息
下的URL
消息可準(zhǔn)確收到 -
自定義消息
后臺(tái)顯示成功,通知欄不顯示(這個(gè)屬于正常情況兰怠,需顯示還需要自己操作) -
富媒體消息
下的模板
后臺(tái)顯示發(fā)送成功梦鉴,手機(jī)上未收到消息
針對(duì)以上出現(xiàn)問(wèn)題的(使用jcenter集成)解決方案
如何設(shè)置推送顯示項(xiàng)目所需的圖標(biāo)?
官方文檔特別說(shuō)明
說(shuō)明:若沒(méi)有res/drawable-xxxx/jpush_notification_icon這個(gè)資源默認(rèn)使用應(yīng)用圖標(biāo)作為通知icon揭保,在5.0以上系統(tǒng)將應(yīng)用圖標(biāo)作為statusbar icon可能顯示不正常肥橙,用戶可定義沒(méi)有陰影和漸變色的icon替換這個(gè)文件,文件名不要變秸侣。
嘗試:將自己的圖片改名為jpush_notification_icon
放到res/drawable-xxxx
文件夾存筏,重新運(yùn)行仍然顯示默認(rèn)icon
- 終極方案
基于上面出現(xiàn)的問(wèn)題娜庇,如何才能接收到富媒體消息?
原因:未配置PushActivity組件
必須將壓縮包 res 中的資源放到我們自己的項(xiàng)目的對(duì)應(yīng)文件夾方篮,并按照官方示例AndroidManifest.xml
配置 PushActivity 組件終極方案
基于上面出現(xiàn)的問(wèn)題名秀,如何才能接收到自定義消息并顯示到所發(fā)送的消息?
自定義消息:SDK 不會(huì)把自定義消息展示到通知欄藕溅。
調(diào)試時(shí)匕得,需要到日志里才可以看到服務(wù)器端推送的自定義消息。自定義消息一定要由開(kāi)發(fā)者寫(xiě) 接收推送消息 來(lái)處理收到的消息
- 自定義廣播接收器
MyReceiver
(采用靜態(tài)注冊(cè)方式) -
AndroidManifest.xml
注冊(cè)廣播配置,這里添加所有action
具體項(xiàng)目可根據(jù)實(shí)際情況配置
<receiver android:name=".MyReceiver"
android:enabled="true"
>
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="com.pushdemo" />
</intent-filter>
</receiver>
廣播中的每個(gè)action
詳情功能說(shuō)明巾表,請(qǐng)查看官方文檔API-接收推送消息Receiver
附上項(xiàng)目完整MyReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d(TAG, "onReceive - " + intent.getAction());
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
} else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
// 自定義消息不會(huì)展示在通知欄汁掠,完全要開(kāi)發(fā)者寫(xiě)代碼去處理
String content = bundle.getString(JPushInterface.EXTRA_MESSAGE);
String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
Toast.makeText(context, "自定義消息" + content + "\nextra" + extra, Toast.LENGTH_SHORT).show();
//TODO 可推送json過(guò)來(lái),接收到再解析
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
System.out.println("收到了通知");
// 在這里可以做些統(tǒng)計(jì)集币,或者做些其他工作
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent
.getAction())) {
System.out.println("用戶點(diǎn)擊打開(kāi)了通知");
// 在這里可以自己寫(xiě)代碼去定義用戶點(diǎn)擊后的行為
Intent i = new Intent(context, MainActivity.class); // 自定義打開(kāi)的界面
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} else {
Log.d(TAG, "Unhandled intent - " + intent.getAction());
}
}
}
持續(xù)更新中.......