fcm 0.0.6 → 0.0.7
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 +5 -5
- data/README.md +12 -7
- data/fcm.gemspec +2 -2
- data/lib/fcm.rb +81 -108
- data/spec/fcm_spec.rb +3 -3
- metadata +8 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4200d68170fc0c8cee514824e77244e51fc68802dc8ad6a34a1c592c11f36a71
|
4
|
+
data.tar.gz: a70490fb7e92cf2ea66e53ba1cb58a5c8caad45b8d6bbbf1335bc13c3e49c774
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5d276a776ddd9eed746f16e129c1820e27361e99fa3e6c6f8be14af04561a8f4dd520d4296bf632d31bb1269b4a8817e18bb3938d8992d736503e310dfbd8cb
|
7
|
+
data.tar.gz: 7049ded384b5df8a097addbd96cce01ca559ddb6a61b8ec27e2f5fe06d7d4d70d0009b4d7bfa240dfe84598acfb917ce735ec4b8c6a71e072108d4ed1d6cc629
|
data/README.md
CHANGED
@@ -22,9 +22,11 @@ For Android you will need a device running 2.3 (or newer) that also have the Goo
|
|
22
22
|
One of the following, tested Ruby versions:
|
23
23
|
|
24
24
|
- `2.0.0`
|
25
|
-
- `2.1.
|
26
|
-
- `2.2.
|
27
|
-
- `2.3.
|
25
|
+
- `2.1.10`
|
26
|
+
- `2.2.10`
|
27
|
+
- `2.3.8`
|
28
|
+
- `2.4.5`
|
29
|
+
- `2.5.3`
|
28
30
|
|
29
31
|
## Usage
|
30
32
|
|
@@ -43,12 +45,11 @@ fcm = FCM.new("my_server_key")
|
|
43
45
|
|
44
46
|
registration_ids= ["12", "13"] # an array of one or more client registration tokens
|
45
47
|
|
46
|
-
# See https://
|
48
|
+
# See https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages for all available options.
|
47
49
|
options = { "notification": {
|
48
50
|
"title": "Portugal vs. Denmark",
|
49
|
-
"
|
50
|
-
}
|
51
|
-
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
|
51
|
+
"body": "5 to 1"
|
52
|
+
}
|
52
53
|
}
|
53
54
|
response = fcm.send(registration_ids, options)
|
54
55
|
```
|
@@ -174,6 +175,10 @@ The guide to set up an iOS app to get notifications is here: [Setting up a FCM C
|
|
174
175
|
|
175
176
|
## ChangeLog
|
176
177
|
|
178
|
+
### 0.0.7
|
179
|
+
|
180
|
+
- replace `httparty` with `faraday`
|
181
|
+
|
177
182
|
### 0.0.2
|
178
183
|
|
179
184
|
- Fixed group messaging url.
|
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.7"
|
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"]
|
@@ -21,5 +21,5 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
|
-
s.add_runtime_dependency('
|
24
|
+
s.add_runtime_dependency('faraday','0.15.4')
|
25
25
|
end
|
data/lib/fcm.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'faraday'
|
2
2
|
require 'cgi'
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
class FCM
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
format :json
|
6
|
+
BASE_URI = 'https://fcm.googleapis.com'
|
7
|
+
DEFAULT_TIMEOUT = 30
|
8
|
+
FORMAT = :json
|
10
9
|
|
11
10
|
# constants
|
12
|
-
GROUP_NOTIFICATION_BASE_URI = 'https://android.googleapis.com
|
13
|
-
INSTANCE_ID_API = 'https://iid.googleapis.com
|
11
|
+
GROUP_NOTIFICATION_BASE_URI = 'https://android.googleapis.com'
|
12
|
+
INSTANCE_ID_API = 'https://iid.googleapis.com'
|
14
13
|
TOPIC_REGEX = /[a-zA-Z0-9\-_.~%]+/
|
15
14
|
|
16
15
|
attr_accessor :timeout, :api_key
|
@@ -35,15 +34,10 @@ class FCM
|
|
35
34
|
def send_notification(registration_ids, options = {})
|
36
35
|
post_body = build_post_body(registration_ids, options)
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
'Content-Type' => 'application/json'
|
43
|
-
}
|
44
|
-
}
|
45
|
-
response = self.class.post('/send', params.merge(@client_options))
|
46
|
-
build_response(response, registration_ids)
|
37
|
+
for_uri(BASE_URI) do |connection|
|
38
|
+
response = connection.post('/fcm/send', post_body.to_json)
|
39
|
+
build_response(response, registration_ids)
|
40
|
+
end
|
47
41
|
end
|
48
42
|
alias send send_notification
|
49
43
|
|
@@ -51,22 +45,14 @@ class FCM
|
|
51
45
|
post_body = build_post_body(registration_ids, operation: 'create',
|
52
46
|
notification_key_name: key_name)
|
53
47
|
|
54
|
-
|
55
|
-
|
56
|
-
headers: {
|
57
|
-
'Content-Type' => 'application/json',
|
58
|
-
'project_id' => project_id,
|
59
|
-
'Authorization' => "key=#{@api_key}"
|
60
|
-
}
|
48
|
+
extra_headers = {
|
49
|
+
'project_id' => project_id
|
61
50
|
}
|
62
51
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
response = self.class.post('/notification', params.merge(@client_options))
|
52
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
|
53
|
+
response = connection.post('/gcm/notification', post_body.to_json)
|
54
|
+
build_response(response)
|
67
55
|
end
|
68
|
-
|
69
|
-
build_response(response)
|
70
56
|
end
|
71
57
|
alias create create_notification_key
|
72
58
|
|
@@ -75,21 +61,14 @@ class FCM
|
|
75
61
|
notification_key_name: key_name,
|
76
62
|
notification_key: notification_key)
|
77
63
|
|
78
|
-
|
79
|
-
|
80
|
-
headers: {
|
81
|
-
'Content-Type' => 'application/json',
|
82
|
-
'project_id' => project_id,
|
83
|
-
'Authorization' => "key=#{@api_key}"
|
84
|
-
}
|
64
|
+
extra_headers = {
|
65
|
+
'project_id' => project_id
|
85
66
|
}
|
86
67
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
response = self.class.post('/notification', params.merge(@client_options))
|
68
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
|
69
|
+
response = connection.post('/gcm/notification', post_body.to_json)
|
70
|
+
build_response(response)
|
91
71
|
end
|
92
|
-
build_response(response)
|
93
72
|
end
|
94
73
|
alias add add_registration_ids
|
95
74
|
|
@@ -98,21 +77,14 @@ class FCM
|
|
98
77
|
notification_key_name: key_name,
|
99
78
|
notification_key: notification_key)
|
100
79
|
|
101
|
-
|
102
|
-
|
103
|
-
headers: {
|
104
|
-
'Content-Type' => 'application/json',
|
105
|
-
'project_id' => project_id,
|
106
|
-
'Authorization' => "key=#{@api_key}"
|
107
|
-
}
|
80
|
+
extra_headers = {
|
81
|
+
'project_id' => project_id
|
108
82
|
}
|
109
83
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
response = self.class.post('/notification', params.merge(@client_options))
|
84
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
|
85
|
+
response = connection.post('/gcm/notification', post_body.to_json)
|
86
|
+
build_response(response)
|
114
87
|
end
|
115
|
-
build_response(response)
|
116
88
|
end
|
117
89
|
alias remove remove_registration_ids
|
118
90
|
|
@@ -120,20 +92,17 @@ class FCM
|
|
120
92
|
params = {
|
121
93
|
query: {
|
122
94
|
notification_key_name: key_name
|
123
|
-
},
|
124
|
-
headers: {
|
125
|
-
'Content-Type' => 'application/json',
|
126
|
-
'project_id' => project_id,
|
127
|
-
'Authorization' => "key=#{@api_key}"
|
128
95
|
}
|
129
96
|
}
|
97
|
+
|
98
|
+
extra_headers = {
|
99
|
+
'project_id' => project_id
|
100
|
+
}
|
130
101
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
response = self.class.get('/notification', params.merge(@client_options))
|
102
|
+
for_uri(GROUP_NOTIFICATION_BASE_URI, extra_headers) do |connection|
|
103
|
+
response = connection.get('/gcm/notification', params)
|
104
|
+
build_response(response)
|
135
105
|
end
|
136
|
-
build_response(response)
|
137
106
|
end
|
138
107
|
|
139
108
|
def send_with_notification_key(notification_key, options = {})
|
@@ -142,20 +111,10 @@ class FCM
|
|
142
111
|
end
|
143
112
|
|
144
113
|
def topic_subscription(topic, registration_id)
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
'Content-Type' => 'application/json'
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
response = nil
|
153
|
-
|
154
|
-
for_uri(INSTANCE_ID_API) do
|
155
|
-
response = self.class.post("/#{registration_id}/rel/topics/#{topic}", params)
|
114
|
+
for_uri(INSTANCE_ID_API) do |connection|
|
115
|
+
response = connection.post("/iid/v1/#{registration_id}/rel/topics/#{topic}")
|
116
|
+
build_response(response)
|
156
117
|
end
|
157
|
-
|
158
|
-
build_response(response)
|
159
118
|
end
|
160
119
|
|
161
120
|
def batch_topic_subscription(topic, registration_ids)
|
@@ -168,31 +127,46 @@ class FCM
|
|
168
127
|
|
169
128
|
def manage_topics_relationship(topic, registration_ids, action)
|
170
129
|
body = { to: "/topics/#{topic}", registration_tokens: registration_ids }
|
171
|
-
params = {
|
172
|
-
body: body.to_json,
|
173
|
-
headers: {
|
174
|
-
'Authorization' => "key=#{@api_key}",
|
175
|
-
'Content-Type' => 'application/json'
|
176
|
-
}
|
177
|
-
}
|
178
130
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
response = self.class.post("/:batch#{action}", params)
|
131
|
+
for_uri(INSTANCE_ID_API) do |connection|
|
132
|
+
response = connection.post("/iid/v1:batch#{action}", body.to_json)
|
133
|
+
build_response(response)
|
183
134
|
end
|
184
|
-
|
185
|
-
build_response(response)
|
186
135
|
end
|
187
136
|
|
188
|
-
|
189
|
-
|
190
137
|
def send_to_topic(topic, options = {})
|
191
138
|
if topic.gsub(TOPIC_REGEX, "").length == 0
|
192
139
|
send_with_notification_key('/topics/' + topic, options)
|
193
140
|
end
|
194
141
|
end
|
195
142
|
|
143
|
+
def get_instance_id_info iid_token, options={}
|
144
|
+
params = {
|
145
|
+
query: options
|
146
|
+
}
|
147
|
+
|
148
|
+
for_uri(INSTANCE_ID_API) do |connection|
|
149
|
+
response = connection.get('/iid/info/'+iid_token, params)
|
150
|
+
build_response(response)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def subscribe_instance_id_to_topic iid_token, topic_name
|
155
|
+
batch_subscribe_instance_ids_to_topic([iid_token], topic_name)
|
156
|
+
end
|
157
|
+
|
158
|
+
def unsubscribe_instance_id_from_topic iid_token, topic_name
|
159
|
+
batch_unsubscribe_instance_ids_from_topic([iid_token], topic_name)
|
160
|
+
end
|
161
|
+
|
162
|
+
def batch_subscribe_instance_ids_to_topic instance_ids, topic_name
|
163
|
+
manage_topics_relationship(topic_name, instance_ids, 'Add')
|
164
|
+
end
|
165
|
+
|
166
|
+
def batch_unsubscribe_instance_ids_from_topic instance_ids, topic_name
|
167
|
+
manage_topics_relationship(topic_name, instance_ids, 'Remove')
|
168
|
+
end
|
169
|
+
|
196
170
|
def send_to_topic_condition(condition, options = {})
|
197
171
|
if validate_condition?(condition)
|
198
172
|
body = { condition: condition }.merge(options)
|
@@ -202,11 +176,16 @@ class FCM
|
|
202
176
|
|
203
177
|
private
|
204
178
|
|
205
|
-
def for_uri(uri)
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
179
|
+
def for_uri(uri, extra_headers = {})
|
180
|
+
connection = ::Faraday.new(:url => uri) do |faraday|
|
181
|
+
faraday.adapter Faraday.default_adapter
|
182
|
+
faraday.headers["Content-Type"] = "application/json"
|
183
|
+
faraday.headers["Authorization"] = "key=#{api_key}"
|
184
|
+
extra_headers.each do |key, value|
|
185
|
+
faraday.headers[key] = value
|
186
|
+
end
|
187
|
+
end
|
188
|
+
yield connection
|
210
189
|
end
|
211
190
|
|
212
191
|
def build_post_body(registration_ids, options = {})
|
@@ -216,8 +195,8 @@ class FCM
|
|
216
195
|
|
217
196
|
def build_response(response, registration_ids = [])
|
218
197
|
body = response.body || {}
|
219
|
-
response_hash = { body: body, headers: response.headers, status_code: response.
|
220
|
-
case response.
|
198
|
+
response_hash = { body: body, headers: response.headers, status_code: response.status }
|
199
|
+
case response.status
|
221
200
|
when 200
|
222
201
|
response_hash[:response] = 'success'
|
223
202
|
body = JSON.parse(body) unless body.empty?
|
@@ -260,16 +239,10 @@ class FCM
|
|
260
239
|
end
|
261
240
|
|
262
241
|
def execute_notification(body)
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
'Content-Type' => 'application/json'
|
268
|
-
}
|
269
|
-
}
|
270
|
-
|
271
|
-
response = self.class.post('/send', params.merge(@client_options))
|
272
|
-
build_response(response)
|
242
|
+
for_uri(BASE_URI) do |connection|
|
243
|
+
response = connection.post('/fcm/send', body.to_json)
|
244
|
+
build_response(response)
|
245
|
+
end
|
273
246
|
end
|
274
247
|
|
275
248
|
def has_canonical_id?(result)
|
data/spec/fcm_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe FCM do
|
4
|
-
let(:send_url) { "#{FCM
|
5
|
-
let(:group_notification_base_uri) { "
|
4
|
+
let(:send_url) { "#{FCM::BASE_URI}/fcm/send" }
|
5
|
+
let(:group_notification_base_uri) { "#{FCM::GROUP_NOTIFICATION_BASE_URI}/gcm/notification" }
|
6
6
|
let(:api_key) { 'AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA' }
|
7
7
|
let(:registration_id) { '42' }
|
8
8
|
let(:registration_ids) { ['42'] }
|
@@ -254,7 +254,7 @@ describe FCM do
|
|
254
254
|
|
255
255
|
it 'should not send notification due to 599' do
|
256
256
|
subject.send(registration_ids).should eq(body: '{"body-key" => "Body value"}',
|
257
|
-
headers: { 'header-key' =>
|
257
|
+
headers: { 'header-key' => 'Header value' },
|
258
258
|
response: 'There was an internal error in the FCM server while trying to process the request.',
|
259
259
|
status_code: 599)
|
260
260
|
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kashif Rasul
|
@@ -9,28 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-02-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: faraday
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - '='
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.10.0
|
20
|
+
version: 0.15.4
|
24
21
|
type: :runtime
|
25
22
|
prerelease: false
|
26
23
|
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0.10'
|
31
|
-
- - ">="
|
25
|
+
- - '='
|
32
26
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
27
|
+
version: 0.15.4
|
34
28
|
description: fcm provides ruby bindings to Firebase Cloud Messaging (FCM) a cross-platform
|
35
29
|
messaging solution that lets you reliably deliver messages and notifications at
|
36
30
|
no cost to Android, iOS or Web browsers.
|
@@ -71,8 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
65
|
- !ruby/object:Gem::Version
|
72
66
|
version: '0'
|
73
67
|
requirements: []
|
74
|
-
|
75
|
-
rubygems_version: 2.6.13
|
68
|
+
rubygems_version: 3.1.2
|
76
69
|
signing_key:
|
77
70
|
specification_version: 4
|
78
71
|
summary: Reliably deliver messages and notifications via FCM
|