Class: Gcm::Notification
- Extended by:
- ActionView::Helpers::TextHelper
- Includes:
- ActionView::Helpers::TextHelper
- Defined in:
- lib/gcm_on_rails/app/models/gcm/notification.rb
Class Method Summary collapse
-
.send_notifications(notifications = Gcm::Notification.all(:conditions => {:sent_at => nil}, :joins => :device, :readonly => false)) ⇒ Object
Opens a connection to the Google GCM server and attempts to batch deliver an Array of notifications.
Class Method Details
.send_notifications(notifications = Gcm::Notification.all(:conditions => {:sent_at => nil}, :joins => :device, :readonly => false)) ⇒ Object
Opens a connection to the Google GCM server and attempts to batch deliver an Array of notifications.
This method expects an Array of Gcm::Notifications. If no parameter is passed in then it will use the following:
Gcm::Notification.all(:conditions => {:sent_at => nil})
As each Gcm::Notification is sent the sent_at column will be timestamped, so as to not be sent again.
This can be run from the following Rake task:
$ rake gcm:notifications:deliver
Below is sample successful response as received from Google servers when the format is JSON
response: 200; href="{\"message_id\":\"0:1349723376618187%d702725e98d39af3\"">multicast_id”:6085691036338669615,“success”:1,“failure”:0,“canonical_ids”:0,“results”:}“, :code=>200}
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/gcm_on_rails/app/models/gcm/notification.rb', line 31 def send_notifications(notifications = Gcm::Notification.all(:conditions => {:sent_at => nil}, :joins => :device, :readonly => false)) if configatron.gcm_on_rails.delivery_format and configatron.gcm_on_rails.delivery_format == 'plain_text' format = "plain_text" else format = "json" end unless notifications.nil? || notifications.empty? api_key = Gcm::Connection.open if api_key notifications.each do |notification| logger.info "notification = #{notification.inspect}" response = Gcm::Connection.send_notification(notification, api_key, format) logger.info "response = #{response.inspect}" if response[:code] == 200 if response[:message].nil? # TODO - Making this assumption might not be right. HTTP status code 200 does not really signify success # if Gcm servers returned nil for the message error = "success" elsif format == "json" error = "" = JSON.parse response[:message] success = ['success'] error = ['results'][0]['error'] if success == 0 elsif format == "plain_text" #format is plain text = response[:message] error = response[:message].split('=')[1] end case error when "MissingRegistration" ex = Gcm::Errors::MissingRegistration.new(response[:message]) logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}") notification.device.destroy when "InvalidRegistration" ex = Gcm::Errors::InvalidRegistration.new(response[:message]) logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}") notification.device.destroy when "MismatchedSenderId" ex = Gcm::Errors::MismatchSenderId.new(response[:message]) logger.warn(ex.) when "NotRegistered" ex = Gcm::Errors::NotRegistered.new(response[:message]) logger.warn("#{ex.message}, destroying gcm_device with id #{notification.device.id}") notification.device.destroy when "MessageTooBig" ex = Gcm::Errors::MessageTooBig.new(response[:message]) logger.warn(ex.) else notification.sent_at = Time.now notification.save! end elsif response[:code] == 401 raise Gcm::Errors::InvalidAuthToken.new() elsif response[:code] == 503 raise Gcm::Errors::ServiceUnavailable.new() elsif response[:code] == 500 raise Gcm::Errors::InternalServerError.new() end end end end end |