自己使用過(guò)的推送服務(wù):極光推送(Jpush)、友盟推送、個(gè)推、阿里推送,其他的目前還沒(méi)用用過(guò),但使用起來(lái)應(yīng)該都是比較類(lèi)似的吧!
本文將簡(jiǎn)單介紹下這次個(gè)推推送的接入流程,及相關(guān)的注意事項(xiàng)(個(gè)推開(kāi)通廠商通道需要單獨(dú)聯(lián)系客服,開(kāi)通VIP,然后個(gè)推的技術(shù)就會(huì)和你對(duì)接)。
1.配置 Maven 庫(kù)地址:
項(xiàng)目根目錄下build.gradle
buildscript {
repositories {
jcenter()
google()
}
dependencies {
......
}
}
allprojects {
repositories {
jcenter()
google()
maven {
url "http://mvn.gt.getui.com/nexus/content/repositories/releases/"
}
}
}
2.NDK過(guò)濾:
app根目錄下build.gradle
android {
defaultConfig {
ndk {
// 添加項(xiàng)目所需 CPU 類(lèi)型的最小集
abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
}
}
}
3.參數(shù)配置:
app根目錄下build.gradle
android {
defaultConfig {
manifestPlaceholders = [
//個(gè)推應(yīng)用參數(shù),請(qǐng)?zhí)顚?xiě)您申請(qǐng)的 GETUI_APP_ID,GETUI_APP_KEY,GETUI_APP_SECRET 值
GETUI_APP_ID : "",
GETUI_APP_KEY : "",
GETUI_APP_SECRET: "",
GETUI_APPID : "",
//廠商參數(shù)配置,在各個(gè)廠商開(kāi)放平臺(tái)認(rèn)證、申請(qǐng)推送引用,查看對(duì)應(yīng)的配置信息,開(kāi)通推送服務(wù)
XIAOMI_APP_ID : "",
XIAOMI_APP_KEY : "",
MEIZU_APP_ID : "",
MEIZU_APP_KEY : "",
HUAWEI_APP_ID : "",
OPPO_APP_KEY : "",
OPPO_APP_SECRET : "",
VIVO_APP_ID : "",
VIVO_APP_KEY : "",
]
}
}
4.添加依賴(lài):
// 個(gè)推SDK 3.0 的主包
implementation 'com.getui:gtsdk:3.0.2.0'
//支持的廠商包
implementation 'com.huawei.hms:push:4.0.2.300'
implementation 'com.getui.opt:hwp:3.0.1'
implementation 'com.getui.opt:xmp:3.0.1'
implementation 'com.getui.opt:mzp:3.0.1'
implementation 'com.assist-v3:vivo:3.0.1'
implementation 'com.assist-v3:oppo:3.0.1'
5.權(quán)限添加:
涉及到過(guò)敏權(quán)限的需要添加動(dòng)態(tài)權(quán)限申請(qǐng),在這里推薦下郭林的PermissionX:https://blog.csdn.net/guolin_blog/article/details/107427463
<!-- iBeancon 功能所需權(quán)限 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 個(gè)推電子圍欄功能所需權(quán)限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
6.配置推送服務(wù)(個(gè)人理解:該服務(wù)是用于創(chuàng)建對(duì)應(yīng)的服務(wù)進(jìn)程):
1.自定義Service集成自PushService :
package 你的包名.service;
// 僅 2.13.1.0 及以上版本才能直接 extends PushService,低于此版本請(qǐng)延用之前實(shí)現(xiàn)方式
public class YouPushService extends com.igexin.sdk.PushService {
}
2.在 AndroidManifest.xml 中添加上述自定義 Service,(使用 maven 集成,android:process 屬性必須為 pushservice。手動(dòng)集成方式也請(qǐng)保證與其他組件進(jìn)程名一致,建議復(fù)制本文檔的默認(rèn)配置即可),如下:
<!-- 請(qǐng)根據(jù)您當(dāng)前自定義的 PushService 名稱(chēng)路徑進(jìn)行配置-->
<service
android:name="你的包名.YouPushService"
android:exported="true"
android:label="PushService"
android:process=":pushservice"/>
7.配置接受推送事件服務(wù)(該服務(wù)使用于接受推送事件的):
1.添加一個(gè)繼承自 com.igexin.sdk.GTIntentService 的類(lèi),用于接收 CID、透?jìng)飨⒁约捌渌扑头?wù)事件。請(qǐng)參考下列代碼實(shí)現(xiàn)各個(gè)事件回調(diào)方法:
package 你的包名.service;
import android.content.Context;
import android.os.Message;
import com.blankj.utilcode.util.LogUtils;
import com.igexin.sdk.PushManager;
import com.igexin.sdk.message.GTCmdMessage;
import com.igexin.sdk.message.GTNotificationMessage;
import com.igexin.sdk.message.GTTransmitMessage;
/**
* Des: 繼承 GTIntentService 接收來(lái)自個(gè)推的消息,所有消息在線程中回調(diào),如果注冊(cè)了該服務(wù),則務(wù)必要在 AndroidManifest 中聲明,否則無(wú)法接受消息
* Created by kele on 2020/9/21.
* E-mail:984127585@qq.com
*/
public class GTIntentService extends com.igexin.sdk.GTIntentService {
private static final String TAG = GTIntentService.class.getSimpleName();
@Override
public void onReceiveServicePid(Context context, int i) {
}
// 接收 cid
@Override
public void onReceiveClientId(Context context, String s) {
LogUtils.d(TAG, "onReceiveClientId=" + s);
}
// 處理透?jìng)飨? @Override
public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
String appid = msg.getAppid();
String taskid = msg.getTaskId();
String messageid = msg.getMessageId();
byte[] payload = msg.getPayload();
String pkg = msg.getPkgName();
String cid = msg.getClientId();
// 第三方回執(zhí)調(diào)用接口,actionid范圍為90000-90999,可根據(jù)業(yè)務(wù)場(chǎng)景執(zhí)行
boolean result = PushManager.getInstance().sendFeedbackMessage(context, taskid, messageid, 90001);
LogUtils.d(TAG, "call sendFeedbackMessage = " + (result ? "success" : "failed"));
LogUtils.d(TAG, "onReceiveMessageData -> " + "appid = " + appid + "\ntaskid = " + taskid + "\nmessageid = " + messageid + "\npkg = " + pkg
+ "\ncid = " + cid);
if (payload == null) {
LogUtils.e(TAG, "receiver payload = null");
} else {
String data = new String(payload);
LogUtils.d(TAG, "receiver payload = " + data);
}
}
// cid 離線上線通知
@Override
public void onReceiveOnlineState(Context context, boolean b) {
LogUtils.d(TAG, "onReceiveOnlineState=" + b);
}
// 各種事件處理回執(zhí)
@Override
public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
LogUtils.d(TAG, "gtCmdMessage=" + gtCmdMessage.toString());
}
// 通知到達(dá),只有個(gè)推通道下發(fā)的通知會(huì)回調(diào)此方法
@Override
public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageArrived=" + gtNotificationMessage.getContent().toString());
}
// 通知點(diǎn)擊,只有個(gè)推通道下發(fā)的通知會(huì)回調(diào)此方法
@Override
public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageClicked=" + gtNotificationMessage.getContent().toString());
}
}
2.在 AndroidManifest.xml 中配置上述 IntentService 類(lèi),如下:
<service
android:name="你的包名.GTIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
8.設(shè)置通知圖標(biāo):
1.圖標(biāo)位置:
|- app/
| |- src/
| |- main/
| |- res/
| |- drawable-xhdpi
| |- push.png
| |- push_small.png
| |- drawable-xxhdpi
| |- push.png
| |- push_small.png
push_small.png 會(huì)展示在頂部狀態(tài)欄和通知左上角位置,push_small 只能內(nèi)置, 不能修改。push.png 將會(huì)作為通知展示圖標(biāo),請(qǐng)務(wù)必確認(rèn)您放置的圖標(biāo)內(nèi)容無(wú)誤。
2.建議尺寸:
//push.png 圖片尺寸
xhdpi: 128*128
xxhdpi: 192*192
//push_small.png 圖片尺寸
xhdpi: 48*48
xxhdpi: 72*72
另外,push_small.png 設(shè)計(jì)規(guī)范有以下四個(gè)注意要點(diǎn):1. 必須是帶 Alpha 透明通道的 PNG 圖片。 2.背景必須是透明的。 3.圖形必須是白色。 4. 周?chē)灰肆暨^(guò)多的 padding。
9.添加混淆配置:
如果您的工程啟用了 Proguard 混淆,即如果在app/build.gradle的android.buildTypes.release下配置了minifyEnabled true,為了避免個(gè)推 SDK 被錯(cuò)誤混淆導(dǎo)致功能異常,需要在app/proguard-rules.pro混淆配置文件中添加如下配置:
#個(gè)推
-dontwarn com.igexin.**
-keep class com.igexin.** { *; }
10.資源精簡(jiǎn)配置:
如果您的工程啟用了資源精簡(jiǎn),即如果在 app/build.gradle 的 android.buildTypes.release 下配置了 shrinkResources true,為了避免個(gè)推 SDK 所需資源被錯(cuò)誤精簡(jiǎn)導(dǎo)致功能異常,需要在項(xiàng)目資源目錄 res/raw 中添加 keep.xml 文件,并在 keep.xml 文件中使用 tools:keep 定義哪些資源需要被保留(資源之間用“,”隔開(kāi)),如 tools:keep="@drawable/push,@drawable/push_small,...,",此處 @drawable/push、@drawable/push_small 通知圖標(biāo)的名稱(chēng)應(yīng)為您當(dāng)前放著于應(yīng)用中的圖標(biāo)名稱(chēng),如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/push,@drawable/push_small" />
11.初始化:
1.代碼初始化:
//分別在Application和Main中初始化一次
PushManager.getInstance().initialize(this);
2.開(kāi)啟日志:
if (BaseConfig.Log.isDebug) {
//切勿在 release 版本上開(kāi)啟調(diào)試日志
PushManager.getInstance().setDebugLogger(this, new IUserLoggerInterface() {
@Override
public void log(String s) {
LogUtils.i("PUSH_LOG", s);
}
});
}
12.校驗(yàn)初始化:
1.過(guò)濾個(gè)推日志:GT-PUSH,如果看到 Login successed with cid = xxx 日志輸出,則說(shuō)明 SDK 初始化成功。
2.在個(gè)推后臺(tái)進(jìn)行消息推送,驗(yàn)證集成情況。
13.關(guān)于廠商通道:
經(jīng)過(guò)上面的步驟,推送基本接入完成,開(kāi)通了廠商通道的有需要設(shè)置回調(diào)地址的按照個(gè)推技術(shù)給你的文檔在各平臺(tái)填寫(xiě)對(duì)應(yīng)的回調(diào)地址,以及給個(gè)推你們的回調(diào)地址即可。
華為通道:
1.需要在華為后臺(tái)中 我的項(xiàng)目-應(yīng)用 下載 agconnect-services.json文件,放app根目錄下;
2.在app的buil.gradle中添加如下代碼:
// 在配置華為agconnect-services.json后將下面注釋打開(kāi)
apply plugin: 'com.huawei.agconnect'

參考文檔:
個(gè)推官方文檔 http://docs.getui.com/getui/mobile/android/androidstudio/