魅族推送平台接入文档 (Push-Demo)

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "魅族推送平台接入文档 (Push-Demo)"

Transcription

1 魅族推送平台接入文档 (Push-Demo)

2 文档变更记录 日期作者版本变更描述 廖金龙 V 撰写文档 去除第三方依赖, 不再依赖其 他任何第三方库 ; 廖金龙 V jecter 暂停使用, 请下载 PushSDK aar 本地引用, 具体可 以参考 pushdemo 的 libs 目录 删除 https 无用代码 ; 解决 deviceid 无法获取导致无 廖金龙 V 法订阅的问题 ; 删除无用权限声明 ; PushSDK 下载 Jcenter 下载 2

3 目录 概述 应用背景 设计思想 魅族云推送集成说明 准备工作 pushsdk 引用配置说明 必要的配置 兼容 flyme5 以下版本推送兼容配置 注册消息接收 Receiver 实现自有的 PushReceiver, 实现消息接收, 注册与反注册回调 PushManager 接口说明 订阅接口 反订阅接口 通知栏和透传消息开关状态转换 检查通知栏和透传消息开关状态 标签订阅 取消标签订阅 获取标签订阅列表 别名订阅 取消别名订阅 获取别名

4 获取 pushid 通知栏消息扩展功能使用说明 打开应用的主界面并获取推送消息参数 打开某个应用某个页面时, 获取推送消息参数 参数配置说明 页面名称 参数与值 打开 URI 自定义通知栏小图标 兼容 Flyme 低版本推送 兼容说明 兼容 Flyme3.0 等低版本推送服务 增加权限声明配置 增加 PushReceiver Action 声明 实现 onmessage 接收推送消息 消息接入流程 反馈与建议 配置类问题 网络问题 魅族手机未发布问题 日志分析 aar 引用问题

5 6.6 push 服务收到推送但是应用无法收到消息

6 概述 如果你对 pushsdk 的实现原理感兴趣, 请点击这里 PushSDK 第三方设计实践, 另外这个工程也提供的源码, 有兴趣的同学可以 star 一下! 1. 应用背景 app 为了及时获取到服务器端的消息更新, 一般会采用轮寻或者推送的方式来获取消息更新, 轮寻导致终端设备流量 电量 等系统资源严重浪费, 所以目前采用的比较广泛的是推送的方式, 目前 Meizu 的 PushSDK 不能脱离 FlymeOS 存在, 当该 SDK 脱离 FlymeOS 之后由于没有长链接导致不能正常收到推送消息 本 SDK 首先要解决的时长链接由 SDK 自己维护, 同时还要解决的就是多个 app 引用同一个 SDK 时长链接的复用问题 2. 设计思想 该 SDK 以 Android Service 方式运行, 独占一个进程, 该 Service 自己维护与推送服务器的长链接 如果一款手机安装了多个集成了 SDK 的手机应用, 则只有一个 service 实例运行, 不会每个应用都会开启一个后台 service, 而是采用多个应用共享一个 Push 通道的方式, 这就解决了长链接复用的问题, 节省了对流量 电量的浪费 使用该 SDK 只需要关心 PushManager 提供的 API, 与 MzPushMessageReceiver 提供的回调接口以及相应的配置即可 3. 魅族云推送集成说明 3.1 准备工作 PushSDK3.0 以后的版本使用了最新的魅族插件发布 aar 包, 因此大家可以直接引用 aar 包 ; 对于一些通用的权限配置, 工程混淆, 应用可以不再配置了, 现在你只需要在你的应用中配置相应的消息接受的 rceiver 6

7 3.2 pushsdk 引用配置说明 NOTE: 我们已经将 pushsdk 发布到 jcenter, 你只需如下配置即可 对内版本配置如下 : dependencies { compile NOTE: 指定编译下载 aar, 不默认使用 jar; 如果你需要使用 jar, 请参考 Eclipse_PushDemo 接入方式 NOTE: 如果由于各种原因不能使用 jcenter 依赖, 还可以从以下链接下载 sdk 相关支持包下载地址 push-sdk-github 3.3 必要的配置 兼容 flyme5 以下版本推送兼容配置 <!-- 兼容 flyme5.0 以下版本, 魅族内部集成 pushsdk 必填, 不然无法收到消息 --> <uses-permission android:name="com.meizu.flyme.push.permission.receive"></uses-permission> <permission android:name=" 包名.push.permission.MESSAGE" android:protectionlevel="signature"/> <uses-permission android:name=" 包名.push.permission.MESSAGE"></usespermission> <!-- 兼容 flyme3.0 配置权限 --> <uses-permission android:name="com.meizu.c2dm.permission.receive" /> <permission android:name=" 你的包名.permission.C2D_MESSAGE" android:protectionlevel="signature"></permission> <uses-permission android:name=" 你的包名.permission.C2D_MESSAGE"/> 注册消息接收 Receiver <!-- push 应用定义消息 receiver 声明 --> <receiver android:name=" 包名.MyPushMsgReceiver"> <intent-filter> <!-- 接收 push 消息 --> <action android:name="com.meizu.flyme.push.intent.message" /> 7

8 <!-- 接收 register 消息 --> <action android:name="com.meizu.flyme.push.intent.register.feedback" /> <!-- 接收 unregister 消息 --> <action android:name="com.meizu.flyme.push.intent.unregister.feedback"/> <!-- 兼容低版本 Flyme3 推送服务配置 --> <action android:name="com.meizu.c2dm.intent.registration" /> <action android:name="com.meizu.c2dm.intent.receive" /> <category android:name=" 包名 "></category> </intent-filter> </receiver> NOTE: 包名填写你配置的的 pushreceiver 所在包名即可! 实现自有的 PushReceiver, 实现消息接收, 注册与反注册回调 public class MyPushMsgReceiver extends MzPushMessageReceiver public void onregister(context context, String pushid) { // 应用在接受返回的 pushid public void onmessage(context context, String s) { // public void onunregister(context context, boolean b) { // 调用 PushManager.unRegister(context) 方法后, 会在此回调反注册状态 // 设置通知栏小图标 public PushNotificationBuilder onupdatenotificationbuilder(pushnotificationbuilder pushnotificationbuilder) { 8

9 pushnotificationbuilder.setmstatusbaricon(r.drawable.mz_push_notification_s mall_icon); public void onpushstatus(context context,pushswitchstatus pushswitchstatus) { // 检查通知栏和透传消息开关状态回调 public void onregisterstatus(context context,registerstatus registerstatus) { Log.i(TAG, "onregisterstatus " + registerstatus); // 新版订阅回调 public void onunregisterstatus(context context,unregisterstatus unregisterstatus) { Log.i(TAG,"onUnRegisterStatus "+unregisterstatus); // 新版反订阅回调 public void onsubtagsstatus(context context,subtagsstatus subtagsstatus) { Log.i(TAG, "onsubtagsstatus " + subtagsstatus); // 标签回调 public void onsubaliasstatus(context context,subaliasstatus subaliasstatus) { Log.i(TAG, "onsubaliasstatus " + subaliasstatus); // 别名回调 public void onnotificationarrived(context context, String title, String content, String selfdefinecontentstring) { // 通知栏消息到达回调 DebugLogger.i(TAG,"onNotificationArrived title "+title + "content "+content + " selfdefinecontentstring "+selfdefinecontentstring); 9

10 public void onnotificationclicked(context context, String title, String content, String selfdefinecontentstring) { // 通知栏消息点击回调 DebugLogger.i(TAG,"onNotificationClicked title "+title + "content "+content + " selfdefinecontentstring "+selfdefinecontentstring); public void onnotificationdeleted(context context, String title, String content, String selfdefinecontentstring) { // 通知栏消息删除回调 ;flyme6 以上不再回调 DebugLogger.i(TAG,"onNotificationDeleted title "+title + "content "+content + " selfdefinecontentstring "+selfdefinecontentstring); Note: 至此 pushsdk 已经集成完毕, 现在你需要在你的 Application 中调用新版的 register 方法, 并在你的 Receiver 中成功回调 onregisterstatus(registerstatus registerstatus) 方法就可以了, 你现在可以到新版 Push 平台找到你的应用推送消息就可以了 ; 以下内容是 pushsdk 提供的 api 汇总, 具体功能详见 api 具体说明, 请根据需求选用合适的功能 3.4 PushManager 接口说明 订阅接口 接口说明 : context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key * 使用说明 : 可在应用启动时调用此方法, 例如在 Application.onCreate() 调用即可 10

11 public static void register(context context,string appid,string appkey); 对应 Receiver 中的回调方法 : public void onregisterstatus(context context,registerstatus registerstatus) { 反订阅接口 接口说明 : context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key * 使用说明 : 如果你不想接收任何推送, 可以取消订阅关系, 此时你将无法收到透传消息和通知栏消息 public static void unregister(context context,string appid,string appkey); 对应 Receiver 中的回调方法 : public void onunregisterstatus(context context,unregisterstatus unregisterstatus) { 通知栏和透传消息开关状态转换 接口说明 : appid * push 平台申请的应用 id appkey * push 平台申请的应用 key pushid * 注册成功后返回的 pushid pushtype * 接收的消息类型,0: 通知栏消息 1: 透传消息 11

12 switcher * 修改 push 类型开关状态 * 使用说明 : 此方法最好只有在用户需要打开或关闭消息时调用, 不要频繁调用 ; 当你第一次 register 成功后, 通知栏消息和透传消息已经默认打开 public static void switchpush(context context,string appid,string appkey,string pushid,int pushtype,boolean switcher); 对应 Receiver 中的回调方法 : public void onpushstatus(context context,pushswitchstatus pushswitchstatus) { 检查通知栏和透传消息开关状态 接口说明 : * 检查通知栏和透传消息开关状态 appid * push 平台申请的应用 id appkey * push 平台申请的应用 key pushid * 注册成功后返回的 pushid * * 结果会在你所实现的 receiver 的 oncheckpush 中返回 public static void checkpush(context context,string appid,string appkey,string pushid); 对应 Receiver 中的回调方法 : public void onpushstatus(context context,pushswitchstatus pushswitchstatus) { 标签订阅 接口说明 : * 标签订阅 12

13 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key tags * 多个标签逗号隔离 public static void subscribetags(context context,string appid,string appkey,string pushid,string tags); 对应 Receiver 中的回调方法 : public void onsubtagsstatus(context context,subtagsstatus subtagsstatus) { Log.i(TAG, "onsubtagsstatus " + subtagsstatus); // 标签回调 取消标签订阅 接口说明 : * 取消标签订阅 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key tags * 多个标签逗号隔离 public static void unsubscribetags(context context, String appid, String appkey, String pushid,string tags); 对应 Receiver 中的回调方法 : public void onsubtagsstatus(context context,subtagsstatus subtagsstatus) { Log.i(TAG, "onsubtagsstatus " + subtagsstatus); // 标签回调 获取标签订阅列表 13

14 接口说明 : * 获取标签订阅列表 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key public static void checksubscribetags(context context,string appid,string appkey,string pushid); 对应 Receiver 中的回调方法 : public void onsubtagsstatus(context context,subtagsstatus subtagsstatus) { Log.i(TAG, "onsubtagsstatus " + subtagsstatus); // 标签回调 别名订阅 接口说明 * 别名订阅 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key pushid * 注册成功后返回的 pushid alias * 别名 public static void subscribealias(context context,string appid,string appkey,string pushid,string alias); 对应 Receiver 中的回调方法 : public void onsubaliasstatus(context context,subaliasstatus subaliasstatus) { Log.i(TAG, "onsubaliasstatus " + subaliasstatus); 14

15 3.4.9 取消别名订阅 接口说明 : * 取消别名订阅 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key pushid * 注册成功后返回的 pushid alias * 别名 public static void unsubscribealias(context context,string appid,string appkey,string pushid,string alias); 对应 Receiver 中的回调方法 : public void onsubaliasstatus(context context,subaliasstatus subaliasstatus) { Log.i(TAG, "onsubaliasstatus " + subaliasstatus); 获取别名 接口说明 : * 获取别名 context appid * push 平台申请的应用 id appkey * push 平台申请的应用 key pushid * 注册成功后返回的 pushid public static void checksubscribealias(context context,string appid,string appkey,string pushid) 对应 Receiver 中的回调方法 : 15

16 public void onsubaliasstatus(context context,subaliasstatus subaliasstatus) { Log.i(TAG, "onsubaliasstatus " + subaliasstatus); 获取 pushid 接口说明 : * 根据应用包名获取 pushid context 如果该包名没有注册, 则默认返回为 null public static String getpushid(context context); 4. 通知栏消息扩展功能使用说明 4.1 打开应用的主界面并获取推送消息参数 在 push 平台选择打开应用主界面, 推送完消息后, 手机端收到通知栏消息, 应用点击通知栏会跳转到应用的主界面, 此时你在 push 平台配置的参数与值 将通过 intent 传递给你, 你可以通过以下代码获取值 String value = getintent().getstringextra("key") 通过在 push 平台上配置的参数, 获取其 value 值, 这里的 key 值就是你在 push 平台上配置 的键值 4.2 打开某个应用某个页面时, 获取推送消息参数 打开应用某个页面, 实际通过你在 push 平台配置的页面名称, 参数 keyvalue 组建 intent 的方式传递给应用如下是通过应用包名 +activity 名称 + 参 数组建 Intent 的部分代码 : String intenturi = "intent:#intent;component="+ 应用包名 +"/"+AndroidManifest 配置 activity 的名称 +(TextUtils.isEmpty(key)? ";" : ";"+Value)+"end"; try { intent = Intent.parseUri(intentUri,Intent.URI_INTENT_SCHEME); catch (URISyntaxException e) { e.printstacktrace(); 16

17 4.3 参数配置说明 页面名称 Push 平台中页面名称实际为 : 应用要打开的 Activity 名称, 即是相对应用的包名的 Activity 名称, 如下一段配置 : <manifest xmlns:android=" package=" 你的包名 "> <application android:allowbackup="true" > <activity android:name=".testacitivity"> </activity> </application> </manifest> 比如你要打开应用下面的 TestActivity 这个页面,Push 平台页面这个选项就填写.TestAcitivity,pushSDK 就会根据这个名称组建该页面的完整路径 : 应用包名.TestAcitivity; 这样当你点击通知栏时就会打开你配置的页面了 Note: 更为简洁的做法是将该 activity 的全路径全部写出来如下 : (com.meizu.cloud.setting.loginacitivity) 参数与值 在 push 平台上配置的参数, 是以 key-value 的方式传递给 pushsdk, 当 pushsdk 收到通知后会组建参数通过 Intent 传递给应用的相关界面, 应用可通过下面的方法逐一获取相应的 value 值 : String value = getintent().getstringextra("push 平台配置的键值 ") 通过在 push 平台上配置的参数, 获取其 value 值, 这里的 key 值就是你在 push 平台上配置的键值 4.4 打开 URI 17

18 当你 push 平台选取了打开网页这个选项, 并配置的 URL 地址, 当 pushsdk 收到消息后就会弹出通知栏, 当你点击后会跳转到默认设置的组件处理当前的 URI 4.5 自定义通知栏小图标 PushSDK 加入了通知栏状态栏小图标自定义的功能, 需要在配置的的 pushreceiver 中覆盖如下的方法 : * 获取 smallicon public void onupdatenotificationbuilder(pushnotificationbuilder pushnotificationbuilder){ // 设置通知栏弹出的小图标 pushnotificationbuilder.setmstatusbaricon(r.drawable.mz_push_notification_s mall_icon); ; Note: Flyme6 新的通知栏中心需要按照名称来获取状态栏 Icon, 你需要在相应的 drawable 不同分辨率文件夹下放置一个名称为 mz_push_notification_small_icon 的状态栏图标文件, 请确保名称正确, 否则将无法正确显示你应用的状态栏图标 5. 兼容 Flyme 低版本推送 5.1 兼容说明 云服务经历几次大的变更, 从之前的 C2DM, 到现在可以完全脱离 Flyme 平台作为一种完全开放给第三方应用的 SDK, 在这个阶段出现多种集成方式, 给以后的应用集成带来极大的困扰, 魅族 PushSDK 极力在减少 Flyme 版本迭代给应用集成带来的麻烦, 但应用还是需要做细小的更改才能做到与低版本 Flyme 的兼容 18

19 5.2 兼容 Flyme3.0 等低版本推送服务 增加权限声明配置 <uses-permission android:name="com.meizu.c2dm.permission.receive" /> <permission android:name=" 你的应用包名.permission.C2D_MESSAGE" android:protectionlevel="signature"></permission> <uses-permission android:name=" 你的应用包名.permission.C2D_MESSAGE"/> 增加 PushReceiver Action 声明 <action android:name="com.meizu.c2dm.intent.registration" /> <action android:name="com.meizu.c2dm.intent.receive" /> 一个完整的兼容 Flyme3.0 推送的 Receiver 配置如下 : <!-- push 应用定义消息 receiver 声明 --> <receiver android:name="your.package.pushmsgreceiver"> <intent-filter> <!-- 接收 push 消息 --> <action android:name="com.meizu.flyme.push.intent.message" /> <!-- 接收 register 消息 --> <action android:name="com.meizu.flyme.push.intent.register.feedback"/> <!-- 接收 unregister 消息 --> <action android:name="com.meizu.flyme.push.intent.unregister.feedback"/> <!-- 兼容低版本 Flyme 推送服务配置 --> <action android:name="com.meizu.c2dm.intent.registration" /> <action android:name="com.meizu.c2dm.intent.receive" /> <category android:name=" 你的应用包名 "></category> </intent-filter> </receiver> 实现 onmessage 接收推送消息 PushMessageReceiver 覆盖 onmessage(context context,intent intent) 方法接收 Flyme3.0 平台 push 消息 详情参见下面的方法的说明 : * 收到推送消息的回调,Flyme4.0 以上版本, 或者云服务 5.0 以上版本通过此方法接收 Push 消息 context * context message 19

20 * 收到的推送消息 public abstract void onmessage(context context,string message); * 处理 flyme3.0 等以下平台的推送消息 context intent * flyme3.0 平台上默认是将透传的消息 json, 按照 key-value 的组合设置到 intent 中, 如果要获取相应的数据, 可以调用 intent.getextra(key) 方法获取 public void onmessage(context context,intent intent){ 消息接入流程 注意这里的 onmessage 方法参数不一样, 应用接收到消息后, 需要自己从 Intent 中自行获取推送的消息, 完整的流程如下 : 调用 Push 接口接口发送消息时, 消息体为一个正确 Json 字符串, 例如 : { "content": " 今日头像下载 app 狂送 100 元 ", "title": " 今日头条重大利好 ", "isdiscard": true, "clicktype": "1" 处理推送消息例如应用需要获取 content 字段的内容, 可以通过 intent 获取相应的内容, 完成代码如下 : public void onmessage(context context, Intent intent) { String content = intent.getstringextra("content"); Log.i(TAG,"flyme3 onmessage "+content); 6. 反馈与建议 问题汇总说明 : Push 服务收到推送消息, 但是应用不弹出通知栏应用如果正确接入 PushSDK, 且能收到 pushid 表明 Push 服务与应用连接正常, 有可能是应用 没有配置混淆, 导致 MzPushSDK 被混淆, 无法正确解析消息所致 20

21 6.1 配置类问题 现象 : android.content.activitynotfoundexception: Unable to find explicit activity class {com.meizu.mzbbs/com.meizu.mzbbs.ui.detailsactivity ; have you declared this activity in your AndroidManifest.xml? 原因 : 平台配置出现空格等特殊字符 activity 配置出错 6.2 网络问题 现象 : 接收不到推送 解决方案 : 请先确认你所连接的网络是外网还是内网, 你可以清除云服务的数据, 重新发起注册 6.3 魅族手机未发布问题 现象 : 注册成功, 收不到推送 原因分析 : 未发布的手机由于 Brand 字段不为 meizu, 导致注册的时候 push 任务手机为第三方手机, 其采用的就是 imei_sn 的方式注册, 返回的 pushid 即为 imei_sn_appid 解决方案 : 等待发布 Brand 更改为魅族, 或者直接使用 imei_sn 的推送方式 6.4 日志分析 日志地址 : /sdcard/android/data/pushsdk 6.5 aar 引用问题 出现 aar 最新包不生效, 删除 gradle cache 即可 : 删除 volley-gslb 兼容包 aar 本地缓存, 其他请求可自行选择目录删除 rm -rf ~/.gradle/caches/modules-2/files-2.1/com.meizu.gslb.volley 6.6 push 服务收到推送但是应用无法收到消息 21

22 现象 : 在熄屏状态下应用无法收到通知栏消息, 亮屏时能收到通知栏消息, 最新的 flyme 固件不会出现该问题 原因 : 系统问题, 熄屏状态下发起服务调用, 应用无响应, 最新的 flyme 固件不会出现该问题 22