極光推送集成過程

jcenter 自動(dòng)集成步驟

好處:不需要在項(xiàng)目中添加jar和so,jcenter會(huì)自動(dòng)完成依賴;簡(jiǎn)化了之前繁瑣的配置步驟

1. Module的build.gradle

    android {
        ......
        defaultConfig {
            applicationId "com.xxx.xxx" //JPush上注冊(cè)的包名.
            ......
    
            ndk {
                //選擇要添加的對(duì)應(yīng)cpu類型的.so庫(kù)。 
                abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a' 
                // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
            }
    
            manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId,
                JPUSH_APPKEY : "你的appkey",     //JPush上注冊(cè)的包名對(duì)應(yīng)的appkey.
                JPUSH_CHANNEL : "自定義渠道名稱", //用戶渠道統(tǒng)計(jì)的渠道名稱
            ]
            ......
        }
        ......
    }
    
    dependencies {
        ......
    
        compile 'cn.jiguang.sdk:jpush:3.0.5'  // 此處以JPush 3.0.5 版本為例。
        compile 'cn.jiguang.sdk:jcore:1.1.2'  // 此處以JCore 1.1.2 版本為例。
        ......
    }

注 : 如果在添加以上 abiFilter 配置之后android Studio出現(xiàn)以下提示:

       NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

則在 Project 根目錄的gradle.properties文件中添加:

android.useDeprecatedNdk=true

說明:若沒有res/drawable-xxxx/jpush_notification_icon這個(gè)資源默認(rèn)使用應(yīng)用圖標(biāo)作為通知icon,在5.0以上系統(tǒng)將應(yīng)用圖標(biāo)作為statusbar icon可能顯示不正常,用戶可定義沒有陰影和漸變色的icon替換這個(gè)文件,文件名不要變。

這里建議將應(yīng)用icon設(shè)置為通知顯示圖標(biāo),這里設(shè)置有點(diǎn)問題,我嘗試在初始化之后調(diào)用以下代碼設(shè)置失敗。

 BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this);
 builder.statusBarDrawable = R.drawable.jpush_notification_icon;

2. 初始化sdk

    JPushInterface.setDebugMode(true);//正式版的時(shí)候設(shè)置false,關(guān)閉調(diào)試
    JPushInterface.init(this);

3. 混淆

-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

4. 創(chuàng)建自定義廣播接收器

JPush SDK 收到推送,通過廣播的方式,轉(zhuǎn)發(fā)給開發(fā)者App,我們可以自定義廣播接受到推送消息。

/**
 * 自定義接收器
 * 
 * 如果不定義這個(gè) Receiver,則:
 * 1) 默認(rèn)用戶會(huì)打開主界面
 * 2) 接收不到自定義消息
 */
public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "JPush";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...

        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下來的自定義消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
            processCustomMessage(context, bundle);

        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下來的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.d(TAG, "[MyReceiver] 接收到推送下來的通知的ID: " + notifactionId);

        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用戶點(diǎn)擊打開了通知");
//
//          //打開自定義的Activity
//          Intent i = new Intent(context, TestActivity.class);
//          i.putExtras(bundle);
//          //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//          i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
//          context.startActivity(i);

        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用戶收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在這里根據(jù) JPushInterface.EXTRA_EXTRA 的內(nèi)容處理代碼,比如打開新的Activity, 打開一個(gè)網(wǎng)頁(yè)等..

        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
            Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
    }

    // 打印所有的 intent extra 數(shù)據(jù)
    private static String printBundle(Bundle bundle) {
        ...//省略了
    }

    //send msg to MainActivity
    private void processCustomMessage(Context context, Bundle bundle) {
        ...//省略了
    }
}

別忘了在清單文件中注冊(cè)哦:

  <!-- User defined.  For test only  用戶自定義的廣播接收器-->
    <receiver
        android:name="com.example.jpushdemo.MyReceiver"        //自己寫的Receiver
        android:exported="false"
        android:enabled="true">
        <intent-filter>
            <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用戶注冊(cè)SDK的intent-->
            <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用戶接收SDK消息的intent-->
            <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用戶接收SDK通知欄信息的intent-->
            <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用戶打開自定義通知欄的intent-->
            <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收網(wǎng)絡(luò)變化 連接/斷開 since 1.6.3 -->
            <category android:name="${applicationId}" />                //包名
        </intent-filter>
    </receiver>
    
到這里一般就可以正常收到推送了。

5. 推送到單個(gè)用戶或一組用戶

  • 單個(gè)推送

    對(duì)應(yīng)別名 alias:為安裝了應(yīng)用程序的用戶,取個(gè)別名來標(biāo)識(shí)。以后給該用戶 Push 消息時(shí),就可以用此別名來指定。
    每個(gè)用戶只能指定一個(gè)別名。
    Method - setAlias:新的調(diào)用會(huì)覆蓋之前的設(shè)置

  • 分組推送

    對(duì)應(yīng)標(biāo)簽 tag:為安裝了應(yīng)用程序的用戶,打上標(biāo)簽。其目的主要是方便開發(fā)者根據(jù)標(biāo)簽,來批量下發(fā) Push 消息。
    可為每個(gè)用戶打多個(gè)標(biāo)簽。
    Method - setTags:新的調(diào)用會(huì)覆蓋之前的設(shè)置
    </br>

  • 設(shè)置別名和tag

    JPushInterface.setAliasAndTags(getApplicationContext(),alias, Tags);
    

6. 其他:

  • 極光統(tǒng)計(jì):所有的 Activity 的 onResume / onPause 方法里調(diào)用
代碼示例

        @Override
        protected void onResume() {
            super.onResume();
            JPushInterface.onResume(this);
        }
        @Override
        protected void onPause() {
            super.onPause();
            JPushInterface.onPause(this);
        }
>極光推送的設(shè)備唯一性標(biāo)識(shí) RegistrationID:

</br>

RegistrationID 生成規(guī)則解析:       

    Android 上因?yàn)閲?guó)內(nèi)存在大量山寨設(shè)備的原因,正常的 IMEI, Mac Address, AndroidID 這些可以考慮用作唯一標(biāo)識(shí)的值,都是不可以用的,因?yàn)檫@些值在一批設(shè)備中可能都是同一個(gè)值。極光的基本思路是:
    
生成一個(gè) DeviceID 保存到 Settings, External Storage。依賴本地存儲(chǔ),應(yīng)用被卸載后重新安裝這些存儲(chǔ)里的 DeviceID 還在的話,就是同一個(gè)設(shè)備。這一條理論上解決 90% 的不變性問題。
        
DeviceID 之外增加補(bǔ)充規(guī)則:綜合根據(jù) IMEI, MAC Address, AndroidID, Serial_Number 這幾個(gè)值來判斷,是否可能是老設(shè)備。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 推送技術(shù)產(chǎn)生場(chǎng)景: --服務(wù)器端主動(dòng)性: 客戶端與服務(wù)器交互都是客戶端主動(dòng)的, 服務(wù)器一般不能主動(dòng)與客戶端進(jìn)行數(shù)據(jù)...
    原軍鋒閱讀 35,207評(píng)論 4 60
  • 版本記錄 前言 ??現(xiàn)在很多APP都有推送功能,其中極光推送就是很多APP的首選。我們最近的幾個(gè)APP也是用的極光...
    刀客傳奇閱讀 8,675評(píng)論 0 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 版本記錄 前言 前一篇已經(jīng)對(duì)ios新特性進(jìn)行了介紹,這一篇?jiǎng)t對(duì)ios的SDK進(jìn)行說明。1. 極光推送集成(一)2....
    刀客傳奇閱讀 1,426評(píng)論 0 1
  • 不同版本極光推送SDK集成各有差異,集成時(shí)一定要注意版本號(hào),樓主已將博文更新成最新的SDK JPush v3.0....
    i順頌時(shí)宜閱讀 8,017評(píng)論 37 170

友情鏈接更多精彩內(nèi)容