Titanium 使用rpush 实现ios端消息推送

rpush github文档中介绍了rpush安装使用的方法,现将步骤整理一下,并对某些环节进行说明:

一、服务器端设置

1.将 rpush加入到Gemfile中:

 gem 'rpush'
$ bundle install

2.打开项目,执行rpush init 命令

$ cd /path/to/project
$ rpush init
$ bundle exec rake db:migrate

3.生成SSL证书(generate SSL certificates),可以参照外文文档或使用教程,然后将生成的.pem 文件存入项目的public下。

** 注意: 为了避免不必要的麻烦,请一定测试生成的证书是否有效!!! **

4.在seeds.rb文件中键入如下代码,用于将证书信息和app的信息存入rpush自动生成的数据表rpush_apps中:

app = Rpush::Apns::App.new
app.name = "app的包名"
# 将sandbox.pem 文件读入数据库
app.certificate = File.read("#{Rails.root}/public/sandbox.pem")
app.environment = "sandbox" # APNs environment. 
app.password = "certificate password"
app.connections = 1
app.save!

5.在需要触发信息推送的方法下添加如下代码,作用是将信息和设备token存入rpush_notifications表,当开启rpush守护进程时,rpush就会将信息发送到设备上:

n = Rpush::Apns::Notification.new
n.app = Rpush::Apns::App.find_by_name("app包名")
n.device_token = "..." # 64-character hex string
n.alert = "hi uubpay!"
n.data = { foo: :bar }
n.save!

6.通过执行migration命令创建apn_devices表,保存ios客户端发送过来的设备信息,例如:

class CreateApnDevices < ActiveRecord::Migration
  def change
    create_table :apn_devices do |t| 
      t.integer :user_id
      t.string :device_token
      t.boolean :active
      t.boolean :silent, :default=>false
      t.string :sid
      t.string :os 

      t.timestamps null: false
    end 
  end 
end

7.给ios客户端提供接口将设备信息保存到apn_devices表,用于设备订阅推送,例如:

#设备订阅推送
  def subscribe
    device = ApnDevice.find_by_device_token(params[:token])
      if !device
        device = ApnDevice.new(:device_token=>params[:token])
      end
      device.active = true
      if params[:id]
        user = User.find_by_id(params[:id])
        if user
          device.user_id = user.id        
        end
      else
        device.user_id = nil   
      end
      device.os = params[:os]  
      device.sid = params[:sid]
      device.save              

      render :text=>"ok"       
  end

routes.rb文件

resource :Users ,:only => [] do
      collection do
        get :subscribe 
      end
end

8.开启rpush守护进程

$ cd /path/to/project
$ bundle exec rpush start

二、ios端设置

var receive_ios_rpush;

receive_ios_rpush = function() {
  var registerForPush, subscribe;
  subscribe = function(e) {
    var url;
    url = Ti.App.host_url + '/interface/householders/subscribe?token=' + e.deviceToken;
    url += '&app=' + Ti.App.id;
    url += '&sid=' + Ti.Platform.id;
    url += '&id=' + Ti.App.Properties.getObject("householder_id", "").toString();
    http_call(url, function(f) {
      return Ti.API.log('subscribe success : ' + e.deviceToken);
    });
    return Ti.App.Properties.setString('ios_token', e.deviceToken);
  };
  registerForPush = function() {
    Ti.Network.registerForPushNotifications({
      success: subscribe,
      error: function(e) {
        Ti.API.warn('push notifications disabled(ios8): ' + e);
        return logEvent('push_notification_disable');
      },
      callback: function(e) {
        var alert_dialog;
        alert_dialog = Titanium.UI.createAlertDialog({
          title: '',
          message: e.data.alert,
          buttonNames: ['好的'],
          cancel: 0
        });
        return alert_dialog.show();
      }
    });
    return Ti.App.iOS.removeEventListener('usernotificationsettings', registerForPush);
  };
  Ti.App.iOS.addEventListener('usernotificationsettings', registerForPush);
  return Ti.App.iOS.registerUserNotificationSettings({
    types: [Ti.App.iOS.USER_NOTIFICATION_TYPE_ALERT, Ti.App.iOS.USER_NOTIFICATION_TYPE_SOUND, Ti.App.iOS.USER_NOTIFICATION_TYPE_BADGE]
  });
};

以上代码让应用安装时调用receive_ios_rpush方法,用于首次安装应用时弹出通知框让用户选择是否接受消息通知,接受则向苹果消息推送服务器发送订阅消息通知的请求,请求成功则调用subscribe方法,该方法用于将消息推送服务器返回来的deviceToken等设备信息通过http请求发送给我们的后台服务器。用于用户选择的弹出通知框只能在应用首次安装或卸载24小时(可能)后再次安装时弹出,但如果首次选择了接受推送服务,此后即使不弹出** 通知框 **也会调用subscribe方法.
**注意:使用模拟器是无法实现调用subscribe方法的,因此请一定用真机调试!!! **
赘述一点:如果想让通知框在短时间再次弹出,请做如下操作:

  • 卸载应用; Delete your app from the device.
  • 重启设备;Turn the device off completely and turn it back on.
  • 在系统的设置>通用> 日期和时间中将时间设为一天以后或更久;Go to Settings > General > Date & Time and set the date ahead a day or more.
  • 重启设备并重装应用。Turn the device off completely again and turn it back on.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容