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_maven
Demo工程
1. 建立個推應用
- 請登入 http://dev.getui.com ,選擇
登記應用
並填寫應用名稱和包名資訊,完成應用建立:
- 點選
應用配置
,獲取到相應的AppID
、AppKey
、AppSecret
2. 開啟專案工程
- 啟動Android Studio, 開啟您之前建立的Android專案工程:
- 如果需要從原有的Eclipse專案匯入,請選擇
Import project (Eclipse ADT, Gradle, etc.)
:
3. 添加個推SDK及相關配置
老版本升級到 2.9.5.0 及以上版本注意事項:
- 替換舊的
GetuiSDKxxx.jar
,並刪除GetuiExt-xxx.jar
和所有jni相關目錄下的libgetuiext.so
- 刪除
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
- 刪除
app/src/main/res/layout
目錄下原來舊的佈局檔案,包括getui_notification.xml
、notification_inc.xml
和increment_popup_dialog.xml
,請使用最新SDK所提供的getui_notification.xml
即可 - 請參考本文件重新進行配置整合
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庫地址,如下所示:
//Maven URL地址
maven {
url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
複製
3.3 配置依賴
- 在
app/build.gradle
檔案中引用個推SDK依賴庫,如下圖所示:
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支援armeabi
、armeabi-v7a
、arm64-v8a
、mips
、mips64
、x86
、x86_64
這幾種 CPU 架構,請根據專案情況指定所需的架構。
如果專案中包含的其他 so 庫只支援其中某幾種 cpu 架構,那麼應該根據其他 so 庫所支援的 CPU 架構的最小集來配置。否則如果在特定架構上未能支援所有 so 庫,則很可能導致程式執行異常。切記!
- 在專案根目錄下的
gradle.properties
檔案中配置useDeprecatedNdk
引數,如下圖所示:
android.useDeprecatedNdk=true
複製
- 在
app/build.gradle
檔案中的android.defaultConfig
下指定所需的 CPU 架構,如下圖所示:
android {
...
defaultConfig {
...
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86_64"
}
}
}
複製
3.5 配置個推應用引數
- 在
app/build.gradle
檔案中的android.defaultConfig
下新增manifestPlaceholders
,配置個推相關的應用引數(參見【步驟1】),如下圖所示:
manifestPlaceholders = [
GETUI_APP_ID : "APP_ID",
GETUI_APP_KEY : "APP_KEY",
GETUI_APP_SECRET : "APP_SECRET"
]
複製
- 請根據【步驟1】獲取到的應用引數進行相應替換
APP_ID
、APP_KEY
、APP_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.png
和push_small.png
圖片,如圖所示:
- 建議的
push.png
圖片尺寸如下:
ldpi: 48*48
mdpi: 64*64
hdpi: 96*96
xhdpi: 128*128
xxhdpi: 192*192
複製
- 該圖示
push.png
將會作為通知圖示,如下所示:
- 建議的
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
設計規範請參考狀態列圖示設計規範
3.9 資源精簡配置
- 如果您的工程啟用了資源精簡,即如果在
app/build.gradle
的android.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
的方式,需要您在andResGuard
的whiteList
節點下新增如下程式碼:
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方式相容性說明:
- 如果呼叫了registerPushIntentService方法註冊自定義IntentService,則SDK僅通過IntentService回撥推送服務事件;
- 如果未呼叫registerPushIntentService方法進行註冊,則原有的廣播接收器仍然可以繼續使用。
5. 測試
- 連線手機或啟動Android模擬器,編譯執行你的工程,檢視logcat資訊。在搜尋框中輸入
clientid
,如果能顯示clientid is xxx
日誌,則說明個推SDK已經成功執行起來了:
- 登入 個推開發者平臺,進入【個推·訊息推送】產品,點選【建立推送】,進入待測試應用的推送通知介面:
依次填寫
通知標題
和通知內容
,點選傳送
按鈕即可向該推送應用名下所有CID推送通知訊息。具體推送操作方法詳見:建立推送通知如果手機或模擬器收到訊息,顯示下圖所示通知,那麼恭喜您,個推SDK接入測試已經成功完成!