1. 程式人生 > >Android 訊息推送:個推

Android 訊息推送:個推

之前一直在使用極光推送,這次專案打算使用個推試試!

整合失敗原因:

1、檢查自己的APPID等資訊

2、檢查自己的.jar和.so檔案

3、檢查AndroidManifest.xml

<!-- 自定義許可權 自定義許可權解釋:部分手機型號不能正常執行個推SDK,需新增自定義許可權進行配置。-->
<uses-permission android:name="getui.permission.GetuiService.${applicationId}" />
<permission
android:name="getui.permission.GetuiService.${applicationId}"
android:protectionLevel="normal" > </permission>

關於Android Studio

Android Studio是Google力推的Android開發環境,在IntelliJ IDEA基礎上進行了大量功能完善和優化,包括:

  • 基於Gradle的構建支援
  • Android 專屬的重構工具和Instant Run快速修復技術
  • 功能強大的佈局編輯器,可以讓你拖拉 UI 控制元件並進行效果預覽
  • 全新的 Android 模擬器大約比之前的模擬器快 3 倍,同時由於 ADB 的增強,傳輸應用和資料到模擬器上的速度比到物理裝置上快 10 倍。
  • 提供效能分析工具以捕獲效能、可用性、版本相容性等問題

因此我們強烈推薦Android開發者將現有專案遷移到Android Studio環境,並在Android Studio下更快地實現個推SDK的整合工作。

前言

  • 本文件介紹Android Studio提供的基於Maven的快速整合方案,配置簡單、不容易出問題、後續更新維護方便,因此我們強烈推薦應用開發者根據本文件步驟進行個推整合。
  • 本文件適用SDK版本:2.9.5.0及以後
  • 請參考Getui_SDK_Demo_AS_mavenDemo工程

1. 建立個推應用

  • 請登入 http://dev.getui.com ,選擇登記應用並填寫應用名稱和包名資訊,完成應用建立:

img_as_create

img_as_create

  • 點選應用配置,獲取到相應的AppIDAppKeyAppSecret
    資訊:

img_as_create

2. 開啟專案工程

  • 啟動Android Studio, 開啟您之前建立的Android專案工程:

img_as_open

  • 如果需要從原有的Eclipse專案匯入,請選擇Import project (Eclipse ADT, Gradle, etc.)

img_as_import

3. 添加個推SDK及相關配置


老版本升級到 2.9.5.0 及以上版本注意事項: 

  1. 替換舊的GetuiSDKxxx.jar,並刪除GetuiExt-xxx.jar和所有jni相關目錄下的libgetuiext.so
  2. 刪除AndroidManifest.xml中以下元件相關的配置,最新的SDK已經不再需要這些元件:

    com.igexin.sdk.PushServiceUser

    com.igexin.sdk.PushManagerReceiver

    com.igexin.getuiext.activity.GetuiExtActivity

    com.igexin.getuiext.service.PayloadReceiver

    com.igexin.getuiext.service.GetuiExtService
  3. 刪除app/src/main/res/layout目錄下原來舊的佈局檔案,包括getui_notification.xmlnotification_inc.xmlincrement_popup_dialog.xml,請使用最新SDK所提供的getui_notification.xml即可
  4. 請參考本文件重新進行配置整合

3.1 個推Android SDK資料包結構

GETUI_ANDROID_SDK/
  |- readme.txt (SDK資料包說明)
  |- 接入文件/ (Android SDK相關整合文件PDF版本)
  |- 資原始檔/
  ||- res/
  |||- layout/
  ||||- getui_notification.xml (個推SDK所需的佈局檔案)
  |||- raw
  ||||- keep.xml (用於資源保留的描述檔案)
  ||- so/ (各 CPU 架構so庫)
  |||- arm64-v8a/
  |||- armeabi/
  |||- armeabi-v7a/
  |||- mips/
  |||- mips64/
  |||- x86/
  |||- x86_64/
  ||- GetuiSDK2.11.1.0.jar
  ||- android-support-v4.jar
  | - Demo工程/
  ||- Getui_SDK_Demo_AS_maven/ (AndroidStudio快速整合Demo工程)
  ||- Getui_SDK_Demo_AS_official/ (AndroidStudio標準整合Demo工程)
  ||- Getui_SDK_Demo_Eclipse_official/ (Eclipse整合Demo工程)
複製

3.2 新增Maven庫地址

儘管我們會將最新的個推SDK同步部署在JCenter上,但是為了保障穩定使用,我們建議開發者額外配置個推提供的maven庫從而實現更快速的訪問。

  • 在以專案名為命名的頂層build.gradle檔案中,添加個推maven庫地址,如下所示:

img_asmv_maven

//Maven URL地址
maven {
    url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
複製

3.3 配置依賴

  • app/build.gradle檔案中引用個推SDK依賴庫,如下圖所示:

img_asmv_dep

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.getui:sdk:2.11.1.0'
    compile 'com.android.support:support-v4:+'
}
複製

3.4 配置 so 庫

目前個推SDK支援armeabiarmeabi-v7aarm64-v8amipsmips64x86x86_64這幾種 CPU 架構,請根據專案情況指定所需的架構。


如果專案中包含的其他 so 庫只支援其中某幾種 cpu 架構,那麼應該根據其他 so 庫所支援的 CPU 架構的最小集來配置。否則如果在特定架構上未能支援所有 so 庫,則很可能導致程式執行異常。切記!

  • 在專案根目錄下的gradle.properties檔案中配置useDeprecatedNdk引數,如下圖所示:

img_asmv_sop

android.useDeprecatedNdk=true
複製
  • app/build.gradle檔案中的android.defaultConfig下指定所需的 CPU 架構,如下圖所示:

img_asmv_son

android {
  ...
  defaultConfig {
    ...
    ndk {
      abiFilters "armeabi", "armeabi-v7a", "x86_64"
    }
  }
}
複製

3.5 配置個推應用引數

  • app/build.gradle檔案中的android.defaultConfig下新增manifestPlaceholders,配置個推相關的應用引數(參見【步驟1】),如下圖所示:

img_asmv_param

manifestPlaceholders = [
    GETUI_APP_ID : "APP_ID",
    GETUI_APP_KEY : "APP_KEY",
    GETUI_APP_SECRET : "APP_SECRET"
]
複製
  • 請根據【步驟1】獲取到的應用引數進行相應替換APP_IDAPP_KEYAPP_SECRET的值

3.6 配置自定義推送服務

為了讓推送服務在部分主流機型上更穩定執行,從2.9.5.0版本開始,個推支援第三方應用配置使用自定義Service來作為推送服務執行的載體。

  • 在專案原始碼中新增一個繼承自Android.app.Service的類,參考下列程式碼實現Service各個生命週期回撥方法:
package com.getui.demo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import com.igexin.sdk.GTServiceManager;

public class DemoPushService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        GTServiceManager.getInstance().onCreate(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return GTServiceManager.getInstance().onStartCommand(this, intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return GTServiceManager.getInstance().onBind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        GTServiceManager.getInstance().onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        GTServiceManager.getInstance().onLowMemory();
    }
}
複製
  • 在AndroidManifest.xml中新增上述自定義Service:
<service
  android:name="com.getui.demo.DemoPushService"
  android:exported="true"
  android:label="PushService"
  android:process=":pushservice">
</service>
複製

3.7 配置可選許可權

  • 上述接入方式已包含個推服務所需的所有必備許可權。在此之外,您還可以配置以下可選許可權,以便使用個推3.0提供的電子圍欄功能。請在AndroidManifest.xml<manifest>根標籤下新增如下配置:
<!-- iBeancon功能所需許可權 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 個推3.0電子圍欄功能所需許可權 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
複製

3.8 匯入通知欄圖示

  • 為了修改預設的通知圖示以及通知欄頂部提示小圖示,請在資源目錄的res/drawable-ldpi/res/drawable-mdpi/res/drawable-hdpi/res/drawable-xhdpi/res/drawable-xxhdpi/等各解析度目錄下,放置相應尺寸的檔名為push.pngpush_small.png圖片,如圖所示:

  • 建議的push.png圖片尺寸如下:
ldpi:    48*48
mdpi:    64*64
hdpi:    96*96
xhdpi:   128*128
xxhdpi:  192*192
複製
  • 該圖示push.png將會作為通知圖示,如下所示:

img_asmv_pushicon

  • 建議的push_small.png圖片尺寸如下:
ldpi:    18*18
mdpi:    24*24
hdpi:    36*36
xhdpi:   48*48
xxhdpi:  72*72
xxxhdp:  96*96
複製
  • 該圖示push_small.png將會作為通知圖示展示在通知欄頂部,如下所示:
  • push_small.png設計規範請參考狀態列圖示設計規範

img_asmv_small_icon

3.9 資源精簡配置

  • 如果您的工程啟用了資源精簡,即如果在app/build.gradleandroid.buildTypes.release下配置了shrinkResources true,為了避免個推SDK所需資源被錯誤精簡導致功能異常,需要在專案資源目錄res/raw中新增keep.xml檔案,路徑如下:

  • 在SDK資料包中GETUI_ANDROID_SDK/資原始檔/raw目錄下有keep.xml示例檔案,完整內容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/getui_notification,
    @drawable/push,
    @drawable/push_small"/>
    <!-- 若您需要使用其他自定義推送圖示,也需要在此處新增 -->
複製
  • 如果你的專案工程已經使用了keep.xml,則只需在tools:keep中增加對@layout/getui_notification的宣告,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/other_res,...,
    @layout/getui_notification,
    @drawable/push,
    @drawable/push_small"/>
   <!-- 若您需要使用其他自定義推送圖示,也需要在此處新增 -->
複製
  • 如果您的工程使用了AndResGuard進行資源精簡,為了避免個推SDK所需資源被錯誤精簡導致功能異常,需要為個推新增白名單配置。

gradle整合AndResGuard的方式,需要您在andResGuardwhiteList節點下新增如下程式碼:

andResGuard {
    ...
    whiteList = [
           ...
           // for getui
           "R.drawable.push",        
           "R.drawable.push_small",
           "R.layout.getui_notification",
           "R.id.getui_*"
           // 若您需要使用其他自定義推送圖示,也需要在此處新增
    ]
    ...
}
複製

命令列使用AndResGuard的方式,需要您在config.xml檔案中的<issue id=whitelist>節點下新增如下程式碼

<issue id="whitelist" isactive="true">
    <path value="<your_package_name>.R.drawable.push"/>
    <path value="<your_package_name>.R.drawable.push_small"/>
    <path value="<your_package_name>.R.layout.getui_notification"/>
    <path value="<your_package_name>.R.id.getui_*"/>
    <!-- 若您需要使用其他自定義推送圖示,也需要在此處新增 -->
</issue>
複製

4. 編寫整合程式碼

4.1 初始化SDK

我們建議應用開發者在Activity或Service類中呼叫個推SDK的初始化方法,確保SDK在各種情況下都能正常執行。一般情況下可以在主Activity的onCreate()或者onResume()方法中呼叫,也可以在多個主要介面Activity的onCreate()或onResume()方法中呼叫。反覆呼叫SDK初始化並不會有什麼副作用。

  • 在應用的 Activity 裡匯入PushManager類,如下所示:
import com.igexin.sdk.PushManager;
複製
  • 然後在 Activity 的onCreate()或者onResume()方法中呼叫個推SDK初始化方法。如果使用了自定義推送服務,初始化方法還需要傳入新的自定義推送服務名:
// com.getui.demo.DemoPushService 為第三方自定義推送服務
PushManager.getInstance().initialize(this.getApplicationContext(), com.getui.demo.DemoPushService.class);
複製

4.2 接收推送服務事件


從2.9.5.0版本開始,為了解決小概率發生的Android廣播丟失問題,我們推薦應用開發者使用新的IntentService方式來接收推送服務事件(包括CID獲取通知、透傳訊息通知等)

  • 在專案原始碼中新增一個繼承自com.igexin.sdk.GTIntentService的類,用於接收CID、透傳訊息以及其他推送服務事件。請參考下列程式碼實現各個事件回撥方法:
package com.getui.demo;

import android.content.Context;
import android.os.Message;
import android.util.Log;

import com.igexin.sdk.GTIntentService;
import com.igexin.sdk.PushConsts;
import com.igexin.sdk.PushManager;
import com.igexin.sdk.message.FeedbackCmdMessage;
import com.igexin.sdk.message.GTCmdMessage;
import com.igexin.sdk.message.GTTransmitMessage;
import com.igexin.sdk.message.SetTagCmdMessage;

/**
 * 繼承 GTIntentService 接收來自個推的訊息, 所有訊息線上程中回撥, 如果註冊了該服務, 則務必要在 AndroidManifest中宣告, 否則無法接受訊息<br>
 * onReceiveMessageData 處理透傳訊息<br>
 * onReceiveClientId 接收 cid <br>
 * onReceiveOnlineState cid 離線上線通知 <br>
 * onReceiveCommandResult 各種事件處理回執 <br>
 */
public class DemoIntentService extends GTIntentService {

    public DemoIntentService() {

    }

    @Override
    public void onReceiveServicePid(Context context, int pid) {
    }

    @Override
    public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
    }

    @Override
    public void onReceiveClientId(Context context, String clientid) {
        Log.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);
    }

    @Override
    public void onReceiveOnlineState(Context context, boolean online) {
    }

    @Override
    public void onReceiveCommandResult(Context context, GTCmdMessage cmdMessage) {
    }
}
複製
  • AndroidManifest.xml中配置上述 IntentService 類:
<service android:name="com.getui.demo.DemoIntentService"/>
複製
  • 在個推SDK初始化後,註冊上述 IntentService 類:
// com.getui.demo.DemoIntentService 為第三方自定義的推送服務事件接收類
PushManager.getInstance().registerPushIntentService(this.getApplicationContext(), com.getui.demo.DemoIntentService.class);
複製


關於原有廣播方式和新的IntentService方式相容性說明:

  1. 如果呼叫了registerPushIntentService方法註冊自定義IntentService,則SDK僅通過IntentService回撥推送服務事件;
  2. 如果未呼叫registerPushIntentService方法進行註冊,則原有的廣播接收器仍然可以繼續使用。

5. 測試

  • 連線手機或啟動Android模擬器,編譯執行你的工程,檢視logcat資訊。在搜尋框中輸入clientid,如果能顯示clientid is xxx日誌,則說明個推SDK已經成功執行起來了:

img_as_logcat

  • 登入 個推開發者平臺,進入【個推·訊息推送】產品,點選【建立推送】,進入待測試應用的推送通知介面:

img_as_conlose

  • 依次填寫通知標題通知內容,點選傳送按鈕即可向該推送應用名下所有CID推送通知訊息。具體推送操作方法詳見:建立推送通知

  • 如果手機或模擬器收到訊息,顯示下圖所示通知,那麼恭喜您,個推SDK接入測試已經成功完成!

img_as_success