为了配合移动 APP 产品方面的设计,先考虑在 APP 功能上,增加消息推送的功能。 能够做到即时消息的提醒,提升用户的活跃度和使用 APP 的粘性。 本篇介绍一下,在 Rails 后端项目中,如何对接信鸽的推送服务。
信鸽(XG Push)是一款专业的免费移动 App 推送平台,支持百亿级的通知/消息推送,秒级触达移动用户,现已全面支持 Android 和 iOS 两大主流平台。 信鸽推送平台是腾讯旗下的一个产品,相信在并发,可靠性和稳定性方面,经得住考验。
使用 QQ 号可以直接登录信鸽管理平台,相当于注册。登录后,可以创建应用,选择 iOS 还是 Android 平台。 目前,我们只做 iOS 平台,信鸽区分开发环境和测试环境,因此,需要创建两个应用。 应用创建完成之后,将开发相关同事的 QQ 号,添加进应用的管理员,这样其他人登录信鸽后,可以直接查看到应用了。 为了实现消息的推送,需要 iOS 开发者,制作证书,并上传至信鸽平台, 交由信鸽托管,以此来对接苹果的消息中心。 证书制作,请参考:iOS 证书设置指南
iOS 证书上传,并验证通过后,可以下载信鸽 iOS 客户端 SDK。 参考 iOS SDK 指南 ,编译 SDK 以嵌入应用。注册设备信息后,将设备的 Device Token,添加到信鸽里的测试设备 Token。
以上准备工作完成之后,将信鸽内创建的应用配置信息:Access ID 和 Secret Key,放入 Rails 的配置项内。
development: xinge_host: openapi.xg.qq.com xinge_api_url: http://openapi.xg.qq.com xinge_access_id: access_id xinge_secret_key: secret_key production: xinge_host: openapi.xg.qq.com xinge_api_url: http://openapi.xg.qq.com xinge_access_id: access_id xinge_secret_key: secret_key
下面列举几段代码,给单个设备 Push 消息通知。
Xinge 模块的 Base 基类,实现了对接信鸽接口的:配置和具体 API 的功能。
module Xinge class Base class << self # push 消息(包括通知和透传消息)给单个设备 def push_single_device(device_token, message, params = {}) params.merge!({ device_token: device_token, message: message, message_type: 1 }) send_request('push', 'single_device', params) end protected def send_request(type, method, params = {}) request_path = get_request_url(type, method) params.merge!({access_id: Settings.xinge_access_id, timestamp: Time.now.to_i}) # sort params and calculate sign params_string = params.sort.map{ |h| h.join('=') }.join sign_str = "POST#{Settings.xinge_host}#{request_path}#{params_string}#{Settings.xinge_secret_key}" sign = Digest::MD5.hexdigest(sign_str) params.merge!({ sign: sign }) begin request_url = "#{Settings.xinge_api_url}#{request_path}" reuqest_header = {'Content-Type' => 'application/x-www-form-urlencoded'} response = RestClient.post(request_url, params, reuqest_header) if response.present? result = JSON.parse(response) if result [result["ret_code"], result["err_msg"]] end end rescue => e puts e.response return false end end def get_request_url(type, method) "/v2/#{type}/#{method}" end end end end
Xinge 模块的 Ios 类,信鸽针对 iOS 设备的消息推送,接口上有部分特殊要求。如:消息结构体较 Android 复杂,需要指明是开发还是生产环境,消息的内容字节数限制等。
module Xinge class Ios < Base class << self def push_to_single_device(device_token, title, content) push_single_device(device_token, build_simple_message(title, content), environment_param) end protected def environment_param env_val = Rails.env.production? ? 1 : 2 { environment: env_val } end def build_simple_message(title, content) { aps: { alert: { title: title, body: content }, sound: 'default', badge: 5 } }.to_json end end end end
Xinge 模块的 Notification 类,实现的时,对接 APP 内部的具体业务。如:准备发送用户评论的消息内容等。
module Xinge class Notification class << self def reply_push(reply_id) reply = Reply.where(id: reply_id).first if reply.present? content = "#{reply.to_user.name}: 对您发表了新的评论,快去看看吧~" do_push(reply.to_user_id, content) end end def do_push(user_id, content) title = "APP名称" device = UserDevice.notification_device(user_id) if device.present? if device.is_ios? Xinge::Ios.push_to_single_device(device.device_token, title, content) else Xinge::Android.push_to_single_device(device.device_token, title, content) end end end end end end
参考链接
国内一位 Ruby 朋友写的库,值得参考:A Ruby portal for Tencent Xinge
本人写的一个 Grape Demo 项目,提交了对接信鸽的逻辑:xinge ios,android notification push logic
2015-05-06