gcm 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b91b8dd5c3122716b7790b84bf488997af4481b4
4
- data.tar.gz: c61dcbb7792c73561ae858d02ea792dac6e8f193
3
+ metadata.gz: 5b27baf730ba346c79357e983c7c44c03527300c
4
+ data.tar.gz: 4a2387383fd90c378bfb58ec669484b3255edfa0
5
5
  SHA512:
6
- metadata.gz: 88d2177d41c159d051057eea20c8171ab7fadb07cf5b2913005656df76fa3ddb5da451386ee299f8ca8884258b07eee1ea8f9f8e07d17b6f8151c501f918d8d6
7
- data.tar.gz: aba44c2d89ea740c2ccf0abfef14a4d05283a0a51e979d4b5c1160b23906e9c0c8ecf53b932b94704cf2f62fe8407b4c5dfe90cfb6750a78eb0f202e0aed8695
6
+ metadata.gz: 0ee69d0a009f6f99bc9cce3e7fc5f1462c709d1d10d53069d04ff7ff8abe618de869772f37a76614f532bf1e78f67b3ac84bd430aacf99e8436078af11f974cc
7
+ data.tar.gz: d1e2b6606961975e16aef602a58f006ae6cb5d17300ecc03168eae6966e11416599a816aa7b858499daf0724c4f16926a20a1c8674923e5159de4e779f5b36eb
@@ -2,4 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
- - 2.1.0
5
+ - 2.1.2
data/Gemfile CHANGED
@@ -2,6 +2,6 @@ source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
4
  gem 'rake'
5
- gem 'rspec', '~> 3.0.0.beta'
5
+ gem 'rspec'
6
6
  gem 'webmock'
7
- gem "ci_reporter"
7
+ gem 'ci_reporter_rspec'
data/README.md CHANGED
@@ -21,42 +21,92 @@ One of the following, tested Ruby versions:
21
21
 
22
22
  * `1.9.3`
23
23
  * `2.0.0`
24
- * `2.1.0`
24
+ * `2.1.2`
25
25
 
26
26
  ##Usage
27
27
 
28
- For your server to send a message to one or more devices, you must first initialize a new `GCM` class with your api key, and then call the `send_notification` method on this and give it 1 or more (up to 1000) registration IDs as an array of strings. You can also optionally send further [HTTP message parameters](http://developer.android.com/google/gcm/server.html#params) like `data` or `time_to_live` etc. as a hash via the second optional argument to `send_notification`.
28
+ For your server to send a message to one or more devices, you must first initialise a new `GCM` class with your [api key](https://developer.android.com/google/gcm/gs.html#access-key), and then call the `send` method on this and give it 1 or more (up to 1000) registration IDs as an array of strings. You can also optionally send further [HTTP message parameters](http://developer.android.com/google/gcm/server.html#params) like `data` or `time_to_live` etc. as a hash via the second optional argument to `send`.
29
29
 
30
30
  Example sending notifications:
31
31
 
32
32
  ```ruby
33
33
  require 'gcm'
34
34
 
35
- gcm = GCM.new(api_key)
35
+ gcm = GCM.new("my_api_key")
36
36
  # you can set option parameters in here
37
37
  # - all options are pass to HTTParty method arguments
38
38
  # - ref: https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L40-L68
39
- # gcm = GCM.new(api_key, timeout: 3)
39
+ # gcm = GCM.new("my_api_key", timeout: 3)
40
40
 
41
41
  registration_ids= ["12", "13"] # an array of one or more client registration IDs
42
42
  options = {data: {score: "123"}, collapse_key: "updated_score"}
43
- response = gcm.send_notification(registration_ids, options)
43
+ response = gcm.send(registration_ids, options)
44
44
  ```
45
45
 
46
46
  Currently `response` is just a hash containing the response `body`, `headers` and `status`. Check [here](http://developer.android.com/google/gcm/http.html#response) to see how to interpret the responses.
47
47
 
48
+ ## User Notifications
49
+
50
+ With [user notifications](http://developer.android.com/google/gcm/notifications.html), you can send a single message to multiple instance of an app running on devices owned by a single user. To use this feature, you will first need an initialised `GCM` class.
51
+
52
+ ### Generate a Notification Key
53
+ Then you will need a notification key which you can create for a particular `key_name` which needs to be uniquely named per app in case you have multiple apps for the same `project_id`. This ensures that notifications only go to the intended target app. The `create` method will do this and return the token `notification_key` in the response:
54
+
55
+ ```ruby
56
+ response = gcm.create(key_name: "appUser-Chris",
57
+ project_id: "my_project_id",
58
+ registration_ids:["4", "8", "15", "16", "23", "42"])
59
+ ```
60
+
61
+ ### Send to Notification Key
62
+ Now you can send a message to a particular `notification_key` via the `send` method. This allows the server to send a single data to multiple app instances (typically on multiple devices) owned by a single user (instead of sending to registration IDs). Note: the maximum number of members allowed for a `notification_key` is 10.
63
+
64
+ ```ruby
65
+ response = gcm.send([], {
66
+ notification_key: "appUser-Chris-key",
67
+ data: {score: "3x1"},
68
+ collapse_key: "updated_score"})
69
+ ```
70
+
71
+ ### Add/Remove Registration IDs
72
+
73
+ You can also add/remove registration IDs to/from a particular `notification_key` of some `project_id`. For example:
74
+
75
+ ```ruby
76
+ response = gcm.add(key_name: "appUser-Chris",
77
+ project_id: "my_project_id",
78
+ notification_key:"appUser-Chris-key"
79
+ registration_ids:["7", "3"])
80
+
81
+ response = gcm.remove(key_name: "appUser-Chris",
82
+ project_id: "my_project_id",
83
+ notification_key:"appUser-Chris-key"
84
+ registration_ids:["8", "15"])
85
+ ```
86
+
48
87
  ## Blog posts
49
88
 
50
- * [How to send iOS and Android notifications from your Rails backend](http://blog.wellwith.me/how-to-send-ios-and-android-notifications-from-your-rails-backend)
89
+ * [How to send iOS and Android notifications from your Rails backend](http://juretriglav.si/how-to-send-ios-and-android-notifications-from-your-rails-backend/)
90
+ * [Как отправлять push уведомления из Вашего Rails приложения](http://habrahabr.ru/post/214607/)
91
+ * [GCM – 서버 만들기](http://susemi99.kr/1023)
92
+ * [ruby から gcm を使って android 端末へメッセージを送信する](http://qiita.com/ma2saka/items/5852308b7c2855eef552)
93
+
94
+ ## Android Client
95
+
96
+ You can find an Android Client app to receive notifications from here: [Google Cloud Message - Client Android](https://github.com/mikebolivar/gcm)
51
97
 
52
98
  ## ChangeLog
53
99
 
100
+ ## 0.0.8
101
+ * Added support for User Notifications API
102
+ * Added alias method `send` for `send_notification`
103
+
54
104
  ## 0.0.7
55
105
  * All responses now have a body and header hashes
56
106
 
57
107
  ### 0.0.6
58
108
 
59
- * You can initialize GCM class with [HTTParty Options](https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L40-L68)
109
+ * You can initialise GCM class with [HTTParty Options](https://github.com/jnunemaker/httparty/blob/master/lib/httparty.rb#L41-L69)
60
110
 
61
111
  ### 0.0.5
62
112
 
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "gcm"
6
- s.version = "0.0.7"
6
+ s.version = "0.0.8"
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/gcm.rb CHANGED
@@ -4,8 +4,7 @@ require 'json'
4
4
 
5
5
  class GCM
6
6
  include HTTParty
7
- PUSH_URL = 'https://android.googleapis.com/gcm/send'
8
- base_uri PUSH_URL
7
+ base_uri 'https://android.googleapis.com/gcm'
9
8
  default_timeout 30
10
9
  format :json
11
10
 
@@ -26,8 +25,8 @@ class GCM
26
25
  # "time": "15:10"
27
26
  # }
28
27
  # }
29
- # gcm = GCM.new(api_key)
30
- # gcm.send_notification({registration_ids: ["4sdsx", "8sdsd"], data: {score: "5x1"}})
28
+ # gcm = GCM.new("API_KEY")
29
+ # gcm.send(registration_ids: ["4sdsx", "8sdsd"], {data: {score: "5x1"}})
31
30
  def send_notification(registration_ids, options = {})
32
31
  post_body = build_post_body(registration_ids, options)
33
32
 
@@ -38,9 +37,69 @@ class GCM
38
37
  'Content-Type' => 'application/json',
39
38
  }
40
39
  }
41
- response = self.class.post('', params.merge(@client_options))
40
+ response = self.class.post('/send', params.merge(@client_options))
42
41
  build_response(response, registration_ids)
43
42
  end
43
+ alias_method :send, :send_notification
44
+
45
+ def create_notification_key(key_name, project_id, registration_ids=[])
46
+ post_body = build_post_body(registration_ids, {
47
+ :operation => "create",
48
+ :notification_key_name => key_name})
49
+
50
+ params = {
51
+ :body => post_body.to_json,
52
+ :headers => {
53
+ 'Content-Type' => 'application/json',
54
+ 'project_id' => project_id,
55
+ 'Authorization' => "key=#{@api_key}"
56
+ }
57
+ }
58
+
59
+ response = self.class.post('/notification', params.merge(@client_options))
60
+ build_response(response)
61
+ end
62
+ alias_method :create, :create_notification_key
63
+
64
+ def add_registration_ids(key_name, project_id, notification_key, registration_ids)
65
+ post_body = build_post_body(registration_ids, {
66
+ :operation => "add",
67
+ :notification_key_name => key_name,
68
+ :notification_key => notification_key})
69
+
70
+ params = {
71
+ :body => post_body.to_json,
72
+ :headers => {
73
+ 'Content-Type' => 'application/json',
74
+ 'project_id' => project_id,
75
+ 'Authorization' => "key=#{@api_key}"
76
+ }
77
+ }
78
+
79
+ response = self.class.post('/notification', params.merge(@client_options))
80
+ build_response(response)
81
+ end
82
+ alias_method :add, :add_registration_ids
83
+
84
+ def remove_registration_ids(key_name, project_id, notification_key, registration_ids)
85
+ post_body = build_post_body(registration_ids, {
86
+ :operation => "remove",
87
+ :notification_key_name => key_name,
88
+ :notification_key => notification_key})
89
+
90
+ params = {
91
+ :body => post_body.to_json,
92
+ :headers => {
93
+ 'Content-Type' => 'application/json',
94
+ 'project_id' => project_id,
95
+ 'Authorization' => "key=#{@api_key}"
96
+ }
97
+ }
98
+
99
+ response = self.class.post('/notification', params.merge(@client_options))
100
+ build_response(response)
101
+ end
102
+ alias_method :remove, :remove_registration_ids
44
103
 
45
104
  private
46
105
 
@@ -48,13 +107,13 @@ class GCM
48
107
  { :registration_ids => registration_ids }.merge(options)
49
108
  end
50
109
 
51
- def build_response(response, registration_ids)
110
+ def build_response(response, registration_ids=[])
52
111
  body = response.body || {}
53
112
  response_hash = {:body => body, :headers => response.headers, :status_code => response.code}
54
113
  case response.code
55
114
  when 200
56
115
  response_hash[:response] = 'success'
57
- response_hash[:canonical_ids] = build_canonical_ids(body, registration_ids)
116
+ response_hash[:canonical_ids] = build_canonical_ids(body, registration_ids) unless registration_ids.empty?
58
117
  when 400
59
118
  response_hash[:response] = 'Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.'
60
119
  when 401
@@ -1,6 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GCM do
4
+ let(:send_url) { "#{GCM::base_uri}/send" }
5
+
4
6
  it "should raise an error if the api key is not provided" do
5
7
  expect {GCM.new}.to raise_error
6
8
  end
@@ -22,8 +24,8 @@ describe GCM do
22
24
  }
23
25
  end
24
26
 
25
- let(:stub_gcm_request) do
26
- stub_request(:post, GCM::PUSH_URL).with(
27
+ let(:stub_gcm_send_request) do
28
+ stub_request(:post, send_url).with(
27
29
  :body => valid_request_body.to_json,
28
30
  :headers => valid_request_headers
29
31
  ).to_return(
@@ -34,33 +36,33 @@ describe GCM do
34
36
  )
35
37
  end
36
38
 
37
- let(:stub_gcm_request_with_basic_auth) do
38
- uri = URI.parse(GCM::PUSH_URL)
39
+ let(:stub_gcm_send_request_with_basic_auth) do
40
+ uri = URI.parse(send_url)
39
41
  uri.user = 'a'
40
42
  uri.password = 'b'
41
43
  stub_request(:post, uri.to_s).to_return(:body => {}, :headers => {}, :status => 200)
42
44
  end
43
45
 
44
46
  before(:each) do
45
- stub_gcm_request
46
- stub_gcm_request_with_basic_auth
47
+ stub_gcm_send_request
48
+ stub_gcm_send_request_with_basic_auth
47
49
  end
48
50
 
49
51
  it "should send notification using POST to GCM server" do
50
52
  gcm = GCM.new(api_key)
51
- gcm.send_notification(registration_ids).should eq({:response => 'success', :body => {}, :headers => {}, :status_code => 200, :canonical_ids => []})
52
- stub_gcm_request.should have_been_made.times(1)
53
+ gcm.send(registration_ids).should eq({:response => 'success', :body => {}, :headers => {}, :status_code => 200, :canonical_ids => []})
54
+ stub_gcm_send_request.should have_been_made.times(1)
53
55
  end
54
56
 
55
57
  it "should use basic authentication provided by options" do
56
58
  gcm = GCM.new(api_key, basic_auth: {username: 'a', password: 'b'})
57
- gcm.send_notification(registration_ids).should eq({:response => 'success', :body => {}, :headers => {}, :status_code => 200, :canonical_ids => []})
58
- stub_gcm_request_with_basic_auth.should have_been_made.times(1)
59
+ gcm.send(registration_ids).should eq({:response => 'success', :body => {}, :headers => {}, :status_code => 200, :canonical_ids => []})
60
+ stub_gcm_send_request_with_basic_auth.should have_been_made.times(1)
59
61
  end
60
62
 
61
63
  context "send notification with data" do
62
64
  let!(:stub_with_data){
63
- stub_request(:post, GCM::PUSH_URL).
65
+ stub_request(:post, send_url).
64
66
  with(:body => "{\"registration_ids\":[\"42\"],\"data\":{\"score\":\"5x1\",\"time\":\"15:10\"}}",
65
67
  :headers => valid_request_headers ).
66
68
  to_return(:status => 200, :body => "", :headers => {})
@@ -69,7 +71,7 @@ describe GCM do
69
71
  end
70
72
  it "should send the data in a post request to gcm" do
71
73
  gcm = GCM.new(api_key)
72
- gcm.send_notification(registration_ids, { :data => { :score => "5x1", :time => "15:10"} })
74
+ gcm.send(registration_ids, { :data => { :score => "5x1", :time => "15:10"} })
73
75
  stub_with_data.should have_been_requested
74
76
  end
75
77
  end
@@ -87,7 +89,7 @@ describe GCM do
87
89
 
88
90
  context "on failure code 400" do
89
91
  before do
90
- stub_request(:post, GCM::PUSH_URL).with(
92
+ stub_request(:post, send_url).with(
91
93
  mock_request_attributes
92
94
  ).to_return(
93
95
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
@@ -97,7 +99,7 @@ describe GCM do
97
99
  )
98
100
  end
99
101
  it "should not send notification due to 400" do
100
- subject.send_notification(registration_ids).should eq({
102
+ subject.send(registration_ids).should eq({
101
103
  :body => {},
102
104
  :headers => {},
103
105
  :response => "Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields.",
@@ -108,7 +110,7 @@ describe GCM do
108
110
 
109
111
  context "on failure code 401" do
110
112
  before do
111
- stub_request(:post, GCM::PUSH_URL).with(
113
+ stub_request(:post, send_url).with(
112
114
  mock_request_attributes
113
115
  ).to_return(
114
116
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
@@ -119,7 +121,7 @@ describe GCM do
119
121
  end
120
122
 
121
123
  it "should not send notification due to 401" do
122
- subject.send_notification(registration_ids).should eq({
124
+ subject.send(registration_ids).should eq({
123
125
  :body => {},
124
126
  :headers => {},
125
127
  :response => "There was an error authenticating the sender account.",
@@ -130,7 +132,7 @@ describe GCM do
130
132
 
131
133
  context "on failure code 503" do
132
134
  before do
133
- stub_request(:post, GCM::PUSH_URL).with(
135
+ stub_request(:post, send_url).with(
134
136
  mock_request_attributes
135
137
  ).to_return(
136
138
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
@@ -141,7 +143,7 @@ describe GCM do
141
143
  end
142
144
 
143
145
  it "should not send notification due to 503" do
144
- subject.send_notification(registration_ids).should eq({
146
+ subject.send(registration_ids).should eq({
145
147
  :body => {},
146
148
  :headers => {},
147
149
  :response => 'Server is temporarily unavailable.',
@@ -152,7 +154,7 @@ describe GCM do
152
154
 
153
155
  context "on failure code 5xx" do
154
156
  before do
155
- stub_request(:post, GCM::PUSH_URL).with(
157
+ stub_request(:post, send_url).with(
156
158
  mock_request_attributes
157
159
  ).to_return(
158
160
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
@@ -163,7 +165,7 @@ describe GCM do
163
165
  end
164
166
 
165
167
  it "should not send notification due to 599" do
166
- subject.send_notification(registration_ids).should eq({
168
+ subject.send(registration_ids).should eq({
167
169
  :body => { "body-key" => "Body value" },
168
170
  :headers => { "header-key" => ["Header value"] },
169
171
  :response => 'There was an internal error in the GCM server while trying to process the request.',
@@ -192,7 +194,7 @@ describe GCM do
192
194
 
193
195
 
194
196
  before do
195
- stub_request(:post, GCM::PUSH_URL).with(
197
+ stub_request(:post, send_url).with(
196
198
  mock_request_attributes
197
199
  ).to_return(
198
200
  # ref: http://developer.android.com/guide/google/gcm/gcm.html#success
@@ -203,7 +205,7 @@ describe GCM do
203
205
  end
204
206
 
205
207
  it "should contain canonical_ids" do
206
- response = subject.send_notification(registration_ids)
208
+ response = subject.send(registration_ids)
207
209
 
208
210
  response.should eq({
209
211
  :headers => {},
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
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: 2014-02-14 00:00:00.000000000 Z
12
+ date: 2014-08-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  version: '0'
80
80
  requirements: []
81
81
  rubyforge_project: gcm
82
- rubygems_version: 2.2.1
82
+ rubygems_version: 2.2.2
83
83
  signing_key:
84
84
  specification_version: 4
85
85
  summary: send data to Android applications on Android devices