class ApnsSimple::Notification

Constants

PAYLOAD_MAX_BYTESIZE

Attributes

error[RW]
error_code[RW]
error_message[RW]
payload[R]

Public Class Methods

new(options, custom_payload = {}) click to toggle source
# File lib/apns_simple/notification.rb, line 11
def initialize(options, custom_payload = {})
  token = options.fetch(:token)
  alert = options[:alert]
  badge = options[:badge]
  sound = options[:sound]
  content_available = options[:content_available]

  payload_hash = { aps: {} }
  payload_hash[:aps][:alert] = alert if alert
  payload_hash[:aps][:badge] = badge if badge
  payload_hash[:aps][:sound] = sound if sound
  payload_hash[:aps]['content-available'] = 1 if content_available
  payload_hash.merge! custom_payload

  token_item = pack_token_item(token)
  payload_item = pack_payload_item(payload_hash)
  frame = compose_frame(token_item, payload_item)
  @payload = pack_frame(frame)
end

Private Instance Methods

compose_frame(*args) click to toggle source
# File lib/apns_simple/notification.rb, line 37
def compose_frame(*args)
  args.compact.join
end
pack_frame(frame) click to toggle source
# File lib/apns_simple/notification.rb, line 33
def pack_frame(frame)
  [2, frame.bytesize, frame].pack('cNa*')
end
pack_payload_item(hash) click to toggle source
# File lib/apns_simple/notification.rb, line 45
def pack_payload_item(hash)
  json = hash.to_json.gsub(/\\u([\da-fA-F]{4})/) { |m| [$1].pack('H*').unpack('n*').pack('U*') }
  size = json.bytesize

  if size > PAYLOAD_MAX_BYTESIZE
    self.error = true
    self.error_message = "Payload size is #{size} bytes but maximum #{PAYLOAD_MAX_BYTESIZE} bytes allowed."
  end

  [2, size, json].pack('cna*')
end
pack_token_item(token) click to toggle source
# File lib/apns_simple/notification.rb, line 41
def pack_token_item(token)
  [1, 32, token.gsub(/[<\s>]/, '')].pack('cnH64')
end