rpush 3.1.1 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +24 -0
- data/lib/generators/rpush_migration_generator.rb +1 -0
- data/lib/generators/templates/rpush_3_2_0_add_apns_p8.rb +15 -0
- data/lib/rpush.rb +1 -0
- data/lib/rpush/client/active_model.rb +3 -0
- data/lib/rpush/client/active_model/apnsp8/app.rb +23 -0
- data/lib/rpush/client/active_model/apnsp8/notification.rb +9 -0
- data/lib/rpush/client/active_record.rb +3 -0
- data/lib/rpush/client/active_record/apnsp8/app.rb +11 -0
- data/lib/rpush/client/active_record/apnsp8/notification.rb +10 -0
- data/lib/rpush/client/redis.rb +3 -0
- data/lib/rpush/client/redis/apnsp8/app.rb +11 -0
- data/lib/rpush/client/redis/apnsp8/notification.rb +11 -0
- data/lib/rpush/client/redis/app.rb +5 -1
- data/lib/rpush/daemon.rb +5 -0
- data/lib/rpush/daemon/apnsp8.rb +10 -0
- data/lib/rpush/daemon/apnsp8/delivery.rb +166 -0
- data/lib/rpush/daemon/apnsp8/token.rb +33 -0
- data/lib/rpush/daemon/dispatcher/apnsp8_http2.rb +33 -0
- data/lib/rpush/daemon/service_config_methods.rb +2 -1
- data/lib/rpush/version.rb +2 -2
- data/spec/support/active_record_setup.rb +3 -1
- metadata +27 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2177b25e8710a0539b82b9bade18da563e0b1b1f5509da42be346969a909e83b
|
4
|
+
data.tar.gz: 2c46fec2c2c9858caf0447e2dc5843fae5249edc5b08604141ea3ecbaa95fb5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c45d7e698704104dc19487636dba80a7278b739a6377d091b334ecedbe90c9b8475f08329e4a767e2ad45d7c3e9981d927558dd21c09e9de7c3cba20fb825993
|
7
|
+
data.tar.gz: 2ae04d72abc05c39c16605f545f78a2a8e829a60a1c6280b68df4e66d28d4c522e47b29ef9b259c18bf2e9b61c90955a686af07582d6426b679c2550851dc16e
|
data/CHANGELOG.md
CHANGED
@@ -12,8 +12,22 @@
|
|
12
12
|
|
13
13
|
- None
|
14
14
|
|
15
|
+
## 3.2.0 (2018-06-13)
|
16
|
+
|
17
|
+
When upgrading, don't forget to run `bundle exec rpush init` to get all the latest migrations.
|
18
|
+
|
19
|
+
### Breaking Changes
|
20
|
+
|
21
|
+
- None
|
22
|
+
|
23
|
+
### Added
|
24
|
+
|
25
|
+
- Added support for P8 certificate Apple push notifications [#386](https://github.com/rpush/rpush/pull/386) (by [@mariannegru](https://github.com/mariannegru)
|
26
|
+
|
15
27
|
## 3.1.1 (2018-04-16)
|
16
28
|
|
29
|
+
When upgrading, don't forget to run `bundle exec rpush init` to get all the latest migrations.
|
30
|
+
|
17
31
|
### Breaking Changes
|
18
32
|
|
19
33
|
- None
|
data/README.md
CHANGED
@@ -80,10 +80,34 @@ You should also implement the [ssl_certificate_will_expire](https://github.com/r
|
|
80
80
|
|
81
81
|
To use the newer APNs Api replace `Rpush::Apns::App` with `Rpush::Apns2::App`.
|
82
82
|
|
83
|
+
To use the p8 APNs Api replace `Rpush::Apns::App` with `Rpush::Apnsp8::App`.
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
app = Rpush::Apnsp8::App.new
|
87
|
+
app.name = "ios_app"
|
88
|
+
app.apn_key = File.read("/path/to/sandbox.p8")
|
89
|
+
app.environment = "development" # APNs environment.
|
90
|
+
app.apn_key_id = "APN KEY ID"
|
91
|
+
app.team_id = "TEAM ID"
|
92
|
+
app.bundle_id = "BUNDLE ID"
|
93
|
+
app.connections = 1
|
94
|
+
app.save!
|
95
|
+
```
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
n = Rpush::Apns::Notification.new
|
99
|
+
n.app = Rpush::Apnsp8::App.find_by_name("ios_app")
|
100
|
+
n.device_token = "..." # 64-character hex string
|
101
|
+
n.alert = "hi mom!"
|
102
|
+
n.data = { foo: :bar }
|
103
|
+
n.save!
|
104
|
+
```
|
83
105
|
#### Firebase Cloud Messaging
|
84
106
|
|
85
107
|
FCM and GCM are – as of writing – compatible with each other. See also [this comment](https://github.com/rpush/rpush/issues/284#issuecomment-228330206) for further references.
|
86
108
|
|
109
|
+
Please refer to the Firebase Console on where to find your `auth_key` (probably called _Server Key_ there). To verify you have the right key, use tools like [Postman](https://www.getpostman.com/), [HTTPie](https://httpie.org/), `curl` or similar before reporting a new issue. See also [this comment](https://github.com/rpush/rpush/issues/346#issuecomment-289218776).
|
110
|
+
|
87
111
|
```ruby
|
88
112
|
app = Rpush::Gcm::App.new
|
89
113
|
app.name = "android_app"
|
@@ -46,6 +46,7 @@ class RpushMigrationGenerator < Rails::Generators::Base
|
|
46
46
|
add_rpush_migration('rpush_3_0_1_updates')
|
47
47
|
add_rpush_migration('rpush_3_1_0_add_pushy')
|
48
48
|
add_rpush_migration('rpush_3_1_1_updates')
|
49
|
+
add_rpush_migration('rpush_3_2_0_add_apns_p8')
|
49
50
|
end
|
50
51
|
|
51
52
|
protected
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Rpush320AddApnsP8 < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :rpush_apps, :apn_key, :string, null: true
|
4
|
+
add_column :rpush_apps, :apn_key_id, :string, null: true
|
5
|
+
add_column :rpush_apps, :team_id, :string, null: true
|
6
|
+
add_column :rpush_apps, :bundle_id, :string, null: true
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.down
|
10
|
+
remove_column :rpush_apps, :apn_key
|
11
|
+
remove_column :rpush_apps, :apn_key_id
|
12
|
+
remove_column :rpush_apps, :team_id
|
13
|
+
remove_column :rpush_apps, :bundle_id
|
14
|
+
end
|
15
|
+
end
|
data/lib/rpush.rb
CHANGED
@@ -12,6 +12,9 @@ require 'rpush/client/active_model/apns/notification'
|
|
12
12
|
require 'rpush/client/active_model/apns2/app'
|
13
13
|
require 'rpush/client/active_model/apns2/notification'
|
14
14
|
|
15
|
+
require 'rpush/client/active_model/apnsp8/app'
|
16
|
+
require 'rpush/client/active_model/apnsp8/notification'
|
17
|
+
|
15
18
|
require 'rpush/client/active_model/adm/data_validator'
|
16
19
|
require 'rpush/client/active_model/adm/app'
|
17
20
|
require 'rpush/client/active_model/adm/notification'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Rpush
|
2
|
+
module Client
|
3
|
+
module ActiveModel
|
4
|
+
module Apnsp8
|
5
|
+
module App
|
6
|
+
def self.included(base)
|
7
|
+
base.instance_eval do
|
8
|
+
validates :environment, presence: true, inclusion: { in: %w(development production sandbox) }
|
9
|
+
validates :apn_key, presence: true
|
10
|
+
validates :apn_key_id, presence: true
|
11
|
+
validates :team_id, presence: true
|
12
|
+
validates :bundle_id, presence: true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def service_name
|
17
|
+
'apnsp8'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -12,6 +12,9 @@ require 'rpush/client/active_record/apns/app'
|
|
12
12
|
require 'rpush/client/active_record/apns2/notification'
|
13
13
|
require 'rpush/client/active_record/apns2/app'
|
14
14
|
|
15
|
+
require 'rpush/client/active_record/apnsp8/notification'
|
16
|
+
require 'rpush/client/active_record/apnsp8/app'
|
17
|
+
|
15
18
|
require 'rpush/client/active_record/gcm/notification'
|
16
19
|
require 'rpush/client/active_record/gcm/app'
|
17
20
|
|
data/lib/rpush/client/redis.rb
CHANGED
@@ -24,6 +24,9 @@ require 'rpush/client/redis/apns/feedback'
|
|
24
24
|
require 'rpush/client/redis/apns2/app'
|
25
25
|
require 'rpush/client/redis/apns2/notification'
|
26
26
|
|
27
|
+
require 'rpush/client/redis/apnsp8/app'
|
28
|
+
require 'rpush/client/redis/apnsp8/notification'
|
29
|
+
|
27
30
|
require 'rpush/client/redis/gcm/app'
|
28
31
|
require 'rpush/client/redis/gcm/notification'
|
29
32
|
|
@@ -14,7 +14,11 @@ module Rpush
|
|
14
14
|
attribute :client_id, :string
|
15
15
|
attribute :client_secret, :string
|
16
16
|
attribute :api_key, :string
|
17
|
-
|
17
|
+
attribute :apn_key, :string
|
18
|
+
attribute :apn_key_id, :string
|
19
|
+
attribute :team_id, :string
|
20
|
+
attribute :bundle_id, :string
|
21
|
+
|
18
22
|
index :name
|
19
23
|
|
20
24
|
validates :name, presence: true
|
data/lib/rpush/daemon.rb
CHANGED
@@ -25,6 +25,7 @@ require 'rpush/daemon/dispatcher/http'
|
|
25
25
|
require 'rpush/daemon/dispatcher/tcp'
|
26
26
|
require 'rpush/daemon/dispatcher/apns_tcp'
|
27
27
|
require 'rpush/daemon/dispatcher/apns_http2'
|
28
|
+
require 'rpush/daemon/dispatcher/apnsp8_http2'
|
28
29
|
require 'rpush/daemon/service_config_methods'
|
29
30
|
require 'rpush/daemon/retry_header_parser'
|
30
31
|
require 'rpush/daemon/ring_buffer'
|
@@ -44,6 +45,10 @@ require 'rpush/daemon/apns'
|
|
44
45
|
require 'rpush/daemon/apns2/delivery'
|
45
46
|
require 'rpush/daemon/apns2'
|
46
47
|
|
48
|
+
require 'rpush/daemon/apnsp8/delivery'
|
49
|
+
require 'rpush/daemon/apnsp8/token'
|
50
|
+
require 'rpush/daemon/apnsp8'
|
51
|
+
|
47
52
|
require 'rpush/daemon/gcm/delivery'
|
48
53
|
require 'rpush/daemon/gcm'
|
49
54
|
|
@@ -0,0 +1,166 @@
|
|
1
|
+
module Rpush
|
2
|
+
module Daemon
|
3
|
+
module Apnsp8
|
4
|
+
# https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
|
5
|
+
|
6
|
+
HTTP2_HEADERS_KEY = 'headers'
|
7
|
+
|
8
|
+
class Delivery < Rpush::Daemon::Delivery
|
9
|
+
RETRYABLE_CODES = [ 429, 500, 503 ]
|
10
|
+
|
11
|
+
def initialize(app, http2_client, token_provider, batch)
|
12
|
+
@app = app
|
13
|
+
@client = http2_client
|
14
|
+
@batch = batch
|
15
|
+
@first_push = true
|
16
|
+
@token_provider = token_provider
|
17
|
+
end
|
18
|
+
|
19
|
+
def perform
|
20
|
+
@client.on(:error) { |err| mark_batch_retryable(Time.now + 10.seconds, err) }
|
21
|
+
|
22
|
+
@batch.each_notification do |notification|
|
23
|
+
prepare_async_post(notification)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Send all preprocessed requests at once
|
27
|
+
@client.join
|
28
|
+
rescue Errno::ECONNREFUSED, SocketError, HTTP2::Error::StreamLimitExceeded => error
|
29
|
+
# TODO restart connection when StreamLimitExceeded
|
30
|
+
mark_batch_retryable(Time.now + 10.seconds, error)
|
31
|
+
raise
|
32
|
+
rescue StandardError => error
|
33
|
+
mark_batch_failed(error)
|
34
|
+
raise
|
35
|
+
ensure
|
36
|
+
@batch.all_processed
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
######################################################################
|
41
|
+
|
42
|
+
def prepare_async_post(notification)
|
43
|
+
response = {}
|
44
|
+
|
45
|
+
request = build_request(notification)
|
46
|
+
log_warn(request)
|
47
|
+
http_request = @client.prepare_request(:post, request[:path],
|
48
|
+
body: request[:body],
|
49
|
+
headers: request[:headers]
|
50
|
+
)
|
51
|
+
|
52
|
+
http_request.on(:headers) do |hdrs|
|
53
|
+
response[:code] = hdrs[':status'].to_i
|
54
|
+
end
|
55
|
+
|
56
|
+
http_request.on(:body_chunk) do |body_chunk|
|
57
|
+
next unless body_chunk.present?
|
58
|
+
|
59
|
+
response[:failure_reason] = JSON.parse(body_chunk)['reason']
|
60
|
+
end
|
61
|
+
|
62
|
+
http_request.on(:close) { handle_response(notification, response) }
|
63
|
+
|
64
|
+
if @first_push
|
65
|
+
@first_push = false
|
66
|
+
@client.call_async(http_request)
|
67
|
+
else
|
68
|
+
delayed_push_async(http_request)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def delayed_push_async(http_request)
|
73
|
+
until streams_available? do
|
74
|
+
sleep 0.001
|
75
|
+
end
|
76
|
+
@client.call_async(http_request)
|
77
|
+
end
|
78
|
+
|
79
|
+
def streams_available?
|
80
|
+
remote_max_concurrent_streams - @client.stream_count > 0
|
81
|
+
end
|
82
|
+
|
83
|
+
def remote_max_concurrent_streams
|
84
|
+
# 0x7fffffff is the default value from http-2 gem (2^31)
|
85
|
+
if @client.remote_settings[:settings_max_concurrent_streams] == 0x7fffffff
|
86
|
+
0
|
87
|
+
else
|
88
|
+
@client.remote_settings[:settings_max_concurrent_streams]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def handle_response(notification, response)
|
93
|
+
code = response[:code]
|
94
|
+
case code
|
95
|
+
when 200
|
96
|
+
ok(notification)
|
97
|
+
when *RETRYABLE_CODES
|
98
|
+
service_unavailable(notification, response)
|
99
|
+
else
|
100
|
+
reflect(:notification_id_failed,
|
101
|
+
@app,
|
102
|
+
notification.id, code,
|
103
|
+
response[:failure_reason])
|
104
|
+
@batch.mark_failed(notification, response[:code], response[:failure_reason])
|
105
|
+
failed_message_to_log(notification, response)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def ok(notification)
|
110
|
+
log_info("#{notification.id} sent to #{notification.device_token}")
|
111
|
+
@batch.mark_delivered(notification)
|
112
|
+
end
|
113
|
+
|
114
|
+
def service_unavailable(notification, response)
|
115
|
+
@batch.mark_retryable(notification, Time.now + 10.seconds)
|
116
|
+
# Logs should go last as soon as we need to initialize
|
117
|
+
# retry time to display it in log
|
118
|
+
failed_message_to_log(notification, response)
|
119
|
+
retry_message_to_log(notification)
|
120
|
+
end
|
121
|
+
|
122
|
+
def build_request(notification)
|
123
|
+
{
|
124
|
+
path: "/3/device/#{notification.device_token}",
|
125
|
+
headers: prepare_headers(notification),
|
126
|
+
body: prepare_body(notification)
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
def prepare_body(notification)
|
131
|
+
hash = notification.as_json.except(HTTP2_HEADERS_KEY)
|
132
|
+
JSON.dump(hash).force_encoding(Encoding::BINARY)
|
133
|
+
end
|
134
|
+
|
135
|
+
def prepare_headers(notification)
|
136
|
+
jwt_token = @token_provider.token
|
137
|
+
|
138
|
+
headers = {}
|
139
|
+
|
140
|
+
headers['content-type'] = 'application/json'
|
141
|
+
headers['apns-expiration'] = '0'
|
142
|
+
headers['apns-priority'] = '10'
|
143
|
+
headers['apns-topic'] = @app.bundle_id
|
144
|
+
headers['authorization'] = "bearer #{jwt_token}"
|
145
|
+
|
146
|
+
headers.merge notification_data(notification)[HTTP2_HEADERS_KEY] || {}
|
147
|
+
end
|
148
|
+
|
149
|
+
def notification_data(notification)
|
150
|
+
notification.data || {}
|
151
|
+
end
|
152
|
+
|
153
|
+
def retry_message_to_log(notification)
|
154
|
+
log_warn("Notification #{notification.id} will be retried after "\
|
155
|
+
"#{notification.deliver_after.strftime('%Y-%m-%d %H:%M:%S')} "\
|
156
|
+
"(retry #{notification.retries}).")
|
157
|
+
end
|
158
|
+
|
159
|
+
def failed_message_to_log(notification, response)
|
160
|
+
log_error("Notification #{notification.id} failed, "\
|
161
|
+
"#{response[:code]}/#{response[:failure_reason]}")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Rpush
|
2
|
+
module Daemon
|
3
|
+
module Apnsp8
|
4
|
+
TOKEN_TTL = 30 * 60
|
5
|
+
class Token
|
6
|
+
|
7
|
+
def initialize(app)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def token
|
12
|
+
if @cached_token && !expired_token?
|
13
|
+
@cached_token
|
14
|
+
else
|
15
|
+
new_token
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def new_token
|
22
|
+
@cached_token_at = Time.now
|
23
|
+
ec_key = OpenSSL::PKey::EC.new(@app.apn_key)
|
24
|
+
@cached_token = JWT.encode({iss: @app.team_id, iat: Time.now.to_i}, ec_key, 'ES256', {alg: 'ES256', kid: @app.apn_key_id})
|
25
|
+
end
|
26
|
+
|
27
|
+
def expired_token?
|
28
|
+
Time.now - @cached_token_at >= TOKEN_TTL
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Rpush
|
2
|
+
module Daemon
|
3
|
+
module Dispatcher
|
4
|
+
class Apnsp8Http2
|
5
|
+
|
6
|
+
URLS = {
|
7
|
+
production: 'https://api.push.apple.com',
|
8
|
+
development: 'https://api.development.push.apple.com'
|
9
|
+
}
|
10
|
+
|
11
|
+
DEFAULT_TIMEOUT = 60
|
12
|
+
|
13
|
+
def initialize(app, delivery_class, _options = {})
|
14
|
+
@app = app
|
15
|
+
@delivery_class = delivery_class
|
16
|
+
|
17
|
+
url = URLS[app.environment.to_sym]
|
18
|
+
@client = NetHttp2::Client.new(url, connect_timeout: DEFAULT_TIMEOUT)
|
19
|
+
@token_provider = Rpush::Daemon::Apnsp8::Token.new(@app)
|
20
|
+
end
|
21
|
+
|
22
|
+
def dispatch(payload)
|
23
|
+
|
24
|
+
@delivery_class.new(@app, @client, @token_provider, payload.batch).perform
|
25
|
+
end
|
26
|
+
|
27
|
+
def cleanup
|
28
|
+
@client.close
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -5,7 +5,8 @@ module Rpush
|
|
5
5
|
http: Rpush::Daemon::Dispatcher::Http,
|
6
6
|
tcp: Rpush::Daemon::Dispatcher::Tcp,
|
7
7
|
apns_tcp: Rpush::Daemon::Dispatcher::ApnsTcp,
|
8
|
-
apns_http2: Rpush::Daemon::Dispatcher::ApnsHttp2
|
8
|
+
apns_http2: Rpush::Daemon::Dispatcher::ApnsHttp2,
|
9
|
+
apnsp8_http2: Rpush::Daemon::Dispatcher::Apnsp8Http2
|
9
10
|
}
|
10
11
|
|
11
12
|
def batch_deliveries(value = nil)
|
data/lib/rpush/version.rb
CHANGED
@@ -35,6 +35,7 @@ require 'generators/templates/rpush_3_0_0_updates'
|
|
35
35
|
require 'generators/templates/rpush_3_0_1_updates'
|
36
36
|
require 'generators/templates/rpush_3_1_0_add_pushy'
|
37
37
|
require 'generators/templates/rpush_3_1_1_updates'
|
38
|
+
require 'generators/templates/rpush_3_2_0_add_apns_p8'
|
38
39
|
|
39
40
|
migrations = [
|
40
41
|
AddRpush,
|
@@ -45,7 +46,8 @@ migrations = [
|
|
45
46
|
Rpush300Updates,
|
46
47
|
Rpush301Updates,
|
47
48
|
Rpush310AddPushy,
|
48
|
-
Rpush311Updates
|
49
|
+
Rpush311Updates,
|
50
|
+
Rpush320AddApnsP8
|
49
51
|
]
|
50
52
|
|
51
53
|
unless ENV['TRAVIS']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpush
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Leitch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jwt
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.5.6
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.5.6
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: activesupport
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -372,6 +386,7 @@ files:
|
|
372
386
|
- lib/generators/templates/rpush_3_0_1_updates.rb
|
373
387
|
- lib/generators/templates/rpush_3_1_0_add_pushy.rb
|
374
388
|
- lib/generators/templates/rpush_3_1_1_updates.rb
|
389
|
+
- lib/generators/templates/rpush_3_2_0_add_apns_p8.rb
|
375
390
|
- lib/rpush.rb
|
376
391
|
- lib/rpush/apns_feedback.rb
|
377
392
|
- lib/rpush/cli.rb
|
@@ -385,6 +400,8 @@ files:
|
|
385
400
|
- lib/rpush/client/active_model/apns/notification.rb
|
386
401
|
- lib/rpush/client/active_model/apns2/app.rb
|
387
402
|
- lib/rpush/client/active_model/apns2/notification.rb
|
403
|
+
- lib/rpush/client/active_model/apnsp8/app.rb
|
404
|
+
- lib/rpush/client/active_model/apnsp8/notification.rb
|
388
405
|
- lib/rpush/client/active_model/gcm/app.rb
|
389
406
|
- lib/rpush/client/active_model/gcm/expiry_collapse_key_mutual_inclusion_validator.rb
|
390
407
|
- lib/rpush/client/active_model/gcm/notification.rb
|
@@ -406,6 +423,8 @@ files:
|
|
406
423
|
- lib/rpush/client/active_record/apns/notification.rb
|
407
424
|
- lib/rpush/client/active_record/apns2/app.rb
|
408
425
|
- lib/rpush/client/active_record/apns2/notification.rb
|
426
|
+
- lib/rpush/client/active_record/apnsp8/app.rb
|
427
|
+
- lib/rpush/client/active_record/apnsp8/notification.rb
|
409
428
|
- lib/rpush/client/active_record/app.rb
|
410
429
|
- lib/rpush/client/active_record/gcm/app.rb
|
411
430
|
- lib/rpush/client/active_record/gcm/notification.rb
|
@@ -426,6 +445,8 @@ files:
|
|
426
445
|
- lib/rpush/client/redis/apns/notification.rb
|
427
446
|
- lib/rpush/client/redis/apns2/app.rb
|
428
447
|
- lib/rpush/client/redis/apns2/notification.rb
|
448
|
+
- lib/rpush/client/redis/apnsp8/app.rb
|
449
|
+
- lib/rpush/client/redis/apnsp8/notification.rb
|
429
450
|
- lib/rpush/client/redis/app.rb
|
430
451
|
- lib/rpush/client/redis/gcm/app.rb
|
431
452
|
- lib/rpush/client/redis/gcm/notification.rb
|
@@ -447,6 +468,9 @@ files:
|
|
447
468
|
- lib/rpush/daemon/apns/feedback_receiver.rb
|
448
469
|
- lib/rpush/daemon/apns2.rb
|
449
470
|
- lib/rpush/daemon/apns2/delivery.rb
|
471
|
+
- lib/rpush/daemon/apnsp8.rb
|
472
|
+
- lib/rpush/daemon/apnsp8/delivery.rb
|
473
|
+
- lib/rpush/daemon/apnsp8/token.rb
|
450
474
|
- lib/rpush/daemon/app_runner.rb
|
451
475
|
- lib/rpush/daemon/batch.rb
|
452
476
|
- lib/rpush/daemon/constants.rb
|
@@ -454,6 +478,7 @@ files:
|
|
454
478
|
- lib/rpush/daemon/delivery_error.rb
|
455
479
|
- lib/rpush/daemon/dispatcher/apns_http2.rb
|
456
480
|
- lib/rpush/daemon/dispatcher/apns_tcp.rb
|
481
|
+
- lib/rpush/daemon/dispatcher/apnsp8_http2.rb
|
457
482
|
- lib/rpush/daemon/dispatcher/http.rb
|
458
483
|
- lib/rpush/daemon/dispatcher/tcp.rb
|
459
484
|
- lib/rpush/daemon/dispatcher_loop.rb
|