Sha256: cfbba904b91681452499647384c4dfb4bf2d486cc5df178fb7944fec9c01b1e4

Contents?: true

Size: 1.58 KB

Versions: 4

Compression:

Stored size: 1.58 KB

Contents

require 'apnserver/payload'
require 'json'

module ApnServer
  
  class Notification
    include ApnServer::Payload
    
    attr_accessor :device_token, :alert, :badge, :sound, :custom
    
    def payload
      p = Hash.new
      [:badge, :alert, :sound, :custom].each do |k|
        p[k] = send(k) if send(k)        
      end
      create_payload(p)
    end
    
    def json_payload
      p = JSON.generate(payload)
      raise PayloadInvalid.new("Payload of #{p.size} is longer than 256") if p.size > 256
      p
    end
    
    def to_bytes
      json = json_payload
      [0, 0, device_token.size, device_token, 0, json.size, json].pack("ccca*cca*")
    end
    
    def self.valid?(payload)
      begin
        Notification.parse(payload)
      rescue RuntimeError
        false
      end
    end
    
    def self.parse(p)
      buffer = p.dup
      notification = Notification.new
      
      header = buffer.slice!(0, 3).unpack('ccc')
      if header[0] != 0 || header[1] != 0 || header[2] != 32
        raise RuntimeError.new("Header of notification is invalid: #{header.inspect}")
      end
      
      # parse token
      notification.device_token = buffer.slice!(0, 32).unpack('a*').first
      
      # parse json payload
      payload_len = buffer.slice!(0, 2).unpack('cc')
      result = JSON.parse(buffer.slice!(0, payload_len.last))
      
      ['alert', 'badge', 'sound'].each do |k|
        notification.send("#{k}=", result['aps'][k]) if result['aps'] && result['aps'][k]
      end
      result.delete('aps')
      notification.custom = result
      
      notification
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
bpoweski-apnserver-0.0.6 lib/apnserver/notification.rb
bpoweski-apnserver-0.0.7 lib/apnserver/notification.rb
bpoweski-apnserver-0.0.8 lib/apnserver/notification.rb
bpoweski-apnserver-0.0.9 lib/apnserver/notification.rb