-
个推推送模板详解
2019-12-23 18:04:42作为专业的消息推送服务商,个推为开发者提供了不同种类的推送模板,以实现相应的推送功能。推送模板可以单用,也可以组合使用。为帮助APP开发者更快速地找到适合的推送模板,实现所想要的推送效果,我们写下这篇...背景
作为专业的消息推送服务商,个推为开发者提供了不同种类的推送模板,以实现相应的推送功能。推送模板可以单用,也可以组合使用。为帮助APP开发者更快速地找到适合的推送模板,实现所想要的推送效果,我们写下这篇教学普及贴,希望可以帮到大家。
推送样式
个推提供了不同的推送样式,比如系统样式、展开式通知样式。
ps. setLogo的图片需要在客户端开发时嵌入(main-res),否则无法展示;
pps. setLogo 和 setLogoUrl 可以二选一。如果二者都设置了,则 setLogoUrl 优先级比setLogo高,但是小米、华为等有些机型并不支持该功能,因此,开发者要慎选;
ppps. small logo图片没有可以修改的服务端接口,展示客户端内置的图片,默认值是push_small.png,很多手机(比如小米)改过其展示效果,这部分的小图标不一定能显示出来;
系统样式,展开式通知样式具体代码如下:
//系统样式
public static AbstractNotifyStyle getStyle0() {
Style0 style = new Style0();
style.setTitle("这是你想要的标题");
style.setText("这是你想要的内容");
style.setLogo("push.png");//配置通知栏图标,需要在客户端开发时嵌入
style.setLogoUrl("");//配置通知栏网络图标
style.setRing(true); //设置通知是否响铃
style.setVibrate(true); //设置通知是否震动
style.setClearable(true); //设置通知是否可清除
//Android 8.0 以上支持的
style.setChannel("通知渠道id");
style.setChannelName("通知渠道名称");
style.setChannelLevel(3);
return style;
}
//展开式通知样式
public static AbstractNotifyStyle getStyle6() {
Style6 style = new Style6();
style.setTitle("这是你想要的标题");
style.setText("这是你想要的内容");
style.setLogo("push.png"); //配置通知栏图标,需要在客户端开发时嵌入
style.setLogoUrl(""); //配置通知栏网络图标
// 两种方式选一种
style.setBigStyle1("bigImageUrl"); //设置大图+文本样式
//style.setBigStyle2("bigText"); //设置长文本+文本样式
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
style.setChannel("通知渠道id");
style.setChannelName("通知渠道名称");
style.setChannelLevel(3);
return style;
}效果图
以小米8手机 Android 9版本为例,推送效果如下(为了脱敏,直接用个推demo自带的图标)
上述代码中提到了安卓8.0系统中开始支持的通知渠道,具体的字段含义解释如下。
setChannel表示通知渠道id,是渠道的唯一标识,其默认值为“Default” ;setChannelName表示通知渠道名称,用户可在手机“设置”中查看,其默认值也为“Default”。 setChannelName长度建议设置在40Byte以内,超出会被安卓8.0系统自动缩减。 setChannelLevel表示设置通知渠道的重要性,其默认值为3。具体操作过程中值有五种可供选择:0、1、2、3、4;设置之后不能修改,展示形式如下:
0:无声音,无震动,不显示。
1:无声音,无震动,锁屏不显示,通知栏中内容被折叠显示,导航栏无logo。
2:无声音,无震动,锁屏和通知栏都予以显示,通知不唤醒屏幕。
3:有声音,有震动,锁屏和通知栏中都予以显示,通知唤醒屏幕。
4:有声音,有震动,亮屏下通知悬浮展示,锁屏通知以默认形式展示且唤醒屏幕。
ppps. channel设置完后,就不能再对channelLevel进行修改,只能新建一个新的channel。这是安卓原生的限制;
推送模板
到此,大家应该已经了解了想要推送的展示效果,但是需要什么样的模板来实现具体的通知效果呢?各位请继续往下看。
通知 & 启动应用
采用下述代码用户可以在通知栏看到一条含图标、标题等的通知,当他点击后可以激活应用,到达应用首页。
NotificationTemplate template = new NotificationTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setStyle(getStyle0()); //设置展示样式,具体见推送样式部分通知 &启动应用 & 透传
这种方式在前一种的基础上,加了透传(这部分内容用户是看不到的)。通过透传可以达到不同的效果,比如更新用户信息。
NotificationTemplate template = new NotificationTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setStyle(getStyle0());
template.setTransmissionType(1); // 透传消息设置;1:立即启动APP;2:客户端收到消息后需要自行处理
template.setTransmissionContent("透传内容");
通知 & 打开网页
下述代码用户可以在通知栏看到一条含图标、标题等的通知。当他点击通知、启动手机浏览器,便可以打开该通知所设置好的页面。
LinkTemplate template = new LinkTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setStyle(getStyle0());
template.setUrl("http://www.baidu.com"); //设置打开的网址地址通知 & 启动应用打开intent
这是我们最常见的方方式:点击通知,打开APP内指定的页面。
StartActivityTemplate template = new StartActivityTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setStyle(getStyle0());
String intent = "intent:#Intent;component=com.yourpackage/.NewsActivity;end";//这部分写法不清楚的,可以咨询安卓客户端的童鞋
template.setIntent(intent); //最大长度限制为1000,很重要透传
如果大家有一些个性化需求,比如想要自己定义所要实现的展示效果,那么可以用纯透传的方式。
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setTransmissionType(2);// // 透传消息设置;1:立即启动APP;2:客户端收到消息后需要自行处理,如果设置为1,对用户使用不友好,不推荐使用
template.setTransmissionContent("透传内容");消息撤回
这个功能很实用,当App运营者不小心发送了不当的消息,可以立马撤回。
RevokeTemplate template = new RevokeTemplate();
template.setAppId(APPID);
template.setAppkey(APPKEY);
template.setOldTaskId(taskId); //指定需要撤回消息对应的taskId
template.setForce(false); //客户端没有找到对应的taskid,是否把对应appid下所有的通知都撤回消息覆盖
比如足球比赛实时比分播报,用户只想知道最新比分,我们就可以选择“消息覆盖”方式的推送模板。
前面代码中提到的StartActivityTemplate 、LinkTemplate 、 NotificationTemplate 都有一个方法:setNotifyid(Integer notifyid)。在消息推送的时候设置notifyid,当有覆盖需求时,使用相同的notifyid发一条新的消息,客户端sdk会根据notifyid对应的前一条消息进行覆盖。
iOS推送
你可能发现了前面所讲的都是基于安卓推送的操作, iOS的操作相对会比较特殊。逻辑是当APP在线时,个推消息推送会直接把透传内容发送到手机上,需要客户端解析后予以展示;当APP离线时,推送会采用APNs通道,由iPhone的系统通道通知并展示消息。iOS推送可以采用TransmissionTemplate模板,根据setAPNInfo(Payload apn)法来设置具体参数。
具体参数基本上按照iOS官网的字段来进行命名,应该会比较容易上手。这里附上iOS官网文档链接。
个推iOS推送参考代码如下:
private static APNPayload getAPNPayload() {
APNPayload payload = new APNPayload();
//在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字
payload.setAutoBadge("+1");
payload.setContentAvailable(1);
//ios 12.0 以上可以使用 Dictionary 类型的 sound
payload.setSound("default");
payload.setCategory("$由客户端定义种类");
payload.addCustomMsg("由客户自定义消息key", "由客户自定义消息value");
payload.setAlertMsg(getDictionaryAlertMsg()); //字典模式
//设置语音播报类型,int类型,0.不可用 1.播放body 2.播放自定义文本
payload.setVoicePlayType(2);
//设置语音播报内容,String类型,非必须参数,用户自定义播放内容,仅在voicePlayMessage=2时生效
//注:当"定义类型"=2, "定义内容"为空时则忽略不播放
payload.setVoicePlayMessage("定义内容");
//添加多媒体资源,可以是图片、音频、视频,最多可以添加3条多媒体
payload.addMultiMedia(new MultiMedia().setResType(MultiMedia.MediaType.pic)
.setResUrl("资源文件地址")
.setOnlyWifi(true));//设置是否在WIFI下才展示多媒体消息,如果设置true但未使用WIFI时会展示成普通通知
return payload;
}
private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg() {
APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
alertMsg.setBody("body1");
alertMsg.setActionLocKey("显示关闭和查看两个按钮的消息");
alertMsg.setLocKey("loc-key1");
alertMsg.addLocArg("loc-ary1");
alertMsg.setLaunchImage("调用已经在应用程序中绑定的图形文件名");
alertMsg.setTitle("通知标题");
alertMsg.setTitleLocKey("自定义通知标题");
alertMsg.addTitleLocArg("自定义通知标题组");
return alertMsg;
}
/**
* 需要使用iOS语音传输,请使用VoIPPayload代替APNPayload
* 需要相关证书才可以使用此功能
*/
private static VoIPPayload getVoIPPayload() {
VoIPPayload payload = new VoIPPayload();
JSONObject jo = new JSONObject();
jo.put("key1", "value1");
payload.setVoIPPayload(jo.toString());
return payload;
}总结
个推推送模板提供了系统样式和展开通知样式,但是开发者请务必要注意:Android和iOS的代码推送方式是不同的。推送iOS消息,只能用TransmissionTemplate透传模板;推送Android消息,可以使用TransmissionTemplate透传模板和NotificationTemplate、LinkTemplate、StartActivityTemplate、RevokeTemplate通知类模板。为提供更优质的推送服务,个推持续优化产品功能,丰富推送模板,同时将于近期推出基于Restful的v2接口,以更加符合开发者的使用习惯,敬请期待。
-
H5+个推实现消息推送服务
2016-10-20 18:41:15首先,在个注册个账号,开发阶段使用个人注册即可,个推注册地址 注册完进入配置页面,对应用进行配置,框中的几个地方要特别注意 注册时会要求填一个包名,这个就是H5中对应的包名,一定要对应起来,否则收不到...网上看了几篇教程都是比较老的版本了,根据前人的智慧,然后自己摸索了下,简单几步实现了在手机上推送自定义的消息。
首先,在个注册个账号,开发阶段使用个人注册即可,个推注册地址
注册完进入配置页面,对应用进行配置,框中的几个地方要特别注意
注册时会要求填一个包名,这个就是H5中对应的包名,一定要对应起来,否则收不到推送消息。或者查看应用的标识一定要和下面的标识对应起来,这样才能接收到信息。在这耽误了好久。
框中的几个值记录下来,在H5的配置文件中药用到,如下图所示:
在SDK配置中选中个推,然后将注册得到的各个值填入框中,然后选中代码视图,会发现刚才填写的值自动加入到push中,关键的一步将包名改为我们在个推创建demo的时候填写的包名:
接下来我们就可以推送消息了,打包apk,在手机端运行起来先,然后我们回到个推网站,会发现,在线用户人数变为1,这就说明个推和我们手机端已经连接成功了,可以进行消息推送了。
然后我们点击 创建推送,进入推送设置页面,简单 推送一条消息吧
至于要推送什么消息,要设置什么格式大家自己研究研究吧。
消息发送完我们在手机端的状态栏就会收到如下消息
说实话,一开始我也没想到这么简单,就是在包名那卡了一会,各种第三方平台的出现给开发确实带来了极大的便利,整个过程半个小时搞定。希望大家都能成功。
-
推送之个推推送
2016-11-21 11:20:35集成类似于个推这种第三方框架首先要对其官方的sdk熟悉一番,个推的官方文档写的着实详细呢,每个名词都有详细的解释,还有相关的示例代码,所以如果你也碰到了个推,请不要只是关注于集成文档,个推官网那些东西...做完推送这个需求已经很长时间了,一直以来也没时间来写写笔记及新得,做完这个需求收货还是颇多的
集成类似于个推这种第三方框架首先要对其官方的sdk熟悉一番,个推的官方文档写的着实详细呢,每个名词都有详细的解释,还有相关的示例代码,所以如果你也碰到了个推,请不要只是关注于集成文档,个推官网那些东西着实很受用。
在拿到需求初期,只是简单的被告知要用个推的sdk,于是乎,在做推送初期一直伏在个推官网上,首先来说说伏在个推官网时那些收获:
1,从苹果官方网站下载含有APNS的测试证书,双击安装到本地电脑上(详细步骤略了),并将此证书以p12的格式上传到其官网相应位置。
2,先从官网下载了官方版本的个推sdk,添加各种依赖库,在官网注册了个推的个人账号。
3,在工程的delegate.m文件中依据集成文档,该写的写好。
4,以上工作完成后,首先来验证下我的证书,在官网如下可以进行尝试性推送
或者可以通过一个叫做pushmebaby的第三方小软件测试。
5,1.在此开个小差,介绍下pushmebaby,这个软件是一个xcode工程,将你想测试的证书拉到工程中,注意pushmebaby的bundle中的证书名称要与pushmebaby代码中的证书名称一致。如果初次运行时,有个地方会报错,哪错把哪注释掉就行了。软件运气起来如下:
2.运行已经集成个推官网sdk的工程,如果sdk集成一切ok的话,会在控制台打印出Device Token,将此deviceToken粘贴到pushmebaby填写Device Token处(注意两点:一是这里填写的devicetoken是最原生的不要去掉中间的空格;二是运行deviceToken的电脑必须联网,因为APNS的推送的原理相信你懂得),然后点击下边的额Push按钮,将app退到后台或杀死,你会收到一条推送通知栏消息,内容即为pushmebaby的Payload中显示的数据。
pushmebaby推送消息成功,说明客户端从集成到证书一切是ok的,如果后台推的通知栏消息一直没有踪影的话,只能是他们后台的问题了。
当我把个推官网的sdk玩的差不多已经很溜的时候,个推工作人员有弄过来一个针对于俺们这个需求的sdk,ok,所有步骤再来一遍,一切水到渠成。
苹果的推送机制,说白了无非就是通知栏显示消息,但其弊端就是只是在app处于后台或杀死状态才能收到消息,app处于前台时无法收到;即使在后台收到APNS通知栏消息也无法对其存储操作。要想将苹果的APNS发挥到极致,ok,类似于个推的公司出现了,这样我们的app处于后台或杀死后,不仅能接受通知栏消息,app在前天运行时也可以接搜到消息,并且无论在哪种情况下,都可以对这些消息进行存储等等操作。
现在来详细说下个推的sdk:
一、
+ (GexinSdk *)createSdkWithAppId:(NSString *)appid appKey:(NSString *)appKey appSecret:(NSString *)appSecret appVersion:(NSString *)aAppVersiondelegate:(id<GexinSdkDelegate>)delegate error:(NSError **)error;
注册个推,这个不必多说。在didfinishlaunching与applicationDidBecomeActive都要调用此方法。
二、
- (void)GexinSdkDidRegisterClient:(NSString *)clientId;注册cid,这个方法个推的实例代码依葫芦画瓢即可,对于客户端意义不大,对个推后台意义重大
三、
- (void)GexinSdkDidReceivePayload:(NSString *)payloadId fromApplication:(NSString *)appId 这个就是个推通道接收消息的方法。
1,当app在前台运行时,接到消息会走此方法;2,当app在后台运行或者当app被杀死时,个推接到消息时,个推会将消息暂存在其服务器端,当app再次进入前台时,个推会将此保存在其服务器端的消息下发,客户端会通过此方法接收消息;消息的存储等可以在此方法内处理
四、别名绑定
- (void)bindAlias:(NSString *)alias;
- (void)unbindAlias:(NSString *)alias;
这两个方法放在一起说,分别是别名绑定和解除别名绑定,如果绑定别名后,个推后台在推送消息时可以安别名推送,这样就可以实现个推在推消息时,不仅能收到一般消息还可以收到只关于其账号的个人消息了,用户退出账号或用其他账号登录时就需要解除别名绑定。
个人认为最重要的就是以上几个个推的sdk方法了。
原生客户端的几个方法:
一、
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {}
用户在点击通知栏时才会走此方法,在这里可以对app的角标进行设置。例如进app后将角标全部归零等。在app角标归零设置时,直接进行设置为0不可用(
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;)必须先将其赋值之后再将其置为0才好使,by the way 应用图标右上角的数字角标的控制是需要app哦、后台一起配合才能完成的。
二、
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {} 当app收到通知栏消息,通过app图标进入会走此方法,如果要处理应用角标时也需要在此做如上相同的处理。
曾经跳过得坑:
1,关于sm4解密:
自家app推送过来的消息是经过sm4加密的,所以在接收到消息展示时需要进行sm4解密。在推送项目初期及中期,并未做sm4加密,未加密前,everything is ok,通知栏点击正常无论app在后台在前台还是被杀死,接收消息都很正常,弹出该条信息所对应的详情页。加密之后每点击通知栏都会崩溃,挣扎了将近一天,发现是因为sm4秘钥的原因,在用户点击通知栏消息时,后台的sm4秘钥还未送到客户端,而点击通知栏就要展示详情,次详情的报文需要sm4解密,所以一顿乱奔啊,最终将此秘钥做了个存储,并每次都要进行比较,不一样则替掉,就这样一个super bug overcomed。
2,关于秘钥:
因为秘钥不是一成不变的,所以消息在存储时,每条消息都要存储一条与之对应的秘钥,每次从数据库里读取这条消息时都要用这条消息存储时对应的秘钥进行解密,如果秘钥不匹配,会崩溃的。
3,还是关于秘钥:
当接到个推通道的消息时,需要sm4解密时,一定要判断本地实时要退换和对比的sm4秘钥是否存在,如此时还未获取到sm4串,请return
4,关于详情页的展示:
当用户点击通知栏时,需要弹出对应内容的详情页。
开始是这么设计的,接到个推推送消息先进行存储数据库操作,然后才展示,这样做经常出现的问题是:应用经常停留在app首页,而未进入详情页面,但偶尔跳的却很顺畅,思来想去,转换了设计思路,先用获取到的数据进行展示,然后再将数据进行存储。ok 问题解决。
5,关于通知栏消息与个推通道消息的匹配:
当客户端接到n条通知栏消息时,客户只点击了其中一条,那我们如何知道客户点击的是哪条并将对应的详情页报文呈上展示给客户呢?我是这样设计的:让个推后台在推送通知栏消息时,让其在报文中添加了一个唯一的消息标识。当然,通过个推通道下发的消息中也会有一个唯一的消息标识。当用户点击了某条通知栏消息时,就将通知栏的消息标识与 个推消息报文进行匹配,如此便可。
现在任然存在的问题:
当用户下载了本应用,登录后(绑定别名后),然后直接卸载应用,之后再重新下载此应用后,客户此次下载(还未进行登录以及绑定别名等操作时),按理说此时客户端收到上一个账户的通知栏消息是不合理的。
思路一 :个人认为这个应该由app后台配合操作,即我需要把上一个客户的别名以及此设备的唯一标识发给后台,再我下一次重新下载时,便给后台发这两个参数,其中一个便是设备号(此操作只进行一次),如果后台之前存储的设备号与客户端发出的一致,app后台便要给个推后台发消息,让个推解绑此设备之前对应的别名账户,即停止推送。
思路二:手机内部有块存储区域即我们通常所称的钥匙串,在应用存在于手机上时,我们可以往此处存储用户别名,当app被卸载时,这些数据依旧存在,当下次再重新打包时,便从钥匙串中读取此别名,进行解绑。
思路二的方法,简单设计范围低,可是不是每次都好使,表示很郁闷,思路一,设计面太广,实施难度很大,暂未执行。
暂时总结于此,如有改变会继续更新,若有不足之处或已经解决以上问题者请留言,吾将不胜感激。
-
Android 消息推送:个推
2018-01-30 13:49:09之前一直在使用极光推送,这次项目打算使用个推试试!个推:个推官方文档集成失败原因:1、检查自己的APPID等信息2、检查AndroidManifest.xml<!-- 自定义权限 自定义权限解释:部分手机型号不能正常运行个推...之前一直在使用极光推送,这次项目打算使用个推试试!
个推:个推官方文档
集成失败原因:
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接入测试已经成功完成!
-
个推 - 消息推送
2018-09-14 10:40:21最近研究了一下个推的消息推送,记录一下。 -
android个推
2017-05-20 11:14:30之前公司用的推送是极光,昨天公司要求转战个推,然后查看了个推的开发文档,可以说非常简单。缺点就是通知需要我们android客户端本地发送。后面会详细说。 个推的集成文档:... -
vue消息推送【个推】
2019-04-30 14:20:34由于个推在市场上使用量比较多,于是就开启了我的Vue消息推送个推之旅。 而此时发现个推的开发者中心注册账号时,需要: 这些他必须要得提供。我们知道android包名和IOS bundleID就是我们使用Hbuilder的包名,... -
个推消息推送
2016-04-28 17:34:18最近使用个推推送手机端消息,根据个推官网下载java后台的sdk。其中需要jar包如下图: 代码如下: package com.gsafety.message.util; import java.util.ArrayList; import java.util.List; ... -
iOS集成个推推送
2017-07-03 11:54:31前段时间由于项目需要,要使用个推进行推送,由于以前主要接触的是极光推送,所以集成过程中出现了很多问题,以防以后再次出现同样的问题,特意记录一下,也希望能帮到需要的人。 首先看一下个推官网提供的推送流程... -
消息推送(个推)
2017-12-08 17:31:291.总得先说两句 ...推送:个推(透传消息) 通知:自定义Notification 2.1 先来创建个推账户吧 个推官网,个人账户和公司账户均可。 2.2 个推开发者中心 1.登记应用 2.填写项目... -
消息推送(个推推送)的原理
2016-12-13 14:30:18消息推送(个推推送)的原理: 1.手机客户端初始化个推SDK; 2.如果初始化成功,个推SDK向在个推服务器注册; 3.如果注册成功,个推服务器会向个推SDK返回CID; 4.如果个推SDK接收到个推服务器发送来... -
IOS 个推推送总结
2016-01-30 15:26:251.创建个推开发者帐号 创建个推开发者帐号,请访问个推开发者平台(dev.getui.com),点击注册进行开发者账号注册。 2.登记新应用 创建好账号进入个推开发者平台,首页展示的是如下界面,点击左上角“登记应用”... -
个推使用教程
2019-04-22 16:03:33因为工作需要,甲方单位使用极光推送总是出现用户收取不到推送消息,甲方要求我们使用个推。 因为我们访问网络的时候使用的是代理,所以个推提供的接口发送接口不能使用,所以需要重新写一个支持代理的http链接。... -
小米推送,华为推送,个推,阿里云推送集成(服务端JAVA开发)
2017-11-22 15:06:22小米推送,华为推送,个推,阿里云推送集成(服务端JAVA开发) -
个推App消息推送
2017-09-07 09:27:57个推 消息推送的研究经历 注意:登记时的应用标识就是appid. 应用登记成功之后会得到APPID,APPSecret,APPkey,MasterSecret 接着就需要配置sdk了,把得到的数值填入相对应的名字里面就可以了 这些做完... -
使用个推实现消息推送到客户端
2018-08-17 18:04:45由于公司业务需要,也得学习一下个推的使用,在此记录一下。 1、使用之前,首先的到个推官网注册账号:https://www.getui.com 2、注册完之后登录进去,之后你会获得 appId 、appKey 、masterSecret 快速入门: ... -
个推使用指南
2018-09-14 17:31:13按照个推文档CocoaPods集成,基本能实现个推的基本推送功能。但是很多细节文档没有说,我就走了很多弯路。 首先登录个推网站。在个推·消息推送登记应用。 要登记测试环境和生产环境两个应用。 点击应用... -
个推推送步骤
2016-06-24 16:43:28第一步:导入个推SDK 将SDK资料包中“GETUI_ANDROID_SDK\资源文件”目录下的GetuiSdk-xxx.jar、so文件夹子文件复制到app模块目录下的libs文件夹中。 注:导入需要的 cpu 架构的 so 库即可 打开app/build.gradle... -
Android 推送-个推
2016-12-22 18:56:16最近闲来无事就把个推研究了一下,发现个推的SDK版本已经更新到2.9.5.0了,而且跟以前的版本相比感觉变化实在是太大了。 以前的版本在配置清单里面的配置为<!-- 配置第三方Receiver--> android:name=... -
android 个推的消息推送
2016-04-20 01:10:10我要实现的是收到个推的通知之后更新UI界面,但是通知要点击之后才会触发receiver,这个怎么解决? -
推送SD K信鸽推送 和 个推推送 调研对比
2016-12-29 10:13:23转载请以链接形式标明出处: http://blog.csdn.net/lxk_1993/article/details/53924581 本文出自:【lxk_1993的博客】; ...个推 SDK占用空间 armeabi:1.76M 全部:2.31M (都包含android-support -
个推消息推送Android版常见问题整理
2019-09-05 14:37:19为了更好地服务开发者,此次我们针对个推Android推送使用中可能出现的一些常见问题做了整理,提供了一些比较方便掌握的解决方法,希望能帮助到大家。 1. Android推送和iOS推送调用模板的区别? Android调用推送模板... -
mui js 个推 关于推送消息监听
2018-03-13 18:14:09之前关于个推和语言播报功能做了一个类似外卖的app, 最近又接触到推送碰到一些坑,特地在博客内做一些记录。首先要了解 推送监听只有2个,一个是 click 一个是 receive 如果按照官方的意思是 click:点击推送消息... -
第三方推送服务:个推服务推送流程
2015-09-24 15:20:41一、使用个推服务向手机端推送数据首先需要具备以下条件: 1、个推账号(个推官网注册) 2、由苹果推送证书生成的.p12文件(ANDROID不需要证书) 3、个推SDK(个推官网下载) 二、以上条件具备后,开始架构推送服务 ... -
个推消息推送iOS版常见问题整理
2019-09-05 14:31:29为了更好地服务开发者,此次我们针对个推消息推送iOS版使用中可能出现的一些常见问题做了整理,提供了一些比较方便掌握的解决方法,希望能帮助到大家。 1. iOS推送流程是什么样的? iOS下发的消息分两部分:一部分... -
dcloud -集成个推 推送消息内容
2017-09-29 16:33:24dcloud -(在线/离线)集成个推 推送消息内容 App开发,应该大多数人都会遇到需要进行消息推送功能的开发,dcloud开发App同样需要自己去集成,所以,在这里就记录一下dcloud集成个推,消息推送的知识,这里提 ... -
个推 通过第三方个推开发者平台实现
2017-03-18 16:20:22在以项目名为命名的顶层build.gradle文件中,添加个推maven库地址,如下图所示: //Maven URL地址maven { url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"} 配置依赖 compile '... -
unipush+java+个推实现app消息推送
2020-08-26 11:09:15对于安卓,谷歌本来有专门的推送通道,但是无奈被墙,所以各个大厂就自己各搞一套,那我们开发者如果每个都去开发一套成本就太高了,所以就需要借助第三方通道,让他们帮我们处理,目前比较火的有个推,极光等等,... -
消息推送 “个推集成”
2016-04-16 16:51:06推送:分全局推送和个推; 个推是自动推送,而不需要人工干预,比如收到新的买家订单;根据买家订单, 服务端推送新订单消息到商户的手机上! 我们项目中的自定义消息类型: 订单消息、报价消息、新版本更新消息等等。...
-
MobaX_162800.zip
-
SQL Server 2016 高可用灾备技术合集
-
病毒大作战Keil.rar
-
【最新版本】Xilinx Kintex-7工业开发板产品说明书.pdf
-
python框架django网站文件上传知识点(新手入门)
-
2021 买菜小程序 毕业设计 毕设 源码 源代码 使用教程
-
算法笔记之STL用法总结
-
Metabase从入门到精通视频教程
-
leetcode 230. kth-smallest-element-in-a-bst 二叉搜索树中第K小的元素 python3
-
转行做IT-第7章 数组
-
数据挖掘Python基础之NumPy基础(上)
-
基于Django的电子商务网站设计--第九章 Python在线题库
-
汇编语言程序设计教程
-
AOA天线设计手册.pdf
-
springmvc配置实现
-
CRT8.0.3.rar
-
html javascript js制作加载进度条.loading
-
亿度云盘~Java小白入门实战
-
AI-人脸口罩识别特训营
-
【Appium踩坑】Original error: The instrumentation process cannot be initialized