Module: APNS

Defined in:
lib/apns/core.rb,
lib/apns/device.rb,
lib/apns/payload.rb

Defined Under Namespace

Classes: Device, Payload, PemFileError, PemPathError

Constant Summary collapse

@@ssl =

Persistent connection

{}
@@sock =
{}

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.feedback_hostObject

Returns the value of attribute feedback_host.



38
39
40
# File 'lib/apns/core.rb', line 38

def feedback_host
  @feedback_host
end

.feedback_portObject

Returns the value of attribute feedback_port.



38
39
40
# File 'lib/apns/core.rb', line 38

def feedback_port
  @feedback_port
end

.hostObject

Returns the value of attribute host.



38
39
40
# File 'lib/apns/core.rb', line 38

def host
  @host
end

.portObject

Returns the value of attribute port.



38
39
40
# File 'lib/apns/core.rb', line 38

def port
  @port
end

Class Method Details

.feedback(stream = :_global) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/apns/core.rb', line 115

def self.feedback(stream = :_global)
  sock, ssl = self.feedback_connection(stream)
  
  apns_feedback = []
  
  while line = sock.gets   # Read lines from the socket
    line.strip!
    f = line.unpack('N1n1H140')
    apns_feedback << [Time.at(f[0]), f[2]]
  end
  
  ssl.close
  sock.close
  
  return apns_feedback
end

.pass(stream = :_global, new_pass = nil) ⇒ Object



45
46
47
48
# File 'lib/apns/core.rb', line 45

def pass(stream = :_global, new_pass = nil)
  @pass[stream] = new_pass if new_pass
  @pass[stream]
end

.pass=(new_pass) ⇒ Object



49
# File 'lib/apns/core.rb', line 49

def pass=(new_pass); @pass[:_global] = new_pass; end

.pem(stream = :_global, new_pem = nil) ⇒ Object



39
40
41
42
# File 'lib/apns/core.rb', line 39

def pem(stream = :_global, new_pem = nil)
  @pem[stream] = new_pem if new_pem
  @pem[stream]
end

.pem=(new_pem) ⇒ Object



43
# File 'lib/apns/core.rb', line 43

def pem=(new_pem); @pem[:_global] = new_pem; end

.send(*payloads) ⇒ Object



110
111
112
# File 'lib/apns/core.rb', line 110

def self.send(*payloads)
  self.send_stream(:_global, payloads)
end

.send_payloads(*payloads) ⇒ Object



106
107
108
# File 'lib/apns/core.rb', line 106

def self.send_payloads(*payloads)
  self.send(payloads)
end

.send_stream(stream, *payloads) ⇒ Object

Send to a pem stream



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
99
100
101
102
103
104
# File 'lib/apns/core.rb', line 71

def self.send_stream(stream, *payloads)    
  payloads.flatten!
  
  # retain valid payloads only
  payloads.reject!{ |p| !(p.is_a?(APNS::Payload) && p.valid?) }
  
  return if (payloads.nil? || payloads.count < 1)
                  
  # loop through each payloads
  payloads.each do |payload|
    retry_delay = 2
    
    # !ToDo! do a better job by using a select to poll the socket for a possible response from apple to inform us about an error in the sent payload
    #
    begin
      @@sock[stream], @@ssl[stream] = self.push_connection(stream) if @@ssl[stream].nil?
      @@ssl[stream].write(payload.to_ssl); @@ssl[stream].flush
    rescue PemPathError, PemFileError => e
      raise e
    rescue
      @@ssl[stream].close; @@sock[stream].close
      @@ssl[stream] = nil; @@sock[stream] = nil # cleanup
      
      retry_delay *= 2
      if retry_delay <= 8
        sleep retry_delay
        retry
      else
        raise
      end
    end # begin block 

  end # each payloads
end