[关闭]
@DefinedOne 2015-07-31T09:07:19.000000Z 字数 6783 阅读 1491

“个推”与“友盟推送”的比较——技术篇

android 消息推送 友盟 个推 比较



阅读本篇文章之前,请阅读:
“个推”与“友盟推送”的比较——概述篇

*导入jar包、配置AndroidManifest.xml的步骤请参考:
友盟 > 消息推送android文档 > 2.3.0 SDK集成指南

1、当前用到的友盟消息推送的类

  1. com.umeng.message.PushAgent;
  2. com.umeng.message.UmengMessageHandler;
  3. com.umeng.message.UmengRegistrar;
  4. com.umeng.message.entity.UMessage;

2、当前用到的友盟消息推送的方法

2.1、用到PushAgent类的方法

配置友盟消息推送:

  1. PushAgent mPushAgent = PushAgent.getInstance(mAppContext); // 获取PushAgent单例对象
  2. mPushAgent.enable(); // 开启推送服务

或者,添加回调。在其中获取RegistrationId。

  1. mPushAgent.enable(new IUmengRegisterCallback() {
  2. @Override
  3. public void onRegistered(String s) {
  4. String mRegistrationId = UmengRegistrar.getRegistrationId(context);
  5. }
  6. });

此外,mPushAgent.disable()关闭客户端的通知服务,mPushAgent.isEnabled()查询状态。

设置渠道号:

  1. mPushAgent.setMessageChannel(mAppChannel); // 设置渠道号

若同时在AndroidManifest.xml和代码设置了MessageChannel,则以代码设置的为准。
若在AndroidManifest.xml和代码里均没有设置,则使用Unknown作为Channel ID。
你可以使用20位以内的英文和数字为渠道定名(不要使用纯数字)。
友盟消息推送可以和友盟统计分析共用一个"Channel ID"字段。

  1. mPushAgent.setDebugMode(false); //设置调试模式
  2. mPushAgent.setMergeNotificaiton(false); // 合并多条通知的模式

设置消息处理方法:

  1. mPushAgent.setMessageHandler(mUmengMessageHandler); // 设置消息处理方法

统计应用启动数据:

  1. mPushAgent.onAppStart(); // 统计应用启动数据

统计应用启动数据,在BaseActivity.onCreate()中调用,即应用中的所有Activity启动时调用。如果不调用此方法,友盟会按照"几天不活跃"的判断条件不执行推送,导致推送失效。

2.2、用到UmengRegistrar类的方法

用于获取RegistrationId。
直接获取:

  1. String mRegistrationId = UmengRegistrar.getRegistrationId(context);

在enable()方法的回调中获取:

  1. mPushAgent.enable(new IUmengRegisterCallback() {
  2. @Override
  3. public void onRegistered(String s) {
  4. String mRegistrationId = UmengRegistrar.getRegistrationId(context);
  5. }
  6. });

RegistrationId为友盟生成的用于标识设备的id,长度为44位,不能定制和修改。同一台设备上每个应用对应的RegistrationId不一样;
获取RegistrationId的代码需要放在mPushAgent.enable()后面,注册成功以后调用才能获得RegistrationId;
如果返回值为空,说明设备还没有注册成功,需要等待几秒钟,同时请确保测试手机网络畅通。

2.3、用到UmengMessageHandler类的方法

处理通知消息的方法

  1. @Override public void dealWithNotificationMessage(Context context, UMessage message)

处理自定义消息的方法

  1. @Override public void dealWithCustomMessage(Context context, UMessage message)

该UmengMessageHandler是在IntentService中被调用。由于IntentService里的onHandleIntent方法是并不处于主线程中,因此,如果需调用到主线程,请参考demo。启动Activity需为Intent添加Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
此外,getNotification()方法可以自定义通知栏展示样式。

2.4、用到UMessage类的方法

获取消息携带的数据:

  1. String mUMessage.custom // 获取消息携带的数据,比如JSON数据

2.4.1、在控制台主动推送消息

*注意:开发测试时,一定要选择单设备推送,千万不要向所有用户推送测试的消息。

信息来自:友盟控制台推送“测试多设备登录”

如果要让客户端接受的消息含有如下数据:
  UMessage.custom 携带自定义数据的field:

  1. {"custom_value":"1"}

  UMessage.extra 携带透传(payload)数据的field

  1. {"key_1":"value_1"}

在友盟消息推送的控制台,推送测试消息的设置方法:

新建测试消息》通知》{
  消息描述:测试多设备登录5
  标题:当前账号在其他设备上登录
  内容:当前账号在其他设备上登录了……
  后续动作:自定义行为:数据:{"custom_value":"1"}
  自定义参数:Key:key_1,Value:value_1
  发送给:单播:Device Token:XXX_Device_Token
}
这样设置得到了“发送内容”为:

  1. {"appkey":"XXX_App_Key","production_mode":"false","description":" 测试多设备登录5","type":"unicast","payload":【{"extra": {"key_1":"value_1"}】,"display_type":"notification","body":{"title":"当前账号在 其他设备上登录","ticker":"当前账号在其他设备上登录","text":"当前账号在其他设备上登录 了……","after_open":"go_custom",【"custom":{"custom_value":"1"}】,"play_vibrate":"true","play_sound":"true","play_lights":"true"}},"policy":{"expire_time":"2015-07-24 15:43:43"},"device_tokens":"XXX_Device_Token"}

2.5、其他的类

用户点击通知消息之后的动作:

  1. com.umeng.message.UmengNotificationClickHandler

用户点击通知消息之后的动作:打开应用、打开指定网页、打开指定页面(Activity)、自定义行为。
该Handler是在BroadcastReceiver中被调用,启动Activity需为Intent添加Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。

3、友盟推送其他常用功能的实现技术

3.1、SDK休眠

为免过度打扰用户,SDK默认在“23:00”到“7:00”之间收到通知消息时不响铃,不振动,不闪灯。
如果需要改变SDK默认的静音时间,可以使用以下接口:

  1. mPushAgent.setNoDisturbMode(int startHour, int startMinute, int endHour, int endMinute)

例如:
mPushAgent.setNoDisturbMode(23, 0, 7, 0); //“23:00”到“7:00”

4、服务器接口

android:

  1. {
  2. "appkey":"xx", // 必填 应用唯一标识
  3. "timestamp":"xx", // 必填 时间戳,10位或者13位均可,时间戳有效期为10分钟
  4. "type":"xx", // 必填 消息发送类型,其值可以为:
  5. unicast-单播
  6. listcast-列播(要求不超过500device_token)
  7. filecast-文件播
  8. (多个device_token可通过文件形式批量发送)
  9. broadcast-广播
  10. groupcast-组播
  11. (按照filter条件筛选特定用户群, 具体请参照filter参数)
  12. customizedcast(通过开发者自有的alias进行推送),
  13. 包括以下两种case:
  14. - alias: 对单个或者多个alias进行推送
  15. - file_id: alias存放到文件后,根据file_id来推送
  16. "device_tokens":"xx", // 可选 设备唯一表示
  17. type=unicast时,必填, 表示指定的单个设备
  18. type=listcast时,必填,要求不超过500个,
  19. 多个device_token以英文逗号间隔
  20. "alias_type": "xx" // 可选 当type=customizedcast时,必填,alias的类型,
  21. alias_type可由开发者自定义,开发者在SDK
  22. 调用setAlias(alias, alias_type)时所设置的alias_type
  23. "alias":"xx", // 可选 当type=customizedcast时, 开发者填写自己的alias。
  24. 要求不超过50alias,多个alias以英文逗号间隔。
  25. SDK中调用setAlias(alias, alias_type)时所设置的alias
  26. "file_id":"xx", // 可选 当type=filecast时,file内容为多条device_token,
  27. device_token以回车符分隔
  28. type=customizedcast时,file内容为多条alias
  29. alias以回车符分隔,注意同一个文件内的alias所对应
  30. alias_type必须和接口参数alias_type一致。
  31. 注意,使用文件播前需要先调用文件上传接口获取file_id,
  32. 具体请参照"2.4文件上传接口"
  33. "filter":{}, // 可选 终端用户筛选条件,如用户标签、地域、应用版本以及渠道等,
  34. 具体请参考附录G
  35. "payload": // 必填 消息内容(Android最大为1840B), 包含参数说明如下(JSON格式):
  36. {
  37. "display_type":"xx", // 必填 消息类型,值可以为:
  38. notification-通知,message-消息
  39. "body": // 必填 消息体。
  40. display_type=message时,body的内容只需填写custom字段。
  41. display_type=notification时, body包含如下参数:
  42. {
  43. // 通知展现内容:
  44. "ticker":"xx", // 必填 通知栏提示文字
  45. "title":"xx", // 必填 通知标题
  46. "text":"xx", // 必填 通知文字描述
  47. // 自定义通知图标:
  48. "icon":"xx", // 可选 状态栏图标ID, R.drawable.[smallIcon],
  49. 如果没有, 默认使用应用图标。
  50. 图片要求为24*24dp的图标,或24*24px放在drawable-mdpi下。
  51. 注意四周各留1dp的空白像素
  52. "largeIcon":"xx", // 可选 通知栏拉开后左侧图标ID, R.drawable.[largeIcon].
  53. 图片要求为64*64dp的图标,
  54. 可设计一张64*64px放在drawable-mdpi下,
  55. 注意图片四周留空,不至于显示太拥挤
  56. "img": "xx", // 可选 通知栏大图标的URL链接。该字段的优先级大于largeIcon。
  57. 该字段要求以http或者https开头。
  58. // 自定义通知声音:
  59. "sound": "xx", // 可选 通知声音,R.raw.[sound].
  60. 如果该字段为空,采用SDK默认的声音, res/raw/下的
  61. umeng_push_notification_default_sound声音文件
  62. 如果SDK默认声音文件不存在,
  63. 则使用系统默认的Notification提示音。
  64. // 自定义通知样式:
  65. "builder_id": xx // 可选 默认为0,用于标识该通知采用的样式。使用该参数时,
  66. 开发者必须在SDK里面实现自定义通知栏样式。
  67. // 通知到达设备后的提醒方式
  68. "play_vibrate":"true/false", // 可选 收到通知是否震动,默认为"true".
  69. 注意,"true/false"为字符串
  70. "play_lights":"true/false", // 可选 收到通知是否闪灯,默认为"true"
  71. "play_sound":"true/false", // 可选 收到通知是否发出声音,默认为"true"
  72. // 点击"通知"的后续行为,默认为打开app。
  73. "after_open": "xx" // 必填 值可以为:
  74. "go_app": 打开应用
  75. "go_url": 跳转到URL
  76. "go_activity": 打开特定的activity
  77. "go_custom": 用户自定义内容。
  78. "url": "xx", // 可选 当"after_open"为"go_url"时,必填。
  79. 通知栏点击后跳转的URL,要求以http或者https开头
  80. "activity":"xx", // 可选 当"after_open"为"go_activity"时,必填。
  81. 通知栏点击后打开的Activity
  82. "custom":"xx"/{} // 可选 display_type=message, 或者
  83. display_type=notification
  84. "after_open""go_custom"时,
  85. 该字段必填。用户自定义内容, 可以为字符串或者JSON格式。
  86. },
  87. extra: // 可选 用户自定义key-value。只对"通知"
  88. (display_type=notification)生效。
  89. 可以配合通知到达后,打开App,打开URL,打开Activity使用。
  90. {
  91. "key1": "value1",
  92. "key2": "value2",
  93. ...
  94. }
  95. },
  96. "policy": // 可选 发送策略
  97. {
  98. "start_time":"xx", // 可选 定时发送时间,若不填写表示立即发送。
  99. 定时发送时间不能小于当前时间
  100. 格式: "YYYY-MM-DD HH:mm:ss"
  101. 注意, start_time只对任务生效。
  102. "expire_time":"xx", // 可选 消息过期时间,其值不可小于发送时间或者
  103. start_time(如果填写了的话),
  104. 如果不填写此参数,默认为3天后过期。格式同start_time
  105. "max_send_num": xx // 可选 发送限速,每秒发送的最大条数。
  106. 开发者发送的消息如果有请求自己服务器的资源,可以考虑此参数。
  107. "out_biz_no": "xx" // 可选 开发者对消息的唯一标识,服务器会根据这个标识避免重复发送。
  108. 有些情况下(例如网络异常)开发者可能会重复调用API导致
  109. 消息多次下发到客户端。如果需要处理这种情况,可以考虑此参数。
  110. 注意, out_biz_no只对任务生效。
  111. },
  112. "production_mode":"true/false" // 可选 正式/测试模式。测试模式下,只会将消息发给测试设备。
  113. 测试设备需要到web上添加。
  114. Android: 测试设备属于正式设备的一个子集。
  115. "description": "xx" // 可选 发送消息描述,建议填写。
  116. "thirdparty_id": "xx" // 可选 开发者自定义消息标识ID, 开发者可以为同一批发送的多条消息
  117. 提供同一个thirdparty_id, 便于友盟后台后期合并统计数据。
  118. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注