天天看點

Android極光推送 jcenter 自動內建

項目中要求內建極光推送  在看文當時發現極光提供了一種jcenter自動內建的方式,相對于之前的手動內建方式,這種方法真的是簡單友善,不必在大面積複制粘貼了

下面把內建步驟記錄一下 :

1.配置jcenter支援

在Project 根目錄的主 gradle 中配置了jcenter支援(建立project預設配置就支援) 

build.gradle

buildscript {
    repositories {
        jcenter()
    }
}

allprojets {
    repositories {
        jcenter()
    }
}
           

2.gradle中添加依賴

在Moudle的gradle中添加依賴和AndroidManifest的替換變量。

android {

    defaultConfig {
        applicationId "com.xxx.xxx" //JPush上注冊的包名.

        ndk {
            //選擇要添加的對應cpu類型的.so庫。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

        manifestPlaceholders = [
            JPUSH_PKGNAME : applicationId, //JPush上注冊的包名.
            JPUSH_APPKEY : "你的appkey", //JPush上注冊的包名對應的appkey.
            JPUSH_CHANNEL : "developer-default", //暫時填寫預設值即可.
        ]
    }
}

dependencies {
    ......

    compile 'cn.jiguang.sdk:jpush:3.1.3'  // 此處以JPush 3.1.3 版本為例。
    compile 'cn.jiguang.sdk:jcore:1.2.1'  // 此處以JCore 1.2.1 版本為例。
    ......
}
           

項目開發過程中一般都有開發環境和生産環境,這兩者的有時候為了友善區分包名會不一樣,這也導緻開發環境和生産環境所申請的KEY是不一樣的,是以這種情況為了不用每次打包的時候都去改KEY,可以按照下面的方式添加依賴。

android {

    defaultConfig {
        ndk {
            //選擇要添加的對應cpu類型的.so庫。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }
    }

    buildTypes {
        debug {
            //測試環境
            applicationId "com.xxx.xxx" //JPush上注冊的包名.
            manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId, //JPush上注冊的包名.
                JPUSH_APPKEY : "你的appkey", //JPush上注冊的包名對應的appkey.
                JPUSH_CHANNEL : "developer-default", //暫時填寫預設值即可.
            ]
        }
        release {
            //生産環境
            applicationId "com.xxx.xxx" //JPush上注冊的包名.
            manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId, //JPush上注冊的包名.
                JPUSH_APPKEY : "你的appkey", //JPush上注冊的包名對應的appkey.
                JPUSH_CHANNEL : "developer-default", //暫時填寫預設值即可.
            ]
        }
}

dependencies {
    ......

    compile 'cn.jiguang.sdk:jpush:3.1.3'  // 此處以JPush 3.1.3 版本為例。
    compile 'cn.jiguang.sdk:jcore:1.2.1'  // 此處以JCore 1.2.1 版本為例。
    ......
}
           

注 : 如果在添加以上 abiFilter 配置之後android Studio出現以下提示:

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

則在 Project 根目錄的gradle.properties檔案中添加:

android.useDeprecatedNdk=true
           

這種情況基本上不會出現,隻有用到NDK時才有可能遇到

3.配置混淆檔案

在 proguard-rules.pro 檔案中加入混淆代碼

-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }

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

4.初始化極光推送

在自定義的Application中onCreate中調用極光推送的初始化方法。

public class JPushApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true); //正式環境時去掉此行代碼
        JPushInterface.init(this);
    }
}
           

然後在 AndroidManifest.xml 檔案中關聯JPushApplication

<application
        android:name=".JPushApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
</application>
           

5. 極光推送權限配置

根據需求添權重限

<!-- Required -->
    <permission
        android:name="您應用的包名.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

    <!-- Required -->
    <uses-permission android:name="您應用的包名.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <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.VIBRATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!-- Optional. Required for location feature -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于開啟 debug 版本的應用在6.0 系統上 層疊視窗權限 -->
    <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" />
           

6. 建立自定義的廣播接收器

自定義廣播接收器,官方Demo已給出(這裡已簡化)

/**
 * 自定義JPush接收器
 * <p>
 * 如果不定義這個 Receiver,則:
 * 1) 預設使用者會打開主界面
 * 2) 接收不到自定義消息
 */
public class JPushReceiver extends BroadcastReceiver {
    private static final String TAG = "JIGUANG-Example";

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Bundle bundle = intent.getExtras();
            if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
                //極光伺服器配置設定的Registration Id,
                String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
                //自定義消息

            } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
                //推送通知

            } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
                //當使用者點選通知時的操作,打開自定義的Activity
                Intent i = new Intent(context, TestActivity.class);
                i.putExtras(bundle);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(i);
            } 
        } catch (Exception e) {

        }
    }
}  
           

然後在 AndroidManifest.xml 檔案中聲明JPushReceiver

<receiver
             android:name=".JPushReceiver"
             android:enabled="true">
             <intent-filter>
                 <!--Required 使用者注冊SDK的intent-->
                 <action android:name="cn.jpush.android.intent.REGISTRATION" />
                 <!--Required 使用者接收SDK消息的intent-->
                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
                 <!--Required 使用者接收SDK通知欄資訊的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
                 <!--Required 使用者打開自定義通知欄的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
                 <!-- 接收網絡變化 連接配接/斷開 since 1.6.3 -->
                 <action android:name="cn.jpush.android.intent.CONNECTION" />
                 <category android:name="您應用的包名" />
             </intent-filter>
         </receiver>
           

到這裡關于極光推送的內建就已經完成了,可以在極光推送背景發生條推送測試一下了。

繼續閱讀