forked from PRX/apn_on_rails
/
notification.rb
99 lines (92 loc) · 3.03 KB
/
notification.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
# Represents the message you wish to send.
# An APN::Notification belongs to an APN::Device.
#
# Example:
# apn = APN::Notification.new
# apn.badge = 5
# apn.sound = 'my_sound.aiff'
# apn.alert = 'Hello!'
# apn.device = APN::Device.find(1)
# apn.save
#
# To deliver call the following method:
# APN::Notification.send_notifications
#
# As each APN::Notification is sent the <tt>sent_at</tt> column will be timestamped,
# so as to not be sent again.
class APN::Notification < APN::Base
include ::ActionView::Helpers::TextHelper
extend ::ActionView::Helpers::TextHelper
serialize :custom_properties
belongs_to :device, :class_name => 'APN::Device'
has_one :app, :class_name => 'APN::App', :through => :device
# Stores the text alert message you want to send to the device.
#
# If the message is over 150 characters long it will get truncated
# to 150 characters with a <tt>...</tt>
def alert=(message)
if !message.blank? && message.size > 150
message = truncate(message, :length => 150)
end
write_attribute('alert', message)
end
# Creates a Hash that will be the payload of an APN.
#
# Example:
# apn = APN::Notification.new
# apn.badge = 5
# apn.sound = 'my_sound.aiff'
# apn.alert = 'Hello!'
# apn.apple_hash # => {"aps" => {"badge" => 5, "sound" => "my_sound.aiff", "alert" => "Hello!"}}
#
# Example 2:
# apn = APN::Notification.new
# apn.badge = 0
# apn.sound = true
# apn.custom_properties = {"typ" => 1}
# apn.apple_hash # => {"aps" => {"badge" => 0, "sound" => "1.aiff"}, "typ" => "1"}
def apple_hash
result = {}
result['aps'] = {}
if self.alert
begin
result['aps']['alert'] = JSON.parse(self.alert)
rescue JSON::ParserError => e
result['aps']['alert'] = self.alert
end
end
result['aps']['badge'] = self.badge.to_i if self.badge
if self.sound
result['aps']['sound'] = self.sound if self.sound.is_a? String
result['aps']['sound'] = "1.aiff" if self.sound.is_a?(TrueClass)
end
if self.custom_properties
self.custom_properties.each do |key,value|
result["#{key}"] = "#{value}"
end
end
result
end
# Creates the JSON string required for an APN message.
#
# Example:
# apn = APN::Notification.new
# apn.badge = 5
# apn.sound = 'my_sound.aiff'
# apn.alert = 'Hello!'
# apn.to_apple_json # => '{"aps":{"badge":5,"sound":"my_sound.aiff","alert":"Hello!"}}'
def to_apple_json
self.apple_hash.to_json
end
# Creates the binary message needed to send to Apple.
def message_for_sending
json = self.to_apple_json
message = "\0\0 #{self.device.to_hexa}\0#{json.length.chr}#{json}"
raise APN::Errors::ExceededMessageSizeError.new(message) if message.size.to_i > 256
message
end
def self.send_notifications
ActiveSupport::Deprecation.warn("The method APN::Notification.send_notifications is deprecated. Use APN::App.send_notifications instead.")
APN::App.send_notifications
end
end # APN::Notification