urbanairship 1.0.2 → 1.0.3
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.markdown +18 -6
- data/lib/urbanairship.rb +27 -3
- data/spec/urbanairship_spec.rb +90 -2
- metadata +4 -4
data/README.markdown
CHANGED
@@ -35,7 +35,7 @@ Sending a push notification
|
|
35
35
|
---------------------------
|
36
36
|
```ruby
|
37
37
|
notification = {
|
38
|
-
:schedule_for => 1.hour.from_now,
|
38
|
+
:schedule_for => [1.hour.from_now],
|
39
39
|
:device_tokens => ['DEVICE-TOKEN-ONE', 'DEVICE-TOKEN-TWO'],
|
40
40
|
:aps => {:alert => 'You have a new message!', :badge => 1}
|
41
41
|
}
|
@@ -48,12 +48,12 @@ Batching push notification sends
|
|
48
48
|
```ruby
|
49
49
|
notifications = [
|
50
50
|
{
|
51
|
-
:schedule_for => 1.hour.from_now,
|
51
|
+
:schedule_for => [{ :alias => 'deadbeef', :scheduled_time => 1.hour.from_now }], # assigning an alias to a scheduled push
|
52
52
|
:device_tokens => ['DEVICE-TOKEN-ONE', 'DEVICE-TOKEN-TWO'],
|
53
53
|
:aps => {:alert => 'You have a new message!', :badge => 1}
|
54
54
|
},
|
55
55
|
{
|
56
|
-
:schedule_for => 3.hours.from_now,
|
56
|
+
:schedule_for => [3.hours.from_now],
|
57
57
|
:device_tokens => ['DEVICE-TOKEN-THREE'],
|
58
58
|
:aps => {:alert => 'You have a new message!', :badge => 1}
|
59
59
|
}
|
@@ -62,13 +62,14 @@ notifications = [
|
|
62
62
|
Urbanairship.batch_push notifications # => true
|
63
63
|
```
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
|
66
|
+
Sending broadcast notifications
|
67
|
+
-------------------------------
|
67
68
|
Urbanairship allows you to send a broadcast notification to all active registered device tokens for your app.
|
68
69
|
|
69
70
|
```ruby
|
70
71
|
notification = {
|
71
|
-
:schedule_for => 1.hour.from_now,
|
72
|
+
:schedule_for => [1.hour.from_now],
|
72
73
|
:aps => {:alert => 'Important announcement!', :badge => 1}
|
73
74
|
}
|
74
75
|
|
@@ -95,3 +96,14 @@ Urbanairship.feedback 24.hours.ago # =>
|
|
95
96
|
# }
|
96
97
|
# ]
|
97
98
|
```
|
99
|
+
|
100
|
+
Deleting scheduled notifications
|
101
|
+
--------------------------------
|
102
|
+
|
103
|
+
If you know the alias or id of a scheduled push notification then you can delete it from Urbanairship's queue and it will not be delivered.
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
Urbanairship.delete_scheduled_push("123456789") # => true
|
107
|
+
Urbanairship.delete_scheduled_push(123456789) # => true
|
108
|
+
Urbanairship.delete_scheduled_push(:alias => "deadbeef") # => true
|
109
|
+
```
|
data/lib/urbanairship.rb
CHANGED
@@ -12,12 +12,17 @@ module Urbanairship
|
|
12
12
|
end
|
13
13
|
|
14
14
|
VALID_PUSH_PARAMS = %w(device_tokens aliases tags schedule_for exclude_tokens aps)
|
15
|
+
VALID_REGISTER_PARAMS = %w(alias)
|
15
16
|
|
16
17
|
class << self
|
17
18
|
attr_accessor :application_key, :application_secret, :master_secret, :logger, :request_timeout
|
18
19
|
|
19
|
-
def register_device(device_token)
|
20
|
-
response = do_request(:put, "/api/device_tokens/#{device_token}", :authenticate_with => :application_secret)
|
20
|
+
def register_device(device_token, options = {})
|
21
|
+
response = do_request(:put, "/api/device_tokens/#{device_token}", :authenticate_with => :application_secret) do |request|
|
22
|
+
request.body = parse_register_options(options).to_json
|
23
|
+
request.add_field "Content-Type", "application/json" unless options.empty?
|
24
|
+
end
|
25
|
+
|
21
26
|
response && %w(200 201).include?(response.code)
|
22
27
|
end
|
23
28
|
|
@@ -26,6 +31,12 @@ module Urbanairship
|
|
26
31
|
response && response.code == "204"
|
27
32
|
end
|
28
33
|
|
34
|
+
def delete_scheduled_push(param)
|
35
|
+
path = (param.is_a? Hash) ? "/api/push/scheduled/alias/#{param[:alias].to_s}" : "/api/push/scheduled/#{param.to_s}"
|
36
|
+
response = do_request(:delete, path, :authenticate_with => :master_secret)
|
37
|
+
response && response.code == "204"
|
38
|
+
end
|
39
|
+
|
29
40
|
def push(options = {})
|
30
41
|
response = do_request(:post, "/api/push/", :authenticate_with => :master_secret) do |request|
|
31
42
|
request.body = parse_push_options(options).to_json
|
@@ -90,8 +101,13 @@ module Urbanairship
|
|
90
101
|
Net::HTTP.new("go.urbanairship.com", 443).tap{|http| http.use_ssl = true}
|
91
102
|
end
|
92
103
|
|
104
|
+
def parse_register_options(hash = {})
|
105
|
+
hash[:alias] = hash[:alias].to_s unless hash[:alias].nil?
|
106
|
+
hash.delete_if{|key, value| !VALID_REGISTER_PARAMS.include?(key.to_s)}
|
107
|
+
end
|
108
|
+
|
93
109
|
def parse_push_options(hash = {})
|
94
|
-
hash[:schedule_for] = hash[:schedule_for].map{|
|
110
|
+
hash[:schedule_for] = hash[:schedule_for].map{|elem| process_scheduled_elem(elem)} unless hash[:schedule_for].nil?
|
95
111
|
hash.delete_if{|key, value| !VALID_PUSH_PARAMS.include?(key.to_s)}
|
96
112
|
end
|
97
113
|
|
@@ -109,6 +125,14 @@ module Urbanairship
|
|
109
125
|
time.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
110
126
|
end
|
111
127
|
|
128
|
+
def process_scheduled_elem(elem)
|
129
|
+
if elem.class == Hash
|
130
|
+
elem.merge!(:scheduled_time => format_time(elem[:scheduled_time]))
|
131
|
+
else
|
132
|
+
format_time(elem)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
112
136
|
def request_timeout
|
113
137
|
@request_timeout || 5.0
|
114
138
|
end
|
data/spec/urbanairship_spec.rb
CHANGED
@@ -6,6 +6,7 @@ describe Urbanairship do
|
|
6
6
|
# register_device
|
7
7
|
FakeWeb.register_uri(:put, "https://my_app_key:my_app_secret@go.urbanairship.com/api/device_tokens/new_device_token", :status => ["201", "Created"])
|
8
8
|
FakeWeb.register_uri(:put, "https://my_app_key:my_app_secret@go.urbanairship.com/api/device_tokens/existing_device_token", :status => ["200", "OK"])
|
9
|
+
FakeWeb.register_uri(:put, "https://my_app_key:my_app_secret@go.urbanairship.com/api/device_tokens/device_token_one", :status => ["201", "Created"])
|
9
10
|
FakeWeb.register_uri(:put, /bad_key\:my_app_secret\@go\.urbanairship\.com/, :status => ["401", "Unauthorized"])
|
10
11
|
|
11
12
|
# unregister_device
|
@@ -25,6 +26,11 @@ describe Urbanairship do
|
|
25
26
|
FakeWeb.register_uri(:post, "https://my_app_key:my_master_secret@go.urbanairship.com/api/push/broadcast/", :status => ["200", "OK"])
|
26
27
|
FakeWeb.register_uri(:post, "https://my_app_key2:my_master_secret2@go.urbanairship.com/api/push/broadcast/", :status => ["400", "Bad Request"])
|
27
28
|
|
29
|
+
# delete_scheduled_push
|
30
|
+
FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/push\/scheduled\/[0-9]+/, :status => ["204", "No Content"])
|
31
|
+
FakeWeb.register_uri(:delete, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/push\/scheduled\/alias\/.+/, :status => ["204", "No Content"])
|
32
|
+
FakeWeb.register_uri(:delete, /bad_key\:my_master_secret\@go\.urbanairship.com\/api\/push\/scheduled\/[0-9]+/, :status => ["401", "Unauthorized"])
|
33
|
+
|
28
34
|
# feedback
|
29
35
|
FakeWeb.register_uri(:get, /my_app_key\:my_master_secret\@go\.urbanairship.com\/api\/device_tokens\/feedback/, :status => ["200", "OK"], :body => "[{\"device_token\":\"token\",\"marked_inactive_on\":\"2010-10-14T19:15:13Z\",\"alias\":\"my_alias\"}]")
|
30
36
|
FakeWeb.register_uri(:get, /my_app_key2\:my_master_secret2\@go\.urbanairship.com\/api\/device_tokens\/feedback/, :status => ["500", "Internal Server Error"])
|
@@ -65,6 +71,7 @@ describe Urbanairship do
|
|
65
71
|
describe "registering a device" do
|
66
72
|
|
67
73
|
before(:each) do
|
74
|
+
@valid_params = {:alias => 'one'}
|
68
75
|
Urbanairship.application_key = "my_app_key"
|
69
76
|
Urbanairship.application_secret = "my_app_secret"
|
70
77
|
end
|
@@ -101,8 +108,35 @@ describe Urbanairship do
|
|
101
108
|
Urbanairship.register_device("new_device_token").should == false
|
102
109
|
end
|
103
110
|
|
104
|
-
|
105
|
-
|
111
|
+
it "doesn't set the content-type header to application/json if options are empty" do
|
112
|
+
Urbanairship.register_device("device_token_one")
|
113
|
+
FakeWeb.last_request['content-type'].should_not == 'application/json'
|
114
|
+
end
|
115
|
+
|
116
|
+
it "accepts an alias" do
|
117
|
+
Urbanairship.register_device("device_token_one", @valid_params).should == true
|
118
|
+
end
|
119
|
+
|
120
|
+
it "sets the content-type header to application/json when options are added" do
|
121
|
+
Urbanairship.register_device("device_token_one", @valid_params)
|
122
|
+
FakeWeb.last_request['content-type'].should == 'application/json'
|
123
|
+
end
|
124
|
+
|
125
|
+
it "adds alias to the JSON payload" do
|
126
|
+
Urbanairship.register_device("device_token_one", @valid_params)
|
127
|
+
request_json['alias'].should == "one"
|
128
|
+
end
|
129
|
+
|
130
|
+
it "converts alias param to string" do
|
131
|
+
Urbanairship.register_device("device_token_one", :alias => 11)
|
132
|
+
request_json['alias'].should be_a_kind_of String
|
133
|
+
end
|
134
|
+
|
135
|
+
it "excludes invalid parameters from the JSON payload" do
|
136
|
+
@valid_params.merge!(:foo => 'bar')
|
137
|
+
Urbanairship.register_device("device_token_one", @valid_params)
|
138
|
+
request_json['foo'].should be_nil
|
139
|
+
end
|
106
140
|
|
107
141
|
end
|
108
142
|
|
@@ -143,6 +177,53 @@ describe Urbanairship do
|
|
143
177
|
|
144
178
|
end
|
145
179
|
|
180
|
+
describe "deleting a scheduled push notification" do
|
181
|
+
before(:each) do
|
182
|
+
Urbanairship.application_key = "my_app_key"
|
183
|
+
Urbanairship.master_secret = "my_master_secret"
|
184
|
+
end
|
185
|
+
|
186
|
+
it "raises an error if call is made without an app key and master secret configured" do
|
187
|
+
Urbanairship.application_key = nil
|
188
|
+
Urbanairship.master_secret = nil
|
189
|
+
|
190
|
+
lambda {
|
191
|
+
Urbanairship.delete_scheduled_push("123456789")
|
192
|
+
}.should raise_error(RuntimeError, "Must configure application_key, master_secret before making this request.")
|
193
|
+
end
|
194
|
+
|
195
|
+
it "uses app key and secret to sign the request" do
|
196
|
+
Urbanairship.delete_scheduled_push("123456789")
|
197
|
+
FakeWeb.last_request['authorization'].should == "Basic #{Base64::encode64('my_app_key:my_master_secret').chomp}"
|
198
|
+
end
|
199
|
+
|
200
|
+
it "sends the key that needs to be deleted" do
|
201
|
+
Urbanairship.delete_scheduled_push("123456789")
|
202
|
+
FakeWeb.last_request.path.should == "/api/push/scheduled/123456789"
|
203
|
+
end
|
204
|
+
|
205
|
+
it "sends the key that needs to be deleted" do
|
206
|
+
Urbanairship.delete_scheduled_push(123456789)
|
207
|
+
FakeWeb.last_request.path.should == "/api/push/scheduled/123456789"
|
208
|
+
end
|
209
|
+
|
210
|
+
it "sends the alias that needs to be deleted" do
|
211
|
+
Urbanairship.delete_scheduled_push(:alias => "alias_to_delete")
|
212
|
+
FakeWeb.last_request.path.should == "/api/push/scheduled/alias/alias_to_delete"
|
213
|
+
end
|
214
|
+
|
215
|
+
it "returns true when the push notification is successfully deleted" do
|
216
|
+
Urbanairship.delete_scheduled_push("123456789").should == true
|
217
|
+
FakeWeb.last_request.body.should be_nil
|
218
|
+
end
|
219
|
+
|
220
|
+
it "returns false when the authorization is invalid" do
|
221
|
+
Urbanairship.application_key = "bad_key"
|
222
|
+
Urbanairship.delete_scheduled_push("123456789").should == false
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
146
227
|
describe "sending multiple push notifications" do
|
147
228
|
|
148
229
|
before(:each) do
|
@@ -205,6 +286,13 @@ describe Urbanairship do
|
|
205
286
|
request_json['schedule_for'].should == ['2010-10-10T09:09:09Z']
|
206
287
|
end
|
207
288
|
|
289
|
+
it "adds an aliased schedule_for to the JSON payload" do
|
290
|
+
time = Time.parse("Oct 17th, 2010, 8:00 PM UTC")
|
291
|
+
alias_str = 'cafebabe'
|
292
|
+
Urbanairship.push(@valid_params.merge(:schedule_for => [{ :alias => alias_str, :scheduled_time => time }]))
|
293
|
+
request_json['schedule_for'].should == [{ 'alias' => alias_str, 'scheduled_time' => '2010-10-17T20:00:00Z' }]
|
294
|
+
end
|
295
|
+
|
208
296
|
it "adds exclude_tokens to the JSON payload" do
|
209
297
|
Urbanairship.push(@valid_params.merge(:exclude_tokens => ["one", "two"]))
|
210
298
|
request_json['exclude_tokens'].should == ["one", "two"]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: urbanairship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Groupon, Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-14 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|