apnotic 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +31 -0
- data/lib/apnotic.rb +1 -0
- data/lib/apnotic/abstract_notification.rb +35 -0
- data/lib/apnotic/connection.rb +2 -4
- data/lib/apnotic/mdm_notification.rb +19 -0
- data/lib/apnotic/notification.rb +16 -30
- data/lib/apnotic/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f37b786ef147c1553a73571851e796091f9ed2c8
|
4
|
+
data.tar.gz: 80eea7c2ccbe00fb57b8327ef911d6f0c0eeab11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 687b7ab85bbfbbcd125fc6bcfc435cdcf11df33e74635d631d698d5b94682f2dc0e9481bd6887c480b4e587a395a33b3c2b91a21f93606457b822d303fb9282f
|
7
|
+
data.tar.gz: 8e8a154fb3cd33ab1113cfcb30477447d2d1c7fb689ff67a2a13078a6b7211e292099c3824cefc3c3a3ea3dcfe26f00fc4c5920d442a8aad6d0b06248a02a13e
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -92,6 +92,37 @@ connection.join
|
|
92
92
|
connection.close
|
93
93
|
```
|
94
94
|
|
95
|
+
#### Mobile Device Management (MDM) notifications
|
96
|
+
|
97
|
+
If you are building an iOS MDM solution, you can as well use apnotic to send mdm push notifications with the `Apnotic::MdmNotification` class. Sending a MDM notification requires a token and a push magic value, which is sent by the iOS device during its MDM enrollment:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
require 'apnotic'
|
101
|
+
|
102
|
+
# create a persistent connection
|
103
|
+
connection = Apnotic::Connection.new(cert_path: "apns_certificate.pem", cert_pass: "pass")
|
104
|
+
|
105
|
+
# create a notification for a specific device token
|
106
|
+
token = '6c267f26b173cd9595ae2f6702b1ab560371a60e7c8a9e27419bd0fa4a42e58f'
|
107
|
+
|
108
|
+
# push magic value given by the iOS device during enrollment
|
109
|
+
push_magic = '7F399691-C3D9-4795-ACF8-0B51D7073497'
|
110
|
+
|
111
|
+
notification = Apnotic::MdmNotification.new(token: token, push_magic: push_magic)
|
112
|
+
|
113
|
+
# send (this is a blocking call)
|
114
|
+
response = connection.push(notification)
|
115
|
+
|
116
|
+
# read the response
|
117
|
+
response.ok? # => true
|
118
|
+
response.status # => '200'
|
119
|
+
response.headers # => {":status"=>"200", "apns-id"=>"6f2cd350-bfad-4af0-a8bc-0d501e9e1799"}
|
120
|
+
response.body # => ""
|
121
|
+
|
122
|
+
# close the connection
|
123
|
+
connection.close
|
124
|
+
```
|
125
|
+
|
95
126
|
#### Token-based authentication
|
96
127
|
Token-based authentication is supported. There are several advantages with token-based auth:
|
97
128
|
|
data/lib/apnotic.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'securerandom'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Apnotic
|
7
|
+
class AbstractNotification
|
8
|
+
attr_reader :token
|
9
|
+
attr_accessor :apns_id,
|
10
|
+
:expiration,
|
11
|
+
:priority,
|
12
|
+
:topic,
|
13
|
+
:apns_collapse_id,
|
14
|
+
:authorization
|
15
|
+
|
16
|
+
def initialize(token)
|
17
|
+
@token = token
|
18
|
+
@apns_id = SecureRandom.uuid
|
19
|
+
end
|
20
|
+
|
21
|
+
def body
|
22
|
+
JSON.dump(to_hash).force_encoding(Encoding::BINARY)
|
23
|
+
end
|
24
|
+
|
25
|
+
def authorization_header
|
26
|
+
authorization ? "bearer #{authorization}" : nil
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def to_hash
|
32
|
+
raise NotImplementedError, 'implement the to_hash method in a child class'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/apnotic/connection.rb
CHANGED
@@ -79,12 +79,10 @@ module Apnotic
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def delayed_push_async(push)
|
82
|
-
|
83
|
-
@client.call_async(push.http2_request)
|
84
|
-
else
|
82
|
+
until streams_available? do
|
85
83
|
sleep 0.001
|
86
|
-
delayed_push_async(push)
|
87
84
|
end
|
85
|
+
@client.call_async(push.http2_request)
|
88
86
|
end
|
89
87
|
|
90
88
|
def streams_available?
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'apnotic/abstract_notification'
|
2
|
+
|
3
|
+
module Apnotic
|
4
|
+
|
5
|
+
class MdmNotification < AbstractNotification
|
6
|
+
attr_reader :push_magic
|
7
|
+
|
8
|
+
def initialize(push_magic:, token:)
|
9
|
+
super(token)
|
10
|
+
@push_magic = push_magic
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def to_hash
|
16
|
+
{ mdm: push_magic }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/apnotic/notification.rb
CHANGED
@@ -1,42 +1,28 @@
|
|
1
|
-
require '
|
2
|
-
require 'json'
|
1
|
+
require 'apnotic/abstract_notification'
|
3
2
|
|
4
3
|
module Apnotic
|
5
4
|
|
6
|
-
class Notification
|
7
|
-
attr_reader :token
|
5
|
+
class Notification < AbstractNotification
|
8
6
|
attr_accessor :alert, :badge, :sound, :content_available, :category, :custom_payload, :url_args, :mutable_content
|
9
|
-
attr_accessor :apns_id, :expiration, :priority, :topic, :apns_collapse_id, :authorization
|
10
7
|
|
11
|
-
|
12
|
-
@token = token
|
13
|
-
@apns_id = SecureRandom.uuid
|
14
|
-
end
|
15
|
-
|
16
|
-
def body
|
17
|
-
JSON.dump(to_hash).force_encoding(Encoding::BINARY)
|
18
|
-
end
|
8
|
+
private
|
19
9
|
|
20
|
-
def
|
21
|
-
|
10
|
+
def aps
|
11
|
+
{}.tap do |result|
|
12
|
+
result.merge!(alert: alert) if alert
|
13
|
+
result.merge!(badge: badge) if badge
|
14
|
+
result.merge!(sound: sound) if sound
|
15
|
+
result.merge!(category: category) if category
|
16
|
+
result.merge!('content-available' => content_available) if content_available
|
17
|
+
result.merge!('url-args' => url_args) if url_args
|
18
|
+
result.merge!('mutable-content' => mutable_content) if mutable_content
|
19
|
+
end
|
22
20
|
end
|
23
21
|
|
24
|
-
private
|
25
|
-
|
26
22
|
def to_hash
|
27
|
-
aps
|
28
|
-
|
29
|
-
|
30
|
-
aps.merge!(badge: badge) if badge
|
31
|
-
aps.merge!(sound: sound) if sound
|
32
|
-
aps.merge!(category: category) if category
|
33
|
-
aps.merge!('content-available' => content_available) if content_available
|
34
|
-
aps.merge!('url-args' => url_args) if url_args
|
35
|
-
aps.merge!('mutable-content' => mutable_content) if mutable_content
|
36
|
-
|
37
|
-
n = { aps: aps }
|
38
|
-
n.merge!(custom_payload) if custom_payload
|
39
|
-
n
|
23
|
+
{ aps: aps }.tap do |result|
|
24
|
+
result.merge!(custom_payload) if custom_payload
|
25
|
+
end
|
40
26
|
end
|
41
27
|
end
|
42
28
|
end
|
data/lib/apnotic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apnotic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roberto Ostinelli
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-http2
|
@@ -106,9 +106,11 @@ files:
|
|
106
106
|
- bin/console
|
107
107
|
- bin/setup
|
108
108
|
- lib/apnotic.rb
|
109
|
+
- lib/apnotic/abstract_notification.rb
|
109
110
|
- lib/apnotic/connection.rb
|
110
111
|
- lib/apnotic/connection_pool.rb
|
111
112
|
- lib/apnotic/instance_cache.rb
|
113
|
+
- lib/apnotic/mdm_notification.rb
|
112
114
|
- lib/apnotic/notification.rb
|
113
115
|
- lib/apnotic/provider_token.rb
|
114
116
|
- lib/apnotic/push.rb
|