fcm 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +13 -9
- data/fcm.gemspec +1 -1
- data/lib/fcm.rb +55 -11
- data/spec/fcm_spec.rb +140 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54f66db484403cdfb990353ebf8c52553de4beb9
|
4
|
+
data.tar.gz: 77bdb6784ce6688ee0f3cc468ecf3ab1e7ccd2b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a97f8d1a9d24f436a928f288b302828022bb542529435a155d4758cd014ff19bfd5ce295e746597717d2b45e3e8d6523a97a1336e87555e734c492d31b6252bf
|
7
|
+
data.tar.gz: dc3ea1cf7d433759648a27e579000616f1fd322bf0d477dd5d67fc39ca7483dc2d12d870856585161d809df3d641c3482f0380af0168b69d1003312a71a30e83
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -57,16 +57,16 @@ Then you will need a notification key which you can create for a particular `key
|
|
57
57
|
```ruby
|
58
58
|
response = fcm.create(key_name: "appUser-Chris",
|
59
59
|
project_id: "my_project_id",
|
60
|
-
registration_ids:["4", "8", "15", "16", "23", "42"])
|
60
|
+
registration_ids: ["4", "8", "15", "16", "23", "42"])
|
61
61
|
```
|
62
62
|
|
63
63
|
### Send to Notification Key
|
64
|
-
Now you can send a message to a particular `notification_key` via the `send_with_notification_key` method. This allows the server to send a single data to multiple app instances
|
64
|
+
Now you can send a message to a particular `notification_key` via the `send_with_notification_key` method. This allows the server to send a single [data](https://firebase.google.com/docs/cloud-messaging/concept-options#data_messages) payload or/and [notification](https://firebase.google.com/docs/cloud-messaging/concept-options#notifications) payload to multiple app instances (typically on multiple devices) owned by a single user (instead of sending to some registration tokens). Note: the maximum number of members allowed for a `notification_key` is 20.
|
65
65
|
|
66
66
|
```ruby
|
67
|
-
response = fcm.send_with_notification_key("notification_key",
|
67
|
+
response = fcm.send_with_notification_key("notification_key",
|
68
68
|
data: {score: "3x1"},
|
69
|
-
collapse_key: "updated_score"
|
69
|
+
collapse_key: "updated_score")
|
70
70
|
```
|
71
71
|
|
72
72
|
### Add/Remove Registration Tokens
|
@@ -90,15 +90,15 @@ response = fcm.remove(key_name: "appUser-Chris",
|
|
90
90
|
FCM [topic messaging](https://firebase.google.com/docs/cloud-messaging/topic-messaging) allows your app server to send a message to multiple devices that have opted in to a particular topic. Based on the publish/subscribe model, topic messaging supports unlimited subscriptions per app. Sending to a topic is very similar to sending to an individual device or to a user group, in the sense that you can use the `fcm.send_with_notification_key()` method where the `noticiation_key` matches the regular expression `"/topics/[a-zA-Z0-9-_.~%]+"`:
|
91
91
|
|
92
92
|
```ruby
|
93
|
-
response = fcm.send_with_notification_key("/topics/yourTopic",
|
94
|
-
data: {message: "This is a FCM Topic Message!"
|
93
|
+
response = fcm.send_with_notification_key("/topics/yourTopic",
|
94
|
+
data: {message: "This is a FCM Topic Message!")
|
95
95
|
```
|
96
96
|
|
97
97
|
Or you can use the helper:
|
98
98
|
|
99
99
|
```ruby
|
100
|
-
response = fcm.send_to_topic("yourTopic",
|
101
|
-
data: {message: "This is a FCM Topic Message!"
|
100
|
+
response = fcm.send_to_topic("yourTopic",
|
101
|
+
data: {message: "This is a FCM Topic Message!")
|
102
102
|
```
|
103
103
|
|
104
104
|
## Mobile Clients
|
@@ -109,11 +109,15 @@ The guide to set up an iOS app to get notifications is here: [Setting up a FCM C
|
|
109
109
|
|
110
110
|
## ChangeLog
|
111
111
|
|
112
|
+
### 0.0.2
|
113
|
+
|
114
|
+
* Fixed group messaging url.
|
115
|
+
* Added API to `recover_notification_key`.
|
116
|
+
|
112
117
|
### 0.0.1
|
113
118
|
|
114
119
|
* Initial version.
|
115
120
|
|
116
|
-
|
117
121
|
##MIT License
|
118
122
|
|
119
123
|
* Copyright (c) 2016 Kashif Rasul and Shoaib Burq. See LICENSE.txt for details.
|
data/fcm.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "fcm"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.2"
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ["Kashif Rasul", "Shoaib Burq"]
|
9
9
|
s.email = ["kashif@spacialdb.com", "shoaib@spacialdb.com"]
|
data/lib/fcm.rb
CHANGED
@@ -8,6 +8,9 @@ class FCM
|
|
8
8
|
default_timeout 30
|
9
9
|
format :json
|
10
10
|
|
11
|
+
# constants
|
12
|
+
GROUP_NOTIFICATION_BASE_URI = 'https://android.googleapis.com/gcm'
|
13
|
+
|
11
14
|
attr_accessor :timeout, :api_key
|
12
15
|
|
13
16
|
def initialize(api_key, client_options = {})
|
@@ -43,8 +46,8 @@ class FCM
|
|
43
46
|
alias send send_notification
|
44
47
|
|
45
48
|
def create_notification_key(key_name, project_id, registration_ids = [])
|
46
|
-
post_body = build_post_body(registration_ids,
|
47
|
-
|
49
|
+
post_body = build_post_body(registration_ids, operation: 'create',
|
50
|
+
notification_key_name: key_name)
|
48
51
|
|
49
52
|
params = {
|
50
53
|
body: post_body.to_json,
|
@@ -55,15 +58,20 @@ class FCM
|
|
55
58
|
}
|
56
59
|
}
|
57
60
|
|
58
|
-
response =
|
61
|
+
response = nil
|
62
|
+
|
63
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI) do
|
64
|
+
response = self.class.post('/notification', params.merge(@client_options))
|
65
|
+
end
|
66
|
+
|
59
67
|
build_response(response)
|
60
68
|
end
|
61
69
|
alias create create_notification_key
|
62
70
|
|
63
71
|
def add_registration_ids(key_name, project_id, notification_key, registration_ids)
|
64
|
-
post_body = build_post_body(registration_ids,
|
65
|
-
|
66
|
-
|
72
|
+
post_body = build_post_body(registration_ids, operation: 'add',
|
73
|
+
notification_key_name: key_name,
|
74
|
+
notification_key: notification_key)
|
67
75
|
|
68
76
|
params = {
|
69
77
|
body: post_body.to_json,
|
@@ -74,15 +82,19 @@ class FCM
|
|
74
82
|
}
|
75
83
|
}
|
76
84
|
|
77
|
-
response =
|
85
|
+
response = nil
|
86
|
+
|
87
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI) do
|
88
|
+
response = self.class.post('/notification', params.merge(@client_options))
|
89
|
+
end
|
78
90
|
build_response(response)
|
79
91
|
end
|
80
92
|
alias add add_registration_ids
|
81
93
|
|
82
94
|
def remove_registration_ids(key_name, project_id, notification_key, registration_ids)
|
83
|
-
post_body = build_post_body(registration_ids,
|
84
|
-
|
85
|
-
|
95
|
+
post_body = build_post_body(registration_ids, operation: 'remove',
|
96
|
+
notification_key_name: key_name,
|
97
|
+
notification_key: notification_key)
|
86
98
|
|
87
99
|
params = {
|
88
100
|
body: post_body.to_json,
|
@@ -93,11 +105,35 @@ class FCM
|
|
93
105
|
}
|
94
106
|
}
|
95
107
|
|
96
|
-
response =
|
108
|
+
response = nil
|
109
|
+
|
110
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI) do
|
111
|
+
response = self.class.post('/notification', params.merge(@client_options))
|
112
|
+
end
|
97
113
|
build_response(response)
|
98
114
|
end
|
99
115
|
alias remove remove_registration_ids
|
100
116
|
|
117
|
+
def recover_notification_key(key_name, project_id)
|
118
|
+
params = {
|
119
|
+
query: {
|
120
|
+
notification_key_name: key_name
|
121
|
+
},
|
122
|
+
headers: {
|
123
|
+
'Content-Type' => 'application/json',
|
124
|
+
'project_id' => project_id,
|
125
|
+
'Authorization' => "key=#{@api_key}"
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
response = nil
|
130
|
+
|
131
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI) do
|
132
|
+
response = self.class.post('/notification', params.merge(@client_options))
|
133
|
+
end
|
134
|
+
build_response(response)
|
135
|
+
end
|
136
|
+
|
101
137
|
def send_with_notification_key(notification_key, options = {})
|
102
138
|
body = { to: notification_key }.merge(options)
|
103
139
|
|
@@ -108,6 +144,7 @@ class FCM
|
|
108
144
|
'Content-Type' => 'application/json'
|
109
145
|
}
|
110
146
|
}
|
147
|
+
|
111
148
|
response = self.class.post('/send', params.merge(@client_options))
|
112
149
|
build_response(response)
|
113
150
|
end
|
@@ -120,6 +157,13 @@ class FCM
|
|
120
157
|
|
121
158
|
private
|
122
159
|
|
160
|
+
def for_uri(uri)
|
161
|
+
current_uri = self.class.base_uri
|
162
|
+
self.class.base_uri uri
|
163
|
+
yield
|
164
|
+
self.class.base_uri current_uri
|
165
|
+
end
|
166
|
+
|
123
167
|
def build_post_body(registration_ids, options = {})
|
124
168
|
{ registration_ids: registration_ids }.merge(options)
|
125
169
|
end
|
data/spec/fcm_spec.rb
CHANGED
@@ -2,9 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe FCM do
|
4
4
|
let(:send_url) { "#{FCM.base_uri}/send" }
|
5
|
+
let(:group_notification_base_uri) { "https://android.googleapis.com/gcm/notification" }
|
6
|
+
let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
|
7
|
+
let(:registration_ids) { ['42'] }
|
8
|
+
let(:key_name) { 'appUser-Chris' }
|
9
|
+
let(:project_id) { "123456789" } # https://developers.google.com/cloud-messaging/gcm#senderid
|
10
|
+
let(:notification_key) { "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ" }
|
5
11
|
|
6
12
|
it 'should raise an error if the api key is not provided' do
|
7
|
-
expect { FCM.new }.to raise_error
|
13
|
+
expect { FCM.new }.to raise_error(ArgumentError)
|
8
14
|
end
|
9
15
|
|
10
16
|
it 'should raise error if time_to_live is given' do
|
@@ -12,8 +18,6 @@ describe FCM do
|
|
12
18
|
end
|
13
19
|
|
14
20
|
describe 'sending notification' do
|
15
|
-
let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
|
16
|
-
let(:registration_ids) { ['42'] }
|
17
21
|
let(:valid_request_body) do
|
18
22
|
{ registration_ids: registration_ids }
|
19
23
|
end
|
@@ -238,4 +242,137 @@ describe FCM do
|
|
238
242
|
end
|
239
243
|
end
|
240
244
|
end
|
245
|
+
|
246
|
+
describe 'sending group notifications' do
|
247
|
+
# TODO: refactor to should_behave_like
|
248
|
+
let(:valid_request_headers) do
|
249
|
+
{
|
250
|
+
"Authorization" => "key=#{api_key}",
|
251
|
+
"Content-Type" => 'application/json',
|
252
|
+
"Project-Id" => project_id
|
253
|
+
}
|
254
|
+
end
|
255
|
+
let(:valid_response_body) do
|
256
|
+
{ notification_key: "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ" }
|
257
|
+
end
|
258
|
+
|
259
|
+
let(:default_valid_request_body) do
|
260
|
+
{
|
261
|
+
registration_ids: registration_ids,
|
262
|
+
operation: "create",
|
263
|
+
notification_key_name: key_name
|
264
|
+
}
|
265
|
+
end
|
266
|
+
|
267
|
+
subject { FCM.new(api_key) }
|
268
|
+
|
269
|
+
# ref: https://firebase.google.com/docs/cloud-messaging/notifications#managing-device-groups-on-the-app-server
|
270
|
+
context 'create' do
|
271
|
+
let(:valid_request_body) do
|
272
|
+
default_valid_request_body.merge({
|
273
|
+
operation: "create"
|
274
|
+
})
|
275
|
+
end
|
276
|
+
|
277
|
+
let(:mock_request_attributes) do
|
278
|
+
{
|
279
|
+
body: valid_request_body.to_json,
|
280
|
+
headers: valid_request_headers
|
281
|
+
}
|
282
|
+
end
|
283
|
+
|
284
|
+
before do
|
285
|
+
stub_request(:post, group_notification_base_uri).with(
|
286
|
+
mock_request_attributes
|
287
|
+
).to_return(
|
288
|
+
body: valid_response_body.to_json,
|
289
|
+
headers: {},
|
290
|
+
status: 200
|
291
|
+
)
|
292
|
+
end
|
293
|
+
|
294
|
+
it 'should send a post request' do
|
295
|
+
response = subject.create(key_name, project_id, registration_ids)
|
296
|
+
response.should eq(
|
297
|
+
headers: {},
|
298
|
+
status_code: 200,
|
299
|
+
response: 'success',
|
300
|
+
body: valid_response_body.to_json
|
301
|
+
)
|
302
|
+
end
|
303
|
+
end # create context
|
304
|
+
|
305
|
+
context 'add' do
|
306
|
+
let(:valid_request_body) do
|
307
|
+
default_valid_request_body.merge({
|
308
|
+
operation: "add",
|
309
|
+
notification_key: notification_key
|
310
|
+
})
|
311
|
+
end
|
312
|
+
|
313
|
+
let(:mock_request_attributes) do
|
314
|
+
{
|
315
|
+
body: valid_request_body.to_json,
|
316
|
+
headers: valid_request_headers
|
317
|
+
}
|
318
|
+
end
|
319
|
+
|
320
|
+
before do
|
321
|
+
stub_request(:post, group_notification_base_uri).with(
|
322
|
+
mock_request_attributes
|
323
|
+
).to_return(
|
324
|
+
body: valid_response_body.to_json,
|
325
|
+
headers: {},
|
326
|
+
status: 200
|
327
|
+
)
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'should send a post request' do
|
331
|
+
response = subject.add(key_name, project_id, notification_key, registration_ids)
|
332
|
+
response.should eq(
|
333
|
+
headers: {},
|
334
|
+
status_code: 200,
|
335
|
+
response: 'success',
|
336
|
+
body: valid_response_body.to_json
|
337
|
+
)
|
338
|
+
end
|
339
|
+
end # add context
|
340
|
+
|
341
|
+
context 'remove' do
|
342
|
+
let(:valid_request_body) do
|
343
|
+
default_valid_request_body.merge({
|
344
|
+
operation: "remove",
|
345
|
+
notification_key: notification_key
|
346
|
+
})
|
347
|
+
end
|
348
|
+
|
349
|
+
let(:mock_request_attributes) do
|
350
|
+
{
|
351
|
+
body: valid_request_body.to_json,
|
352
|
+
headers: valid_request_headers
|
353
|
+
}
|
354
|
+
end
|
355
|
+
|
356
|
+
before do
|
357
|
+
stub_request(:post, group_notification_base_uri).with(
|
358
|
+
mock_request_attributes
|
359
|
+
).to_return(
|
360
|
+
body: valid_response_body.to_json,
|
361
|
+
headers: {},
|
362
|
+
status: 200
|
363
|
+
)
|
364
|
+
end
|
365
|
+
|
366
|
+
it 'should send a post request' do
|
367
|
+
response = subject.remove(key_name, project_id, notification_key, registration_ids)
|
368
|
+
response.should eq(
|
369
|
+
headers: {},
|
370
|
+
status_code: 200,
|
371
|
+
response: 'success',
|
372
|
+
body: valid_response_body.to_json
|
373
|
+
)
|
374
|
+
end
|
375
|
+
end # remove context
|
376
|
+
|
377
|
+
end
|
241
378
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fcm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kashif Rasul
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-08-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -80,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
80
|
version: '0'
|
81
81
|
requirements: []
|
82
82
|
rubyforge_project: fcm
|
83
|
-
rubygems_version: 2.6.
|
83
|
+
rubygems_version: 2.6.6
|
84
84
|
signing_key:
|
85
85
|
specification_version: 4
|
86
86
|
summary: Reliably deliver messages and notifications via FCM
|