apn 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.idea/.name +1 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/apn.iml +29 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/misc.xml +5 -0
- data/.idea/modules.xml +9 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/.idea/workspace.xml +630 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +74 -0
- data/Rakefile +1 -0
- data/apn.gemspec +27 -0
- data/bin/apn +90 -0
- data/lib/apn.rb +51 -0
- data/lib/apn/client.rb +85 -0
- data/lib/apn/config.rb +38 -0
- data/lib/apn/daemon.rb +85 -0
- data/lib/apn/feedback.rb +46 -0
- data/lib/apn/log.rb +20 -0
- data/lib/apn/notification.rb +34 -0
- data/lib/apn/railtie.rb +13 -0
- data/lib/apn/version.rb +3 -0
- metadata +153 -0
data/lib/apn/feedback.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module APN
|
2
|
+
class FeedbackItem
|
3
|
+
attr_accessor :timestamp, :token
|
4
|
+
|
5
|
+
def initialize(time, token)
|
6
|
+
@timestamp = time
|
7
|
+
@token = token
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Feedback
|
12
|
+
def initialize(options = {})
|
13
|
+
options[:host] ||= 'feedback.push.apple.com'
|
14
|
+
options[:port] ||= 2196
|
15
|
+
options[:password] ||= ''
|
16
|
+
|
17
|
+
@cert = options[:cert]
|
18
|
+
@password = options[:password]
|
19
|
+
@host = options[:host]
|
20
|
+
@port = options[:port]
|
21
|
+
|
22
|
+
@logger = APN::Log.new.write
|
23
|
+
end
|
24
|
+
|
25
|
+
def data
|
26
|
+
@logger.info 'Trying to get feedback from Apple push notification server...'
|
27
|
+
|
28
|
+
@feedback ||= receive
|
29
|
+
end
|
30
|
+
|
31
|
+
def receive
|
32
|
+
feedbacks = []
|
33
|
+
while f = client.feedback
|
34
|
+
feedbacks << f
|
35
|
+
end
|
36
|
+
|
37
|
+
@logger.info 'Feedback received!'
|
38
|
+
|
39
|
+
return feedbacks
|
40
|
+
end
|
41
|
+
|
42
|
+
def client
|
43
|
+
@client ||= APN::Client.new(host: @host, port: @port, cert: APN.config.cert_file, password: APN.config.cert_password)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/apn/log.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module APN
|
4
|
+
class Log
|
5
|
+
def initialize(options = {})
|
6
|
+
end
|
7
|
+
|
8
|
+
def write
|
9
|
+
@logger ||= set_logger
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_logger
|
13
|
+
@logger = Logger.new(@logfile) if logfile
|
14
|
+
end
|
15
|
+
|
16
|
+
def logfile
|
17
|
+
@logfile = APN.config.logfile
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module APN
|
2
|
+
class Notification
|
3
|
+
attr_accessor :badge, :alert, :sound, :content_available, :custom_properties, :device_token
|
4
|
+
|
5
|
+
def initialize(hash)
|
6
|
+
[:badge, :alert, :sound, :device_token, :content_available, :custom_properties].each do |k|
|
7
|
+
self.instance_variable_set("@#{k}".to_sym, hash[k]) if hash[k]
|
8
|
+
end
|
9
|
+
raise "Must provide device token: #{hash}" if self.device_token.nil?
|
10
|
+
self.device_token = self.device_token.delete(' ')
|
11
|
+
end
|
12
|
+
|
13
|
+
def payload
|
14
|
+
p = Hash.new
|
15
|
+
[:badge, :alert, :sound, :content_available].each do |k|
|
16
|
+
p[k.to_s.gsub('_','-').to_sym] = send(k) if send(k)
|
17
|
+
end
|
18
|
+
aps = {:aps => p}
|
19
|
+
aps.merge!(custom_properties) if custom_properties
|
20
|
+
aps
|
21
|
+
end
|
22
|
+
|
23
|
+
def json_payload
|
24
|
+
j = ActiveSupport::JSON.encode(payload)
|
25
|
+
raise "The payload #{j} is larger than allowed: #{j.length}" if j.size > 256
|
26
|
+
j
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_bytes
|
30
|
+
j = json_payload
|
31
|
+
[0, 0, 32, self.device_token, 0, j.bytesize, j].pack("cccH*cca*").force_encoding('ASCII-8BIT')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/apn/railtie.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module APN
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer "apn.setup" do |app|
|
4
|
+
|
5
|
+
APN.root = Rails.root
|
6
|
+
if Rails.env.development?
|
7
|
+
#APN.certificate_name = "apn_development.pem"
|
8
|
+
#APN.host = "gateway.sandbox.push.apple.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/apn/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: apn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Peter Hrbacik
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-12-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: redis
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.2.2
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.2.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: activesupport
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: daemons
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.1.6
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.1.6
|
94
|
+
description: APN is a lightweight Apple Push Notification daemon for Ruby on Rails.
|
95
|
+
APN works asynchronously using Redis and run as a daemon.
|
96
|
+
email:
|
97
|
+
- info@itrinity.com
|
98
|
+
executables:
|
99
|
+
- apn
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- .gitignore
|
104
|
+
- .idea/.name
|
105
|
+
- .idea/.rakeTasks
|
106
|
+
- .idea/apn.iml
|
107
|
+
- .idea/encodings.xml
|
108
|
+
- .idea/misc.xml
|
109
|
+
- .idea/modules.xml
|
110
|
+
- .idea/scopes/scope_settings.xml
|
111
|
+
- .idea/vcs.xml
|
112
|
+
- .idea/workspace.xml
|
113
|
+
- Gemfile
|
114
|
+
- LICENSE.txt
|
115
|
+
- README.md
|
116
|
+
- Rakefile
|
117
|
+
- apn.gemspec
|
118
|
+
- bin/apn
|
119
|
+
- lib/apn.rb
|
120
|
+
- lib/apn/client.rb
|
121
|
+
- lib/apn/config.rb
|
122
|
+
- lib/apn/daemon.rb
|
123
|
+
- lib/apn/feedback.rb
|
124
|
+
- lib/apn/log.rb
|
125
|
+
- lib/apn/notification.rb
|
126
|
+
- lib/apn/railtie.rb
|
127
|
+
- lib/apn/version.rb
|
128
|
+
homepage: http://github.com/itrinity/apn
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ! '>='
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
143
|
+
requirements:
|
144
|
+
- - ! '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 1.8.23
|
150
|
+
signing_key:
|
151
|
+
specification_version: 3
|
152
|
+
summary: Asynchronous Apple Push Notification daemon
|
153
|
+
test_files: []
|