自己使用过的推送服务:极光推送(Jpush)、友盟推送、个推、阿里推送,其他的目前还没用用过,但使用起来应该都是比较类似的吧!
本文将简单介绍下这次个推推送的接入流程,及相关的注意事项(个推开通厂商通道需要单独联系客服,开通VIP,然后个推的技术就会和你对接)。
1.配置 Maven 库地址:
项目根目录下build.gradle
buildscript {
repositories {
jcenter()
google()
}
dependencies {
......
}
}
allprojects {
repositories {
jcenter()
google()
maven {
url "http://mvn.gt.getui.com/nexus/content/repositories/releases/"
}
}
}
2.NDK过滤:
app根目录下build.gradle
android {
defaultConfig {
ndk {
// 添加项目所需 CPU 类型的最小集
abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
}
}
}
3.参数配置:
app根目录下build.gradle
android {
defaultConfig {
manifestPlaceholders = [
//个推应用参数,请填写您申请的 GETUI_APP_ID,GETUI_APP_KEY,GETUI_APP_SECRET 值
GETUI_APP_ID : "",
GETUI_APP_KEY : "",
GETUI_APP_SECRET: "",
GETUI_APPID : "",
//厂商参数配置,在各个厂商开放平台认证、申请推送引用,查看对应的配置信息,开通推送服务
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.添加依赖:
// 个推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.权限添加:
涉及到过敏权限的需要添加动态权限申请,在这里推荐下郭林的PermissionX:https://blog.csdn.net/guolin_blog/article/details/107427463
6.配置推送服务(个人理解:该服务是用于创建对应的服务进程):
1.自定义Service集成自PushService :
package 你的包名.service;
// 仅 2.13.1.0 及以上版本才能直接 extends PushService,低于此版本请延用之前实现方式
public class YouPushService extends com.igexin.sdk.PushService {
}
2.在 AndroidManifest.xml 中添加上述自定义 Service,(使用 maven 集成,android:process 属性必须为 pushservice。手动集成方式也请保证与其他组件进程名一致,建议复制本文档的默认配置即可),如下:
7.配置接受推送事件服务(该服务使用于接受推送事件的):
1.添加一个继承自 com.igexin.sdk.GTIntentService 的类,用于接收 CID、透传消息以及其他推送服务事件。请参考下列代码实现各个事件回调方法:
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 接收来自个推的消息,所有消息在线程中回调,如果注册了该服务,则务必要在 AndroidManifest 中声明,否则无法接受消息
* Created by kele on 2020/9/21.
* E-mail:[email protected]
*/
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);
}
// 处理透传消息
@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();
// 第三方回执调用接口,actionid范围为90000-90999,可根据业务场景执行
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);
}
// 各种事件处理回执
@Override
public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
LogUtils.d(TAG, "gtCmdMessage=" + gtCmdMessage.toString());
}
// 通知到达,只有个推通道下发的通知会回调此方法
@Override
public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageArrived=" + gtNotificationMessage.getContent().toString());
}
// 通知点击,只有个推通道下发的通知会回调此方法
@Override
public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d(TAG, "onNotificationMessageClicked=" + gtNotificationMessage.getContent().toString());
}
}
2.在 AndroidManifest.xml 中配置上述 IntentService 类,如下:
8.设置通知图标:
1.图标位置:
|- app/
| |- src/
| |- main/
| |- res/
| |- drawable-xhdpi
| |- push.png
| |- push_small.png
| |- drawable-xxhdpi
| |- push.png
| |- push_small.png
push_small.png 会展示在顶部状态栏和通知左上角位置,push_small 只能内置, 不能修改。push.png 将会作为通知展示图标,请务必确认您放置的图标内容无误。
2.建议尺寸:
//push.png 图片尺寸
xhdpi: 128*128
xxhdpi: 192*192
//push_small.png 图片尺寸
xhdpi: 48*48
xxhdpi: 72*72
另外,push_small.png 设计规范有以下四个注意要点:1. 必须是带 Alpha 透明通道的 PNG 图片。 2.背景必须是透明的。 3.图形必须是白色。 4. 周围不宜留过多的 padding。
9.添加混淆配置:
如果您的工程启用了 Proguard 混淆,即如果在app/build.gradle的android.buildTypes.release下配置了minifyEnabled true,为了避免个推 SDK 被错误混淆导致功能异常,需要在app/proguard-rules.pro混淆配置文件中添加如下配置:
#个推
-dontwarn com.igexin.**
-keep class com.igexin.** { *; }
10.资源精简配置:
如果您的工程启用了资源精简,即如果在 app/build.gradle 的 android.buildTypes.release 下配置了 shrinkResources true,为了避免个推 SDK 所需资源被错误精简导致功能异常,需要在项目资源目录 res/raw 中添加 keep.xml 文件,并在 keep.xml 文件中使用 tools:keep 定义哪些资源需要被保留(资源之间用“,”隔开),如 tools:keep="@drawable/push,@drawable/push_small,...,",此处 @drawable/push、@drawable/push_small 通知图标的名称应为您当前放着于应用中的图标名称,如下:
11.初始化:
1.代码初始化:
//分别在Application和Main中初始化一次
PushManager.getInstance().initialize(this);
2.开启日志:
if (BaseConfig.Log.isDebug) {
//切勿在 release 版本上开启调试日志
PushManager.getInstance().setDebugLogger(this, new IUserLoggerInterface() {
@Override
public void log(String s) {
LogUtils.i("PUSH_LOG", s);
}
});
}
12.校验初始化:
1.过滤个推日志:GT-PUSH,如果看到 Login successed with cid = xxx 日志输出,则说明 SDK 初始化成功。
2.在个推后台进行消息推送,验证集成情况。
13.关于厂商通道:
经过上面的步骤,推送基本接入完成,开通了厂商通道的有需要设置回调地址的按照个推技术给你的文档在各平台填写对应的回调地址,以及给个推你们的回调地址即可。
华为通道:
1.需要在华为后台中 我的项目-应用 下载 agconnect-services.json文件,放app根目录下;
2.在app的buil.gradle中添加如下代码:
// 在配置华为agconnect-services.json后将下面注释打开
apply plugin: 'com.huawei.agconnect'
参考文档:
个推官方文档 http://docs.getui.com/getui/mobile/android/androidstudio/