共计 6343 个字符,预计需要花费 16 分钟才能阅读完成。
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); 标签接口类,用于给用户打上标签(如能够用于精准推送)
四:个推应用
结尾:要有最奢侈的生存和最边远的幻想,即便今天天寒地冻,山高水远,路远马亡