JPush推送(極光推送)推送消息

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());
        }
    }
}

持續更新中.......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容