bpoweski-apnserver 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.textile +58 -2
- data/VERSION +1 -1
- data/apnserver.gemspec +71 -0
- data/bin/apnsend +4 -0
- data/bin/apnserverd +3 -0
- data/bin/apnserverd.fedora.init +71 -0
- data/lib/apnserver/client.rb +1 -1
- data/lib/apnserver/protocol.rb +2 -2
- data/lib/apnserver/server.rb +1 -1
- data/lib/apnserver.rb +1 -0
- metadata +5 -3
- data/lib/apnserver/sender.rb +0 -6
data/README.textile
CHANGED
@@ -10,9 +10,13 @@ opening up and tearing down SSL connections reapeated. To solve this problem an
|
|
10
10
|
network server is introduced that queues are requests to the APN service and sends them via a
|
11
11
|
persistent connection.
|
12
12
|
|
13
|
+
h2. TODO
|
14
|
+
|
15
|
+
* Implement feedback service mechanism
|
16
|
+
* Investigate possible badge number issue
|
17
|
+
* Implement a robust logging mechanism for transactions
|
13
18
|
|
14
19
|
h2. APN Server Daemon
|
15
|
-
|
16
20
|
|
17
21
|
<pre>
|
18
22
|
<code>
|
@@ -66,6 +70,51 @@ Usage: apnsend [switches] (--b64-token | --hex-token) <token>
|
|
66
70
|
</code>
|
67
71
|
</pre>
|
68
72
|
|
73
|
+
To send a base64 encoded push notification via the command line execute the following:
|
74
|
+
|
75
|
+
<pre>
|
76
|
+
<code>
|
77
|
+
$ apnsend --server gateway.push.apple.com --port 2195 --pem key.pem \
|
78
|
+
--b64-token j92f12jh8lqcAwcOVeSIrsBxibaJ0xyCi8/AkmzNlk8= --sound default \
|
79
|
+
--alert Hello
|
80
|
+
</code>
|
81
|
+
</pre>
|
82
|
+
|
83
|
+
h2. Sending Notifications from Ruby
|
84
|
+
|
85
|
+
To configure the client to send to the local apnserverd process configure the ApnServer client with the following.
|
86
|
+
|
87
|
+
<pre>
|
88
|
+
<code>
|
89
|
+
# configured for a using the apnserverd proxy
|
90
|
+
ApnServer::Config.host = 'localhost'
|
91
|
+
ApnServer::Config.port = 22195
|
92
|
+
</code>
|
93
|
+
</pre>
|
94
|
+
|
95
|
+
To configure the client to send directly to Apple's push notification server, bypassing the apnserverd process configure the following.
|
96
|
+
|
97
|
+
<pre>
|
98
|
+
<code>
|
99
|
+
ApnServer::Config.pem = '/path/to/pem'
|
100
|
+
ApnServer::Config.host = 'gateway.push.apple.com'
|
101
|
+
ApnServer::Config.port = 2195
|
102
|
+
</code>
|
103
|
+
</pre>
|
104
|
+
|
105
|
+
Finally within we can send a push notification using the following code
|
106
|
+
|
107
|
+
<pre>
|
108
|
+
<code>
|
109
|
+
notification = ApnServer::Notification.new
|
110
|
+
notification.device_token = Base64.decode64(apns_token) # if base64 encoded
|
111
|
+
notification.alert = message
|
112
|
+
notification.badge = 1
|
113
|
+
notification.sound = 'default'
|
114
|
+
notification.push
|
115
|
+
</code>
|
116
|
+
</pre>
|
117
|
+
|
69
118
|
|
70
119
|
h2. Installation
|
71
120
|
|
@@ -76,7 +125,14 @@ To install apnserver execute the following gem command:
|
|
76
125
|
$ gem install bpoweski-apnserver --source http://gems.github.com
|
77
126
|
</code>
|
78
127
|
</pre>
|
79
|
-
|
128
|
+
|
129
|
+
Adding apnserver to your Rails application
|
130
|
+
|
131
|
+
<pre>
|
132
|
+
<code>
|
133
|
+
config.gem "bpoweski-apnserver", :lib => 'apnserver', :source => "http://gems.github.com"
|
134
|
+
</code>
|
135
|
+
</pre>
|
80
136
|
|
81
137
|
h2. License
|
82
138
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.14
|
data/apnserver.gemspec
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{apnserver}
|
8
|
+
s.version = "0.0.14"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Ben Poweski"]
|
12
|
+
s.date = %q{2009-09-17}
|
13
|
+
s.description = %q{A toolkit for proxying and sending Apple Push Notifications}
|
14
|
+
s.email = %q{bpoweski@3factors.com}
|
15
|
+
s.executables = ["apnsend", "apnserverd", "apnserverd.fedora.init"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"README.textile"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"README.textile",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"apnserver.gemspec",
|
24
|
+
"bin/apnsend",
|
25
|
+
"bin/apnserverd",
|
26
|
+
"bin/apnserverd.fedora.init",
|
27
|
+
"lib/apnserver.rb",
|
28
|
+
"lib/apnserver/client.rb",
|
29
|
+
"lib/apnserver/notification.rb",
|
30
|
+
"lib/apnserver/payload.rb",
|
31
|
+
"lib/apnserver/protocol.rb",
|
32
|
+
"lib/apnserver/server.rb",
|
33
|
+
"lib/apnserver/server_connection.rb",
|
34
|
+
"test/test_client.rb",
|
35
|
+
"test/test_helper.rb",
|
36
|
+
"test/test_notification.rb",
|
37
|
+
"test/test_payload.rb",
|
38
|
+
"test/test_protocol.rb"
|
39
|
+
]
|
40
|
+
s.homepage = %q{http://github.com/bpoweski/apnserver}
|
41
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
42
|
+
s.require_paths = ["lib"]
|
43
|
+
s.rubygems_version = %q{1.3.5}
|
44
|
+
s.summary = %q{Apple Push Notification Server}
|
45
|
+
s.test_files = [
|
46
|
+
"test/test_client.rb",
|
47
|
+
"test/test_helper.rb",
|
48
|
+
"test/test_notification.rb",
|
49
|
+
"test/test_payload.rb",
|
50
|
+
"test/test_protocol.rb"
|
51
|
+
]
|
52
|
+
|
53
|
+
if s.respond_to? :specification_version then
|
54
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
55
|
+
s.specification_version = 3
|
56
|
+
|
57
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
58
|
+
s.add_runtime_dependency(%q<eventmachine>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<daemons>, [">= 0"])
|
60
|
+
s.add_runtime_dependency(%q<json>, [">= 0"])
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<eventmachine>, [">= 0"])
|
63
|
+
s.add_dependency(%q<daemons>, [">= 0"])
|
64
|
+
s.add_dependency(%q<json>, [">= 0"])
|
65
|
+
end
|
66
|
+
else
|
67
|
+
s.add_dependency(%q<eventmachine>, [">= 0"])
|
68
|
+
s.add_dependency(%q<daemons>, [">= 0"])
|
69
|
+
s.add_dependency(%q<json>, [">= 0"])
|
70
|
+
end
|
71
|
+
end
|
data/bin/apnsend
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
|
4
|
+
require 'logger'
|
4
5
|
require 'getoptlong'
|
5
6
|
require 'rubygems'
|
6
7
|
gem 'bpoweski-apnserver'
|
@@ -8,6 +9,9 @@ require 'apnserver'
|
|
8
9
|
require 'base64'
|
9
10
|
require 'socket'
|
10
11
|
|
12
|
+
$logger = Logger.new(STDOUT)
|
13
|
+
|
14
|
+
|
11
15
|
def usage
|
12
16
|
puts "Usage: apnsend [switches] (--b64-token | --hex-token) <token>"
|
13
17
|
puts " --server <localhost> the apn server defaults to a locally running apnserverd"
|
data/bin/apnserverd
CHANGED
@@ -6,6 +6,8 @@ require 'rubygems'
|
|
6
6
|
require 'daemons'
|
7
7
|
require 'apnserver'
|
8
8
|
|
9
|
+
$logger = Logger.new(STDOUT)
|
10
|
+
|
9
11
|
def usage
|
10
12
|
puts "Usage: apnserverd [switches] --pem <path>"
|
11
13
|
puts " --bind-address [0.0.0.0] bind address of proxy"
|
@@ -58,6 +60,7 @@ opts.each do |opt, arg|
|
|
58
60
|
pem = arg
|
59
61
|
when '--daemon'
|
60
62
|
daemon = true
|
63
|
+
$logger = Logger.new('/var/log/apnserverd.log', 'weekly')
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#
|
3
|
+
# /etc/rc.d/init.d/apnserverd
|
4
|
+
# apnserverd This shell script takes care of starting and stopping
|
5
|
+
# the APN Server Proxy
|
6
|
+
#
|
7
|
+
# chkconfig: 345 20 80
|
8
|
+
# Author: Ben Poweski bpoweski@gmail.com
|
9
|
+
#
|
10
|
+
# Source function library.
|
11
|
+
. /etc/init.d/functions
|
12
|
+
|
13
|
+
NAME=apnserverd
|
14
|
+
APNSERVERD=/usr/bin/$NAME
|
15
|
+
PIDFILE=/var/run/$NAME.pid
|
16
|
+
|
17
|
+
if [ -f /etc/sysconfig/$NAME ]; then
|
18
|
+
. /etc/sysconfig/$NAME
|
19
|
+
fi
|
20
|
+
|
21
|
+
|
22
|
+
start() {
|
23
|
+
echo -n "Starting APN Server: "
|
24
|
+
if [ -f $PIDFILE ]; then
|
25
|
+
PID=`cat $PIDFILE`
|
26
|
+
echo $NAME already running: $PID
|
27
|
+
exit 2;
|
28
|
+
elif [ -f $PIDFILE ]; then
|
29
|
+
PID=`cat $PIDFILE`
|
30
|
+
echo $NAME already running: $PID
|
31
|
+
exit 2;
|
32
|
+
else
|
33
|
+
daemon $APNSERVERD $OPTIONS
|
34
|
+
RETVAL=$?
|
35
|
+
echo
|
36
|
+
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$NAME
|
37
|
+
return $RETVAL
|
38
|
+
fi
|
39
|
+
|
40
|
+
}
|
41
|
+
|
42
|
+
stop() {
|
43
|
+
echo -n "Shutting down APN Server: "
|
44
|
+
echo
|
45
|
+
kill `cat $PIDFILE`
|
46
|
+
echo
|
47
|
+
rm -f /var/lock/subsys/$NAME
|
48
|
+
rm -f $PIDFILE
|
49
|
+
return 0
|
50
|
+
}
|
51
|
+
|
52
|
+
case "$1" in
|
53
|
+
start)
|
54
|
+
start
|
55
|
+
;;
|
56
|
+
stop)
|
57
|
+
stop
|
58
|
+
;;
|
59
|
+
status)
|
60
|
+
status $NAME
|
61
|
+
;;
|
62
|
+
restart)
|
63
|
+
stop
|
64
|
+
start
|
65
|
+
;;
|
66
|
+
*)
|
67
|
+
echo "Usage: {start|stop|status|restart}"
|
68
|
+
exit 1
|
69
|
+
;;
|
70
|
+
esac
|
71
|
+
exit $?
|
data/lib/apnserver/client.rb
CHANGED
@@ -31,7 +31,7 @@ module ApnServer
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def write(notification)
|
34
|
-
|
34
|
+
$logger.info "[#{host}:#{port}] Device: #{notification.device_token.unpack('H*')} sending #{notification.json_payload}"
|
35
35
|
@ssl.write(notification.to_bytes)
|
36
36
|
end
|
37
37
|
|
data/lib/apnserver/protocol.rb
CHANGED
@@ -3,11 +3,11 @@ module ApnServer
|
|
3
3
|
|
4
4
|
def post_init
|
5
5
|
@address = Socket.unpack_sockaddr_in(self.get_peername)
|
6
|
-
|
6
|
+
$logger.debug "[#{address.last}:#{address.first}] CONNECT"
|
7
7
|
end
|
8
8
|
|
9
9
|
def unbind
|
10
|
-
|
10
|
+
$logger.debug "[#{address.last}:#{address.first}] DISCONNECT"
|
11
11
|
end
|
12
12
|
|
13
13
|
def receive_data(data)
|
data/lib/apnserver/server.rb
CHANGED
@@ -11,7 +11,7 @@ module ApnServer
|
|
11
11
|
|
12
12
|
def start!
|
13
13
|
EventMachine::run do
|
14
|
-
|
14
|
+
$logger.info "Starting APN Server on #{bind_address}:#{port}"
|
15
15
|
|
16
16
|
EM.start_server(bind_address, port, ApnServer::ServerConnection) do |s|
|
17
17
|
s.queue = @queue
|
data/lib/apnserver.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bpoweski-apnserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Poweski
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-17 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,7 @@ email: bpoweski@3factors.com
|
|
47
47
|
executables:
|
48
48
|
- apnsend
|
49
49
|
- apnserverd
|
50
|
+
- apnserverd.fedora.init
|
50
51
|
extensions: []
|
51
52
|
|
52
53
|
extra_rdoc_files:
|
@@ -55,14 +56,15 @@ files:
|
|
55
56
|
- README.textile
|
56
57
|
- Rakefile
|
57
58
|
- VERSION
|
59
|
+
- apnserver.gemspec
|
58
60
|
- bin/apnsend
|
59
61
|
- bin/apnserverd
|
62
|
+
- bin/apnserverd.fedora.init
|
60
63
|
- lib/apnserver.rb
|
61
64
|
- lib/apnserver/client.rb
|
62
65
|
- lib/apnserver/notification.rb
|
63
66
|
- lib/apnserver/payload.rb
|
64
67
|
- lib/apnserver/protocol.rb
|
65
|
-
- lib/apnserver/sender.rb
|
66
68
|
- lib/apnserver/server.rb
|
67
69
|
- lib/apnserver/server_connection.rb
|
68
70
|
- test/test_client.rb
|