jpush推送
其正常工作的必要條件是:JPush SDK 與 JPush Server 的網絡保持著連接。請參考這篇文章來做進一步的理解:極光推送技術原理:移動無線網絡長連接。
開發者集成 JPush Android SDK 到其應用里,JPush Android SDK 創建到 JPush Cloud 的長連接,為 App 提供永遠在線的能力。
當開發者想要及時地推送消息到達 App 時,只需要調用 JPush API 推送,或者使用其他方便的智能推送工具,即可輕松與用戶交流。
圖中紅色部分,是 JPush 與 App 開發者的接觸點。手機客戶端側,App 需要集成 JPush SDK;服務器端部分,開發者調用 JPush REST API 來進行推送。
Android SDK 服務
JPush Android SDK 是作為 Android Service 長期運行在后臺的,從而創建并保持長連接,保持永遠在線的能力。JPush可推送的內容如下
- 其中
紅包
需要集成第三方SDK - 區別通知于自定義消息
通知即指在手機的通知欄(狀態欄)上會顯示的一條通知信息。
自定義消息是極光推送自己的概念。
自定義消息不是通知,所以不會被SDK展示到通知欄上。其內容完全由開發者自己定義。
自定義消息主要用于應用的內部業務邏輯。一條自定義消息推送過來,有可能沒有任何界面顯示
使用Jcenter自動集成說明
使用jcenter自動集成的開發者,不需要在項目中添加jar和so,jcenter會自動完成依賴;在AndroidManifest.xml中不需要添加任何JPush SDK 相關的配置,jcenter會自動導入。
如果開發者需要修改組件屬性,可以在本地的 AndroidManifest 中定義同名的組件并配置想要的屬性,然后用 xmlns:tools 來控制本地組件覆蓋 jcenter 上的組件。
集成步驟
- 當然先要注冊開發者賬號
- 下載對應平臺的SDK(android/ios/windowsphone/...)
- 配置
- 開發
- 測試推送
來一波最easy的demo
以android項目為例,使用Android Studio自動集(jcenter)成極光推送
- 創建AS項目
- 在JPUSH平臺創建應用,獲取
appkey
,創建時需提供項目的包名 - 在
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 {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a'
// 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "eabbe4d26af31ef9b397c3a7", //JPush上注冊的包名對應的appkey.
JPUSH_CHANNEL : "developer-default", //暫時填寫默認值即可.
]
配置完畢了,點擊一下如圖按鈕,as自動集成所需,不報錯就可以進行下一項了
- 在項目的Application中進行初始化JPUSH的SDK
@Override
public void onCreate() {
super.onCreate();
//初始化
JPushInterface.init(this);
//開啟調試
JPushInterface.setDebugMode(true);
}
- 在JPUSH控制臺進行推送測試
測試結果提示:
- 按以上操作就簡單集成了,后臺推送的消息也能準確接收到
- 在系統通知欄可以看見圖標為
android
中經典的icon(機器人圖標) -
發送通知
和富媒體消息
下的URL
消息可準確收到 -
自定義消息
后臺顯示成功,通知欄不顯示(這個屬于正常情況,需顯示還需要自己操作) -
富媒體消息
下的模板
后臺顯示發送成功,手機上未收到消息
針對以上出現問題的(使用jcenter集成)解決方案
如何設置推送顯示項目所需的圖標?
官方文檔特別說明
說明:若沒有res/drawable-xxxx/jpush_notification_icon這個資源默認使用應用圖標作為通知icon,在5.0以上系統將應用圖標作為statusbar icon可能顯示不正常,用戶可定義沒有陰影和漸變色的icon替換這個文件,文件名不要變。
嘗試:將自己的圖片改名為jpush_notification_icon
放到res/drawable-xxxx
文件夾,重新運行仍然顯示默認icon
- 終極方案
基于上面出現的問題,如何才能接收到富媒體消息?
原因:未配置PushActivity組件
必須將壓縮包 res 中的資源放到我們自己的項目的對應文件夾,并按照官方示例AndroidManifest.xml
配置 PushActivity 組件終極方案
基于上面出現的問題,如何才能接收到自定義消息并顯示到所發送的消息?
自定義消息:SDK 不會把自定義消息展示到通知欄。
調試時,需要到日志里才可以看到服務器端推送的自定義消息。自定義消息一定要由開發者寫 接收推送消息 來處理收到的消息
- 自定義廣播接收器
MyReceiver
(采用靜態注冊方式) -
AndroidManifest.xml
注冊廣播配置,這里添加所有action
具體項目可根據實際情況配置
<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>
廣播中的每個action
詳情功能說明,請查看官方文檔API-接收推送消息Receiver
附上項目完整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())) {
// 自定義消息不會展示在通知欄,完全要開發者寫代碼去處理
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過來,接收到再解析
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
System.out.println("收到了通知");
// 在這里可以做些統計,或者做些其他工作
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent
.getAction())) {
System.out.println("用戶點擊打開了通知");
// 在這里可以自己寫代碼去定義用戶點擊后的行為
Intent i = new Intent(context, MainActivity.class); // 自定義打開的界面
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} else {
Log.d(TAG, "Unhandled intent - " + intent.getAction());
}
}
}
持續更新中.......