wireframe-apn_on_rails 0.3.0.201302051600 → 0.3.0.20091216113551
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.
@@ -38,9 +38,13 @@ module APN # :nodoc:
|
|
38
38
|
|
39
39
|
# Raised when a notification message to Apple is longer than 256 bytes.
|
40
40
|
class ExceededMessageSizeError < StandardError
|
41
|
-
|
41
|
+
|
42
42
|
def initialize(message) # :nodoc:
|
43
|
-
super("The maximum size allowed for a notification payload is
|
43
|
+
super("The maximum size allowed for a notification payload is 256 bytes: '#{message}'")
|
44
|
+
@overage = message.size.to_i - 256
|
45
|
+
end
|
46
|
+
def overage
|
47
|
+
@overage
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
@@ -55,11 +59,7 @@ end
|
|
55
59
|
%w{ models controllers helpers }.each do |dir|
|
56
60
|
path = File.join(File.dirname(__FILE__), 'app', dir)
|
57
61
|
$LOAD_PATH << path
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
ActiveSupport::Dependencies.load_paths << path
|
63
|
-
ActiveSupport::Dependencies.load_once_paths.delete(path)
|
64
|
-
end
|
65
|
-
end
|
62
|
+
# puts "Adding #{path}"
|
63
|
+
ActiveSupport::Dependencies.load_paths << path
|
64
|
+
ActiveSupport::Dependencies.load_once_paths.delete(path)
|
65
|
+
end
|
@@ -13,7 +13,7 @@ class APN::Device < APN::Base
|
|
13
13
|
has_many :notifications, :class_name => 'APN::Notification'
|
14
14
|
|
15
15
|
validates_uniqueness_of :token
|
16
|
-
validates_format_of :token, :with =>
|
16
|
+
validates_format_of :token, :with => /^[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}\s[a-z0-9]{8}$/
|
17
17
|
|
18
18
|
before_save :set_last_registered_at
|
19
19
|
|
@@ -45,4 +45,4 @@ class APN::Device < APN::Base
|
|
45
45
|
self.last_registered_at = Time.now if self.last_registered_at.nil?
|
46
46
|
end
|
47
47
|
|
48
|
-
end
|
48
|
+
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
# so as to not be sent again.
|
17
17
|
class APN::Notification < APN::Base
|
18
18
|
include ::ActionView::Helpers::TextHelper
|
19
|
+
extend ::ActionView::Helpers::TextHelper
|
19
20
|
|
20
21
|
serialize :payload
|
21
22
|
|
@@ -56,42 +57,38 @@ class APN::Notification < APN::Base
|
|
56
57
|
end
|
57
58
|
|
58
59
|
# Creates the binary message needed to send to Apple.
|
59
|
-
# see http://developer.apple.com/IPhone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4
|
60
60
|
def message_for_sending
|
61
61
|
json = self.to_apple_json
|
62
|
-
message = "\0\0 #{self.device.to_hexa}\0#{
|
63
|
-
raise APN::Errors::ExceededMessageSizeError.new(message) if message.
|
62
|
+
message = "\0\0 #{self.device.to_hexa}\0#{json.length.chr}#{json}"
|
63
|
+
raise APN::Errors::ExceededMessageSizeError.new(message) if message.size.to_i > 256
|
64
64
|
message
|
65
65
|
end
|
66
|
-
def encode(string)
|
67
|
-
string.respond_to?(:force_encoding) ? string.force_encoding('BINARY') : string
|
68
|
-
end
|
69
66
|
|
70
67
|
class << self
|
71
68
|
|
72
69
|
# Opens a connection to the Apple APN server and attempts to batch deliver
|
73
70
|
# an Array of notifications.
|
71
|
+
#
|
72
|
+
# This method expects an Array of APN::Notifications. If no parameter is passed
|
73
|
+
# in then it will use the following:
|
74
|
+
# APN::Notification.all(:conditions => {:sent_at => nil})
|
75
|
+
#
|
76
|
+
# As each APN::Notification is sent the <tt>sent_at</tt> column will be timestamped,
|
77
|
+
# so as to not be sent again.
|
78
|
+
#
|
74
79
|
# This can be run from the following Rake task:
|
75
80
|
# $ rake apn:notifications:deliver
|
76
|
-
def send_notifications(notifications)
|
77
|
-
|
78
|
-
sent = false
|
79
|
-
message = ''
|
80
|
-
|
81
|
-
notifications.find_each do |noty|
|
82
|
-
sent_ids << noty.id
|
83
|
-
message << noty.message_for_sending
|
84
|
-
end
|
81
|
+
def send_notifications(notifications = APN::Notification.all(:conditions => {:sent_at => nil}))
|
82
|
+
unless notifications.nil? || notifications.empty?
|
85
83
|
|
86
|
-
return if sent_ids.empty?
|
87
|
-
|
88
|
-
begin
|
89
84
|
APN::Connection.open_for_delivery do |conn, sock|
|
90
|
-
|
91
|
-
|
85
|
+
notifications.each do |noty|
|
86
|
+
conn.write(noty.message_for_sending)
|
87
|
+
noty.sent_at = Time.now
|
88
|
+
noty.save
|
89
|
+
end
|
92
90
|
end
|
93
|
-
|
94
|
-
APN::Notification.update_all(['sent_at = ?', Time.now.utc], ['id in (?)', sent_ids]) if sent && sent_ids.any?
|
91
|
+
|
95
92
|
end
|
96
93
|
end
|
97
94
|
|
@@ -101,13 +98,10 @@ class APN::Notification < APN::Base
|
|
101
98
|
# Truncate alert message if message payload will be too long
|
102
99
|
def truncate_alert
|
103
100
|
return unless self.alert
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
rescue APN::Errors::ExceededMessageSizeError => e
|
109
|
-
self.alert = truncate(self.alert, :escape => false, :length => self.alert.mb_chars.length - 1)
|
110
|
-
end
|
101
|
+
begin
|
102
|
+
self.message_for_sending
|
103
|
+
rescue APN::Errors::ExceededMessageSizeError => e
|
104
|
+
self.alert = truncate(self.alert, :length => self.alert.size - e.overage)
|
111
105
|
end
|
112
106
|
end
|
113
|
-
end # APN::Notification
|
107
|
+
end # APN::Notification
|
metadata
CHANGED
@@ -1,56 +1,38 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: wireframe-apn_on_rails
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.
|
5
|
-
prerelease:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0.20091216113551
|
6
5
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
-
|
6
|
+
authors:
|
7
|
+
- markbates
|
8
|
+
- ryansonnek
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2009-12-16 00:00:00 -06:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
15
17
|
name: configatron
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
18
|
type: :runtime
|
23
|
-
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
name: activerecord
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :runtime
|
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
|
-
description: ! 'apn_on_rails was developed by: ryan'
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
version:
|
26
|
+
description: "apn_on_rails was developed by: markbates"
|
47
27
|
email: mark@markbates.com
|
48
28
|
executables: []
|
29
|
+
|
49
30
|
extensions: []
|
50
|
-
|
31
|
+
|
32
|
+
extra_rdoc_files:
|
51
33
|
- README
|
52
34
|
- LICENSE
|
53
|
-
files:
|
35
|
+
files:
|
54
36
|
- lib/apn_on_rails/apn_on_rails.rb
|
55
37
|
- lib/apn_on_rails/app/models/apn/base.rb
|
56
38
|
- lib/apn_on_rails/app/models/apn/device.rb
|
@@ -68,28 +50,33 @@ files:
|
|
68
50
|
- generators/templates/apn_migrations/002_create_apn_notifications.rb
|
69
51
|
- generators/templates/apn_migrations/003_alter_apn_devices.rb
|
70
52
|
- generators/templates/apn_migrations/004_add_payload_to_notifications.rb
|
53
|
+
has_rdoc: true
|
71
54
|
homepage: http://www.metabates.com
|
72
55
|
licenses: []
|
56
|
+
|
73
57
|
post_install_message:
|
74
58
|
rdoc_options: []
|
75
|
-
|
59
|
+
|
60
|
+
require_paths:
|
76
61
|
- lib
|
77
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
89
74
|
requirements: []
|
75
|
+
|
90
76
|
rubyforge_project: magrathea
|
91
|
-
rubygems_version: 1.
|
77
|
+
rubygems_version: 1.3.5
|
92
78
|
signing_key:
|
93
79
|
specification_version: 3
|
94
80
|
summary: apn_on_rails
|
95
81
|
test_files: []
|
82
|
+
|