以下为一些常见的技术问题解答及常见概念的理解,本文档将持续补充,对推送有疑问的开发者可以自行 Ctrl+F 搜索关键字找寻解答
一、概况问题
1. 如何申请接入?
感谢您选择小米推送,点此查看接入指南;
2. 小米推送收费吗?
小米推送的基础服务目前是免费的。
3. 小米推送目前支持哪些平台?
目前仅支持Android平台。
4. 如何删除推送后台应用?
您可以在开放平台——管理控制台——小米应用商店,选择你要删除的应用,点击“更多服务”,即可删除该应用。
5. 如何衡量推送的效果,提供哪些数据统计结果?
小米推送目前提供的数据统计如下:
1)推送数据:当日实时的推送量(区分单发和群发)和送达量,历史每天的推送量(区分单发和群发)和送达量 ;
2)消息记录:每条消息的计划推送量、送达量和送达率、点击量和点击率;
3)用户数据:需要开发者选择启用才开始记录,包括当日实时在线数和最高在线数,历史每天的最高在线数、新增用户数和日活跃用户数(推送的日活定义为当日长连接在线过的设备) 历史数据支持自定义时间段的查询和导出xls文件。
详细可以参考:推送统计指标说明文档
6. 小米推送服务有哪些限制?
为了改善小米终端用户的通知体验,营造良好可持续的推送生态,小米推送对推送消息数量、推送速率QPS进行了统一管理。详细可参考文档《小米推送消息限制说明》。对于单条消息,可携带的数据量最大不能超过4KB。
二、概念解释
1.关于送达率
1.1. 小米推送的送达率是怎么计算的?
小米推送送达率=本次推送真正送达的设备数/所覆盖的所有设备数;
如果目标对象的选取是所有用户,那分母就是历史上所有激活过推送服务的有效设备数;如果是按照标签选取的,那分母是历史上所有订阅过这个标签的有效设备数;如果是按照别名或者regID来选取,那么分母就是所请求的所有合法的别名或regID。
1.2. 有哪些影响送达率的因素?
按照送达率计算方式,会有如下几个影响送达率的因素:
1) 应用的留存率。已经卸载了app的设备,肯定是推送不到的,按照目前的计算方式,大部分的卸载设备会被计入分母(计划推送数)当中。
2) 应用所在设备的联网情况。如果在消息有效期内,设备一直不联网,那消息也是不能送达的,但也会被计入分母当中。
3) 消息的有效期。有效期越短,在有效期内联网的设备数势必就越少,因此送达率会随之下降。
4) 目标设备的选取。如果选取的是全量用户,那其送达率肯定会比按照用户联网情况精准提取目标设备(如选取7天内有过打开应用行为的用户)要低。
2.关于regID
2.1. regID是根据什么生成的?
regID是在客户端向小米推送服务注册时,小米推送服务端根据设备标识、appID以及当前时间戳生成,因此能够保证每个设备上每个app对应的regID都是不同的。
2.2. regID会不会变化?
当app注册成功后,小米推送服务客户端SDK会在本地通过shared_prefs来保存这个regID,之后app调用注册,SDK后会在本地直接读取出这个regID并直接返回,不会重新请求服务器。因此只要应用不卸载重装或者清除应用本地数据,regID就不会变化。否则,如果SDK没有从本地读取到缓存的regID,则会向服务端重新请求,此时regID会重新生成。
2.3. regID在哪些情况下会失效?
regID在如下几种情况下会被判断失效:
1) app卸载重装或者清除数据后重新注册,这种情况下会生成一个新的regID,而老的regID会失效;
2) app调用了unregisterPush;
3) 在MIUI上,app卸载时,如果能成功上报,则regID会被判定失效;
4) 设备超过30天没有和小米push服务器建立长连接;
2.4. 如何获取失效的regID?
可以通过callback接口从小米推送服务后台拉取失效regID的列表,具体用法请参见《服务端JavaSDK文档》中的“拉取失效数据”一节。
3. 标签(topic)
开发者可结合自己的业务特征,给用户打上不同的标签(Topic)。在消息的推送过程中,开发者结合每条消息的内容和目标用户,选择每条消息所对应的标签,可以进行更精准的定向推送。
4. 别名(Alias)
应用可为每个设备ID(即RegID) 设定一个别名(Alias),方便开发者与自有的ID系统进行关联,避免因需要保存设备RegID与自有账号的对应关系而给开发者带来额外的开发和存储成本。
5. alias和user account有什么区别
alias和user account都可以用来设置设备对应的用户账号,所不同的是,一个alias只能对应一台设备,如果有多台设备设置了同样的alias,则最后一个设置成功的生效,其它设备就会失效。而一个user account可对应10台以内的设备。因此如果应用是单点登录的,一个账号只会在一台设备上生效,用alias会比较合适。而如果产品需求是单账号多点登录同时接收消息,则用user account会更合适。
三、系统服务问题
1. 如果我使用通知栏类型消息,能否在通知栏消息到达之前,先执行一段app的代码?或者在通知栏到达时,通知app?
在MIUI系统上,通知栏类型的消息,是不需要应用启动就能弹出的(这一特性决定了通知栏消息的弹出可以不受应用自启动管理的影响),因此在整个弹出通知栏消息的过程中,app是完全不可感知的,当用户点击通知栏消息之后,才会执行到app的代码。
2. 当我的应用被杀掉之后,还能否接收到小米推送服务的消息?
如果是在非MIUI系统中,是需要应用驻留后台才能接收消息的,因此如果应用被杀死并且不能后台自启动的话,是没有办法接收消息的。
3. 小米push是不是共享通道的?
在MIUI系统中,push服务的消息走的是系统通道,不需要应用单独建立连接。
在非MIUI上,通道会建立在每个app的进程中,每个接入mipush服务的app都会建立一条单独的通道。
这种设计的考虑原因如下:使用共享通道,会有如下几个问题解决不了,1.流量。假如你的app不幸被选中成为其它app的消息通道,而某个恶意app通过这个通道发了大量的消息,所产生的流量,都会算在你的app的头上。2.安全性。如果你的消息走的是别的app的通道,数据需要通过另一个app的进程中转,则在这过程中很容易被伪造、纂改、拦截。
4. 在MIUI中,小米推送支持的最低Android版本和MIUI版本是什么?
Android支持4.4及以上系统版本;onNotificationMessageArrived回调等功能需要MIUI7以上版本支持;
5. 有没有方法检测小米推送是否已经注册的方法
客户端调用getregid,如果有返回,就注册成功了;
四、接入过程问题
1. 第一次接触安卓版小米推送服务,使用你们的demo没有成功,怎么办?
第一次使用小米推送服务(安卓版),请仔细阅读如下指南:小米推送Android版快速接入指南。
一般注册推送服务没成功,常见的原因如下:
1) 没有开启推送服务。使用推送服务前需要登录开发者账号、创建应用、开通推送服务3个步骤,缺一不可。
2) 没有正确配置AndroidManifest.xml文件。需要特别注意包名、权限部分,包名需要跟开发者站点上开通推送服务的一致,权限的前缀需要改成包名。
3) 系统时间错误。由于小米推送服务需要使用https请求向服务器注册一个匿名账号,在次过程中如果系统时间错误,会引起https过期,导致注册不成功。
4) 联网被阻止。小米推送服务客户端需要使用5222和443两个端口,如果在公司内网,需要联系IT部门把这两个端口开放。同时需要检查应用的联网是否会被一些手机安全助手阻止。需要特别注意的是,在MIUI系统上,长连接是由“小米服务框架”这个系统应用维护的,因此需要确保这个应用的联网并没有被阻止。
2. 为什么onNotificationMessageArrived方法没被调用到?
首先,确认接入是否正确,这个方法需要在manifest中添加<action android:name=”com.xiaomi.mipush.MESSAGE_ARRIVED” />这个action。
在MIUI系统上,这个方法的调用需要同时满足如下两个条件:
1) 新版的MIUI。这个特性是在2015年才加进小米推送服务的,因此需要MIUI升级到较新的版本才能调用这个方法。
2) 需要应用驻留后台。小米推送服务的通知栏消息,是可以在应用不启动的前提下,就弹出通知栏消息的,在这种情况下, 由于MIUI的自启动管理,限制了应用不能在被杀后被后台唤醒,所以推送消息不能直接唤醒应用执行这个方法。
3. 为什么我在onNotificationMessageClicked方法中的startActivity不能调起目标界面?
由于onNotificationMessageClicked中传入的context是application context,本身没有activity栈,因此需要在创建activity时候加入NEW_TASK的flag: Intent i = new Intent(context, MyActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i);
4. 为什么我的设备在调用registerPush的时候会出现no account的错误?
在app第一次在一台设备上注册推送服务时,sdk会通过https请求,从小米推送服务器生成一个匿名账号。这个错误是由于这个请求失败导致的。一般请求失败常见的原因包括如下几种:
1) 系统时间错误。时间错误会导致https在校验证书有效期的时候,出现证书过期,导致https请求失败。
2) 网络原因。这个大部分的原因都是设备架了代理服务器或连了vpn,如果排除这些原因,就检查一下app是否申请了联网权限,是否被什么安全软件阻止了登录,公司wifi是否能用,等等。
3) 如果是在MIUI系统上,生成匿名账号是在一个叫小米服务框架的系统app上完成的,还需要检查这个app的联网是不是在安全中心的联网控制中被手动关闭了。
5. 如何进行通知分类、实现通知栏多条消息并存?
可以使用notifyId(Integer id) 可选项。
默认情况下,通知栏只显示一条推送消息。如果通知栏要显示多条推送消息,需要针对不同的消息设置不同的notify_id(相同notify_id的通知栏消息会覆盖之前的),且要求notify_id为取值在0~2147483647范围内的整数。
6. 注册推送,SDK日志提示“ MIIDManager startMIIDUpdateListener failed cause lack of GET_ACCOUNTS permission ” 。
这是推送的一种消息推送方式 ,不影响正常使用;当sdk 执行按miid推送消息的时候, 会检查一下app有没有获得miid的权限,如果没有,会打印相关消息。
7. 注册推送提示“ Don't send message before initialization succeeded! ”
Mipush sdk 内部逻辑, 检测消息通道是否顺畅,不影响推送功能正常使用。
8. Mipush是否支持通知栏自定义显示图片/如何自定义通知栏样式?
SDK可以根据推送消息中指定的layout文件和填充内容,自由定制展示样式。 在MIUI中,通知展示由系统通道负责,需要MIUI升级后才支持自定义通知。具体使用方法可以参考《服务端Java SDK文档》。另外,关于自定义通知栏layout的配置目前只支持app本地资源已有的图片和布局文件,可以通过这个服务器自定义布局显示出来;暂不支持网络图片下载。
9. 推送消息支持静默推送(即无声音、无灯光、无振动)吗?
支持,可以在构建消息时调用notifyType(Integer type)方法,将type设置成0即可。
notifyType表示设置通知类型, type类型支持以下值:
- 1:使用默认提示音提示
- 2:使用默认振动提示
- 4:使用默认呼吸灯提示
- -1(系统默认值):以上三种效果都有
- 0:以上三种效果都无,即静默推送。
并且支持1,2,4的任意OR运算来实现声音、振动和呼吸灯的任意组合。
10. timeToLive最大时长为多少?
timeToLive表示消息的生命周期, 若用户离线, 设置消息在服务器保存的时间, 单位: ms,服务器默认最长保留10天。
11. 如何开启/关闭app在前台时的通知弹出?
应用在前台的情况下,通知消息到达客户端后是否弹出通知可以通过服务端来设置。服务端调用Message.Builder类的extra(String key, String value)方法将EXTRA_PARAM_NOTIFY_FOREGROUND的值设置为"0"或者"1"。 当EXTRA_PARAM_NOTIFY_FOREGROUND值为”1″时,app会弹出通知栏消息; 当EXTRA_PARAM_NOTIFY_FOREGROUND值为”0″时,app不会弹出通知栏消息。 注:默认情况下会弹出通知栏消息。
示例:
Message message = new Message.Builder()
.title(title)
.description(description).payload(messagePayload)
.restrictedPackageName(MY_PACKAGE_NAME)
.notifyType(1)
.extra(Constants.EXTRA_PARAM_NOTIFY_FOREGROUND, "0")
.build();
12. 如何理解消息回执中的barStatus参数?
barStatus表示用户是否允许该app的消息在通知栏展示。barStatus的值只和用户本地的配置有关系。用户设置允许app弹出通知,返回Enable;用户设置不允许app弹出通知,返回Disable;本地获取状态出现异常时,返回Unknown。Disable时,如果有消息到达,不会显示通知;Enable时, 如果有消息到达,会显示通知。
13. 使用推送运营平台发送消息时,如何设置notifyId?
可以在“通知分类”输入框里设置。
14. 收到回调:onCommandResult: command={Registration}, resultCode={70000001}, reason={ the push is not connected.}, category={null}, commandArguments={null}
该errorCode一般是由于网络问题导致的,请先确认设备网络是否正常,网络是否使用代理。另外,修改系统时间也会导致上述错误。可通过设备浏览器登录如下链接来确认设备网络及设置是否正常:
国内:https://api.xmpush.xiaomi.com/_x/monitor/status
海外:https://api.xmpush.global.xiaomi.com/_x/monitor/status
五、推送统计数据问题
1. 计划推送数是指什么?怎么计算的?
计划推送数是指推送请求所覆盖的所有的设备数,如果目标对象的选取是所有用户,那分母就是历史上所有激活过推送服务的有效设备数;如果是按照标签选取的,那分母是历史上所有订阅过这个标签的有效设备数;如果是按照别名或者regID来选取,那么分母就是所请求的所有合法的别名或regID。
2.设备有效性的判定规则:
如果应用调用了unregisterPush,或者在MIUI上卸载了,或者超过30天都没有和小米服务器建立过长连接,则会判定设备失效。
3. 为什么在数据统计后台看,按天统计中,会出现计划推送少于送达数的现象?
这是正常现象,在按天统计中,计划推送是指当天的所有请求总共覆盖了多少设备数,而送达数则是当天这个app所有的送达,因此这个送达数不但包括当天发的消息送达了多少,也包括了之前发的消息,作为离线消息当天抵达设备的数量。因此这个送达数是存在大于计划推送数的可能性的。
4. 如何查询统计数据:
4.1、使用服务端SDK中的数据API(详情见《服务端Java SDK文档》5.获取统计数据)直接拉取统计数据,可方便地与开发者现有的统计系统结合;
4.2、登录开发者站,进入应用的推送服务查看推送统计数据;
5. 从计划推送量到实际下发量再到送达量会有一定比例的损耗,如何降低这个损耗?
开发者可以通过消息回执获取无效设备,在推送总量里剔除这部分设备,也可以自行维护有效设备集合,减少发送的设备里存在过多取消注册或无效的设备。(详情见《服务端Java SDK文档》4.6.消息回执)
还有没解决的问题?
->小米推送工单系统