Android 推送服务之个推
一:介绍
个推是商用级的移动应用消息推送云服务供应商
1.消息类型
个推消息推送支持通知和透传两种形式。同时支持大图、大文本等富媒体展示,支持启动应用、打开第三方链接、打开应用内特定页面等后续操作等后续操作。
通知:
指定通知标题和内容后,由个推SDK自动处理后、在系统通知栏中以通知栏消息的形式展示,同时响铃或震动提醒用户(响铃和震动受手机系统的设置状态影响)。
透传:
即自定义消息,消息体格式客户可以自己定义,如纯文本、json串等。透传消息个推只传递数据,不做任何处理,客户端接收到透传消息后需要自己去做后续动作处理,如通知栏展示、弹框等。
2.推送目标
个推支持通过标签(Tag)、别名(Alias)、CID(ClientID,个推SDK的唯一标识)、用户分组四种方式来管理目标用户设置,开发者可根据自身业务需求灵活使用。
我们需要维护这个ClientID
二:个推官网注册App
获取到AppID AppKey等
具体请参考开发文档https://docs.getui.com/getui/...
三:个推集成
第一步:Maven集成(过去是lib库libgetuiext2.so集成,SDK 最新 so 为 libgetuiext3.so,由于仅支持Maven方式集成,故老版本升级时请删除原先jniLibs目录中所有的 libgetuiext2.so、libgetuiext.so;)
在项目根目录 build.gradle 文件的 allprojects.repositories 块中,添加个推 maven 库地址 maven { url "https://mvn.getui.com/nexus/content/repositories/releases/"}
allprojects {
repositories {
google()
jcenter()
maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/" }
}
}
第二步:配置依赖
android{
defaultConfig{
//个推
//我这里使用的是2.14.1.0版本,从3.1.2.0版本开始,APPID 占位符从 GETUI_APP_ID 切换为 GETUI_APPID
//后续所有产品的 APPID 均统一配置为 GETUI_APPID 占位符
manifestPlaceholders = [
GETUI_APP_ID : "o3b2zj****************",
GETUI_APP_KEY : "WefOi****************",
GETUI_APP_SECRET : "iodl****************",
GS_APPID : "o3b2****************",
////渠道若为纯数字则不能超过 int 表示的范围。
GT_INSTALL_CHANNEL: "atest"
]
ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'arm64-v8a','armeabi', 'armeabi-v7a', 'x86_64','x86'
}
}
}
dependencies {
//个推
api rootProject.ext.dependencies["getui"]//等价于api'com.getui:gtsdk:2.14.1.0'
//个推统计
api rootProject.ext.dependencies["getuigs"]//api'com.getui:gssdk:2.3.0.1'
}
第三步:Android权限的添加
在AndroidManifest.xml文件中
<!--网络连接-->
<uses-permission android:name="android.permission.INTERNET" />
<!--查看网络状态,sdk重连机制等需要使用-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--获取手机状态参数,并作为生成个推唯一标识的必要参数-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--查看wifi连接状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--开机自启动权限,提升sdk活跃,保障触达-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!--读写权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--震动-->
<uses-permission android:name="android.permission.VIBRATE" />
<!--获取任务信息,目的是防止sdk被频繁唤醒-->
<uses-permission android:name="android.permission.GET_TASKS" />
还有兼容Android 9.0在application节点添加 android:usesCleartextTraffic="true"
第四步:初始化个推服务
在Application中添加
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//初始化个推服务
PushManager.getInstance().initialize(this);
//初始化个推统计
boolean isDebug = AppUtils.isAppDebug();
String channel = InitData.getInstance().getChannel();
initGS(isDebug,channel);
}
private void initGS(boolean isDebug, String channel) {
//配置个推统计相关的
//1.从启动应用到关闭应用
//2.从启动应用到应用退至后台,且在后台运行时间超过 30s
GsConfig.setSessionTimoutMillis(20 * 60 * 1000);
//开启开发者模式:
GsConfig.setDebugEnable(isDebug);
GsConfig.setInstallChannel(channel);
//SDK 初始化
GsManager.getInstance().init(mApplication);
}
}
简化集成步骤,只需调用新增 PushManager.getInstance().initialize(Context context) 接口即可完成 SDK 初始化, 个推 SDK 会自动去寻找相应的 PushService 和 GTIntentService
版本2.9.5.0以后接口变动,如今集成初始化更简单了
- 新增PushManager.getInstance().initialize(Context context) 接口进行初始化,推荐使用该接口进行初始化。
- 新增PushManager.getInstance().setDebugLogger(Context context, IUserLoggerInterface loggerInterface) 接口,用于调试日志输出。
- 调用个推初始化代码:com.igexin.sdk.PushManager.getInstance().initialize(Context context) 进行 SDK 的初始化。我们建议开发者在 Application.onCreate() 和主 Activity.onCreate() 方法中初始化个推 SDK。多次调用 SDK 初始化并无影响。为了保证 SDK 服务稳定,推荐引导用户授权相关的隐私权限。
第五步:自定义接收推送服务
public class MessageReceiveIntentService extends GTIntentService {
private static boolean isNotify;
@Override 00
public void onReceiveServicePid(Context context, int i) {
Log.d("aa", i + "");
}
/**
* 接收 cid 00
*/
@Override
public void onReceiveClientId(Context context, String clientId) {
LogUtils.e(TAG, "onReceiveClientId -> " + "clientId = " + clientId);
reportCid(clientId);
}
private void reportCid(String cid) {
if (InitData.getInstance().getUserDbBean() != null) {
CommonHttpUtils.reportCid(cid);
}
}
/**
* 处理透传消息 00
*/
@Override
public void onReceiveMessageData(Context context, GTTransmitMessage gtTransmitMessage) {
// 透传消息的处理
String message = new String(gtTransmitMessage.getPayload()).trim();
LogUtils.d("onReceiveMessageData,getPayload:", message);
LogUtils.d("onReceiveMessageData,getMessageId:", gtTransmitMessage.getMessageId());
LogUtils.d("onReceiveMessageData,getPayloadId:", gtTransmitMessage.getPayloadId());
LogUtils.d("onReceiveMessageData,getTaskId:", gtTransmitMessage.getTaskId());
}
/**
*cid 离线上线通知 00
*/
@Override
public void onReceiveOnlineState(Context context, boolean b) {
}
/**
* 各种事件处理回执 00
*/
@Override
public void onReceiveCommandResult(Context context, GTCmdMessage gtCmdMessage) {
LogUtils.d("onReceiveCommandResult,getAction:", String.valueOf(gtCmdMessage.getAction()));
}
/**
* 通知到达,只有个推通道下发的通知会回调此方法 00
*/
@Override
public void onNotificationMessageArrived(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d("onNotificationMessageArrived,getContent:", gtNotificationMessage.getContent());
LogUtils.d(
"onNotificationMessageArrived,getMessageId:", gtNotificationMessage.getMessageId());
LogUtils.d("onNotificationMessageArrived,getTaskId:", gtNotificationMessage.getTaskId());
LogUtils.d("onNotificationMessageArrived,getTitle:", gtNotificationMessage.getTitle());
}
/**
* 通知点击,只有个推通道下发的通知会回调此方法 00
*/
@Override
public void onNotificationMessageClicked(Context context, GTNotificationMessage gtNotificationMessage) {
LogUtils.d("onNotificationMessageClicked,getContent:", gtNotificationMessage.getContent());
LogUtils.d(
"onNotificationMessageClicked,getMessageId:", gtNotificationMessage.getMessageId());
LogUtils.d("onNotificationMessageClicked,getTaskId:", gtNotificationMessage.getTaskId());
LogUtils.d("onNotificationMessageClicked,getTitle:", gtNotificationMessage.getTitle());
}
}
第六步:配置服务
<!-- 用户自定义服务继承自GTIntentService,作为SDK与APP桥梁服务,用来接收各种消息和命令回复-->
<service
android:name=".pushservice.MessageReceiveIntentService"
android:permission="android.permission.BIND_JOB_SERVICE" />
第七步:配置推送服务
public class MessageCustomPushService extends PushService {
}
//服务
<service android:name=".pushservice.MessageCustomPushService"
android:exported="true"
android:label="PushService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":pushservice"
/>
注意:使用 maven 集成,android:process 属性必须为 pushservice
第八步:设置通知图标
具体可参照个推集成文档
https://docs.getui.com/getui/...
这样一个个推服务就完成了
精细化推送
Tag[] tags=new Tag[]{};
PushManager.getInstance().setTag(Context context,Tag[] tags,String s);标签接口类,用于给用户打上标签(如可以用于精准推送)
四:个推使用
结尾:要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。