fwt_push_notification_server 0.0.6 → 0.0.7.b4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/fwt_push_notification_server/device_tokens_controller.rb +5 -26
- data/app/models/fwt_push_notification_server/device_token.rb +9 -0
- data/config/routes.rb +2 -7
- data/lib/devise/models/notifiable.rb +30 -0
- data/lib/fwt_push_notification_server/engine.rb +2 -6
- data/lib/fwt_push_notification_server/version.rb +1 -1
- data/lib/fwt_push_notification_server.rb +56 -42
- data/lib/generators/fwt_push_notification_server/install/install_generator.rb +1 -8
- data/lib/generators/fwt_push_notification_server/install/templates/add_provider_to_push_notification_server_device_tokens.rb +7 -0
- data/lib/generators/fwt_push_notification_server/install/templates/create_fwt_push_notification_server_device_tokens.rb +1 -2
- data/lib/generators/fwt_push_notification_server/install/templates/initializer.rb +14 -16
- data/lib/notifier/apns.rb +38 -0
- data/lib/notifier/base.rb +28 -0
- data/lib/notifier/gcm.rb +41 -0
- metadata +13 -347
- data/app/assets/images/fw-logo.png +0 -0
- data/app/assets/javascripts/fwt_push_notification_server/application.js +0 -13
- data/app/assets/javascripts/fwt_push_notification_server/device_tokens.js +0 -2
- data/app/assets/stylesheets/fwt_push_notification_server/application.css.scss +0 -192
- data/app/assets/stylesheets/fwt_push_notification_server/device_tokens.css +0 -4
- data/app/assets/stylesheets/fwt_push_notification_server/jquery-ui-timepicker-addon.css +0 -10
- data/app/assets/stylesheets/fwt_push_notification_server/jquery-ui.css +0 -474
- data/app/assets/stylesheets/fwt_push_notification_server/jquery.ui.theme.css +0 -248
- data/app/controllers/fwt_push_notification_server/application_controller.rb +0 -9
- data/app/helpers/fwt_push_notification_server/application_helper.rb +0 -6
- data/app/models/fwt_push_notification_server/user.rb +0 -7
- data/app/views/fwt_push_notification_server/application/_empty_view.html.erb +0 -1
- data/app/views/fwt_push_notification_server/device_tokens/index.html.erb +0 -35
- data/app/views/layouts/fwt_push_notification_server/_messages.html.erb +0 -6
- data/app/views/layouts/fwt_push_notification_server/application.html.erb +0 -30
- data/config/initializers/devise.rb +0 -27
- data/config/locales/devise.en.yml +0 -60
- data/lib/generators/fwt_push_notification_server/install/templates/devise_create_fwt_push_notification_server_users.rb +0 -31
- data/lib/generators/fwt_push_notification_server/install/templates/seeds.rb +0 -5
- data/test/controllers/fwt_push_notification_server/device_tokens_controller_test.rb +0 -51
- data/test/dummy/Rakefile +0 -6
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -13
- data/test/dummy/app/controllers/application_controller.rb +0 -5
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/bin/bundle +0 -3
- data/test/dummy/bin/rails +0 -4
- data/test/dummy/bin/rake +0 -4
- data/test/dummy/config/application.rb +0 -23
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/database.yml +0 -25
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -29
- data/test/dummy/config/environments/production.rb +0 -80
- data/test/dummy/config/environments/test.rb +0 -36
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/fwt_push_notification_server.rb +0 -19
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -5
- data/test/dummy/config/initializers/secret_token.rb +0 -12
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -23
- data/test/dummy/config/routes.rb +0 -5
- data/test/dummy/config.ru +0 -4
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130918095820_create_fwt_push_notification_server_device_tokens.rb +0 -14
- data/test/dummy/db/migrate/20130918095821_devise_create_fwt_push_notification_server_users.rb +0 -31
- data/test/dummy/db/schema.rb +0 -43
- data/test/dummy/db/seeds.rb +0 -5
- data/test/dummy/log/development.log +0 -16238
- data/test/dummy/log/test.log +0 -10
- data/test/dummy/public/404.html +0 -58
- data/test/dummy/public/422.html +0 -58
- data/test/dummy/public/500.html +0 -57
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/12c8e9505bddaa133e5fb349c2a5686f5ceccada/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_accordion.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_hero-unit.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_labels-badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_layouts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_reset.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_sprites.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/dd375f805d06ad6efb1710787bd24bcab705b025/application.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/018e8124fa401e10da2a0f8d089b1467 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/04f93e7cd5f3c6bd6c26ea15acf03144 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1e51677f9d96bb542510a33f91cbd9b6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/23bb189d596dce443600523c2af2f418 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/375c78da06e45aab2bc0723f291620f6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3bebeefd5ffe6a58fb03bf1f37ac9163 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/40525813aeb4df11bbc7934420765970 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4809faed3f3c49e4f0069d90c42db9fa +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4837e9658be5fa714ededd423bec6394 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4930f39005ca20c14fe5b6ff5e3462c5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4edaf8d607c191a1d04f54ceafa27f34 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/525db6dca24b08bdb1073bd610b641fa +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/52fc34b303a5058c0f82e03f5e49be15 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/53a6a8c806fb66ef100dcdec2c14667f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5d48cbe0eb7f4d2a888760672ebcd0b5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5dbf4424a551546c8ca2ea3693f57aad +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/63e1b63a0601a563b63be1b6cb6f14e8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7525085b7df71dd698c4ddd96818b178 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7c0cc261ea34e01a60b85decd619d572 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/807b74c8c0f4286940e0f072e71dbf48 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/86b51d868b31f8ec21eab714b70f25c8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/871bed79442dc4d0f7e860539e548c11 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/873e96cc154ed7b8f89ae6ebd6330d76 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9266b6839c460333f8fabb33531b0aa5 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9619769a83bc4c96187fad84dd44f662 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/984da49c74b19af286bd6da0be3b7f41 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b3329085a217fc47138d40e542cbab29 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/b49ac435bde8ad5725858653ed8c96b0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c88406e714c83dc7a8eba7dfc687b9be +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/db1758582caea75d451566fa655186d1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ee6e9c40abd892aaef0bbbf0bd11c5e0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f0e74746290141cd77d8e42db2047501 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f301640fffe07f12598645f72b673e29 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f3f906a5c3f8d16aaa9833a07d5f87dc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f6db10193f0119f139b2d45d263ed768 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/fa7addf7e35b3a6bfcff34dc107fad07 +0 -0
- data/test/fixtures/fwt_push_notification_server/device_tokens.yml +0 -13
- data/test/fixtures/fwt_push_notification_server/users.yml +0 -11
- data/test/fwt_push_notification_server_test.rb +0 -9
- data/test/helpers/fwt_push_notification_server/device_tokens_helper_test.rb +0 -6
- data/test/integration/navigation_test.rb +0 -10
- data/test/models/fwt_push_notification_server/device_token_test.rb +0 -9
- data/test/models/fwt_push_notification_server/user_test.rb +0 -9
- data/test/test_helper.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7172b0f43a912e0d5fb9cffc3d7dfd4e17e2b1e0
|
4
|
+
data.tar.gz: 3d376af460f6b7bf7d1828946ddda354610a0f1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f497d2a95216156d3b1eb88c48c95821331c8413defa2159944b7599ad346bd4f1dd4c8e41c6d4914108aa3a4ae2948ee68dc9c410849090f489027b532df00a
|
7
|
+
data.tar.gz: 206e5e4e2f6493bf8836e0e8d0ee2d2d452d0352ebbc2e1c7aa227441608c7e0c458f54640ee015d52ef3d4b0e66c09ebf087f46b0172dd4415347bb9a831bd1
|
@@ -1,35 +1,15 @@
|
|
1
|
-
require_dependency "fwt_push_notification_server/application_controller"
|
2
|
-
require 'digest'
|
3
1
|
|
4
2
|
module FwtPushNotificationServer
|
5
3
|
|
6
|
-
class DeviceTokensController <
|
4
|
+
class DeviceTokensController < FwtPushNotificationServer.api_controller_class
|
7
5
|
|
8
|
-
|
9
|
-
if params[:token].blank? || params[:sig].blank?
|
10
|
-
false
|
11
|
-
else
|
12
|
-
token = params[:token]
|
13
|
-
device_name = params[:device_name]
|
14
|
-
device_id = params[:device_id]
|
15
|
-
config = FwtPushNotificationServer.config
|
16
|
-
key = config[:api_key]
|
17
|
-
params_string = "token=#{token}&device_name=#{device_name}&device_id=#{device_id}"
|
18
|
-
!!(Digest::HMAC.hexdigest(params_string, key, Digest::SHA256) == params[:sig])
|
19
|
-
end
|
20
|
-
}
|
21
|
-
|
22
|
-
# GET /device_tokens
|
23
|
-
def index
|
24
|
-
@device_tokens = DeviceToken.page.per(100)
|
25
|
-
end
|
6
|
+
skip_authorization_check
|
26
7
|
|
27
|
-
# POST /device_tokens
|
28
8
|
def create
|
29
9
|
@device_token = DeviceToken.find_or_create_by_token(params[:token])
|
30
10
|
@device_token.update_attributes({
|
31
|
-
:
|
32
|
-
:
|
11
|
+
:user_id => params[:user_id],
|
12
|
+
:provider => params[:provider]
|
33
13
|
})
|
34
14
|
if @device_token.present?
|
35
15
|
@device_token.save
|
@@ -41,9 +21,8 @@ module FwtPushNotificationServer
|
|
41
21
|
end
|
42
22
|
|
43
23
|
private
|
44
|
-
# Only allow a trusted parameter "white list" through.
|
45
24
|
def device_token_params
|
46
|
-
params.permit(:token, :
|
25
|
+
params.permit(:token, :user_id, :provider)
|
47
26
|
end
|
48
27
|
|
49
28
|
end
|
@@ -4,6 +4,15 @@ module FwtPushNotificationServer
|
|
4
4
|
|
5
5
|
validates_uniqueness_of :token
|
6
6
|
|
7
|
+
def user
|
8
|
+
user_id.blank? ? nil : FwtPushNotificationServer.user_class.find_by(FwtPushNotificationServer.user_key => user_id)
|
9
|
+
end
|
10
|
+
|
11
|
+
def notifier
|
12
|
+
return nil if provider.nil?
|
13
|
+
FwtPushNotificationServer.notifiers[provider.to_sym]
|
14
|
+
end
|
15
|
+
|
7
16
|
end
|
8
17
|
|
9
18
|
end
|
data/config/routes.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
FwtPushNotificationServer::Engine.routes.draw do
|
2
1
|
|
3
|
-
|
4
|
-
root :to => 'device_tokens#index'
|
2
|
+
FwtPushNotificationServer::Engine.routes.draw do
|
5
3
|
|
6
|
-
|
7
|
-
class_name: 'FwtPushNotificationServer::User',
|
8
|
-
module: :devise
|
9
|
-
}
|
4
|
+
resources :device_tokens, only: [:create]
|
10
5
|
|
11
6
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Devise
|
2
|
+
module Models
|
3
|
+
|
4
|
+
module Notifiable
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def notify_once(message)
|
9
|
+
device_tokens.each do |device|
|
10
|
+
next unless device.is_valid
|
11
|
+
device.notifier.notify_once(message, device) unless device.notifier.nil?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def schedule_notification
|
16
|
+
device_tokens.each do |device|
|
17
|
+
next unless device.is_valid
|
18
|
+
device.notifier.add_device_token(device) unless device.notifier.nil?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def device_tokens
|
23
|
+
key = FwtPushNotificationServer.user_key
|
24
|
+
FwtPushNotificationServer::DeviceToken.where(:user_id => send(key))
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -1,11 +1,7 @@
|
|
1
|
-
require "kaminari-bootstrap"
|
2
|
-
require "bootstrap-sass"
|
3
|
-
require "sass-rails"
|
4
1
|
require "devise"
|
5
2
|
require "cancan"
|
6
|
-
require "
|
7
|
-
require "
|
8
|
-
require "coffee-rails"
|
3
|
+
require "grocer"
|
4
|
+
require "gcm"
|
9
5
|
|
10
6
|
module FwtPushNotificationServer
|
11
7
|
|
@@ -1,48 +1,62 @@
|
|
1
1
|
require "fwt_push_notification_server/engine"
|
2
|
-
require '
|
3
|
-
require
|
4
|
-
require
|
2
|
+
require 'notifier/base'
|
3
|
+
require 'notifier/apns'
|
4
|
+
require 'notifier/gcm'
|
5
5
|
|
6
6
|
module FwtPushNotificationServer
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
8
|
+
mattr_accessor :api_controller_class
|
9
|
+
|
10
|
+
mattr_accessor :authentication_filter
|
11
|
+
@@authentication_filter = :authenticate_user!
|
12
|
+
|
13
|
+
mattr_accessor :user_class
|
14
|
+
|
15
|
+
mattr_accessor :user_key
|
16
|
+
@@user_key = :user_id
|
17
|
+
|
18
|
+
mattr_accessor :apns_gateway
|
19
|
+
@@apns_gateway = 'sandbox.push.apple.com'
|
20
|
+
|
21
|
+
mattr_accessor :apns_certificate
|
22
|
+
|
23
|
+
mattr_accessor :apns_passphrase
|
24
|
+
|
25
|
+
|
26
|
+
mattr_accessor :gcm_api_key
|
27
|
+
|
28
|
+
def self.configure
|
29
|
+
yield self
|
30
|
+
end
|
31
|
+
|
32
|
+
###
|
33
|
+
# Push Notifications
|
34
|
+
###
|
35
|
+
|
36
|
+
mattr_accessor :notifiers
|
37
|
+
@@notifiers = {
|
38
|
+
:apns => Notifier::APNS.new,
|
39
|
+
:gcm => Notifier::GCM.new
|
40
|
+
}
|
41
|
+
|
42
|
+
def self.apns_config
|
43
|
+
{
|
44
|
+
:gateway => apns_gateway,
|
45
|
+
:certificate => apns_certificate,
|
46
|
+
:passphrase => apns_passphrase
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.begin_transaction(message)
|
51
|
+
notifiers.each_value do |notifier|
|
52
|
+
notifier.begin_transaction(message)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.commit_transaction
|
57
|
+
notifiers.each_value do |notifier|
|
58
|
+
notifier.commit_transaction
|
59
|
+
end
|
60
|
+
end
|
47
61
|
|
48
62
|
end
|
@@ -22,7 +22,7 @@ module FwtPushNotificationServer
|
|
22
22
|
|
23
23
|
def copy_migrations
|
24
24
|
migration_template "create_fwt_push_notification_server_device_tokens.rb", "db/migrate/create_fwt_push_notification_server_device_tokens.rb"
|
25
|
-
migration_template "
|
25
|
+
migration_template "add_provider_to_push_notification_server_device_tokens.rb", "db/migrate/add_provider_to_push_notification_server_device_tokens.rb"
|
26
26
|
end
|
27
27
|
|
28
28
|
desc "Add initializer"
|
@@ -31,13 +31,6 @@ module FwtPushNotificationServer
|
|
31
31
|
copy_file "initializer.rb", "config/initializers/#{app_name}.rb"
|
32
32
|
end
|
33
33
|
|
34
|
-
desc "Add seeds"
|
35
|
-
|
36
|
-
def append_seeds
|
37
|
-
seeds = File.read(File.join(File.dirname(__FILE__), "templates/seeds.rb"))
|
38
|
-
append_file "db/seeds.rb", seeds
|
39
|
-
end
|
40
|
-
|
41
34
|
private
|
42
35
|
def app_name
|
43
36
|
"fwt_push_notification_server"
|
@@ -3,8 +3,7 @@ class CreateFwtPushNotificationServerDeviceTokens < ActiveRecord::Migration
|
|
3
3
|
def change
|
4
4
|
create_table :fwt_push_notification_server_device_tokens do |t|
|
5
5
|
t.string :token
|
6
|
-
t.string :
|
7
|
-
t.string :device_name
|
6
|
+
t.string :user_id
|
8
7
|
t.boolean :is_valid, :default => true
|
9
8
|
|
10
9
|
t.timestamps
|
@@ -1,20 +1,18 @@
|
|
1
|
-
#development (sandbox)
|
2
|
-
FwtPushNotificationServer.config = {
|
3
1
|
|
4
|
-
|
5
|
-
:certificate => File.join(Rails.root, 'config', 'APNSDevelopment.pem'),
|
6
|
-
:passphrase => 'PASSPHRASE',
|
7
|
-
:gateway => 'gateway.sandbox.push.apple.com',
|
8
|
-
:title => 'FWT Push Notifications'
|
9
|
-
};
|
2
|
+
FwtPushNotificationServer.configure do |config|
|
10
3
|
|
11
|
-
#
|
12
|
-
|
4
|
+
# APNS
|
5
|
+
config.apns_certificate = File.join(Rails.root, 'config', 'APNSDevelopment.pem')
|
6
|
+
config.apns_passphrase = 'PASSPHRASE'
|
7
|
+
config.apns_gateway = 'gateway.sandbox.push.apple.com'
|
8
|
+
|
9
|
+
# GCM
|
10
|
+
config.gcm_api_key = 'YOUR-KEY-HERE'
|
13
11
|
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
# Devise integration
|
13
|
+
config.api_controller_class = ApplicationController
|
14
|
+
config.authentication_filter = :authenticate_user!
|
15
|
+
config.user_class = User
|
16
|
+
config.user_key = :user_id
|
19
17
|
|
20
|
-
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module FwtPushNotificationServer
|
2
|
+
|
3
|
+
module Notifier
|
4
|
+
|
5
|
+
class APNS < Notifier::Base
|
6
|
+
|
7
|
+
def notify_once(message, device_tokens)
|
8
|
+
|
9
|
+
alert = message.byteslice(0, 232)
|
10
|
+
alert += '...' if alert.bytesize > 232
|
11
|
+
|
12
|
+
config = FwtPushNotificationServer.apns_config
|
13
|
+
pusher = Grocer.pusher(config)
|
14
|
+
|
15
|
+
device_tokens = [device_tokens] unless device_tokens.is_a?(Array)
|
16
|
+
device_tokens.each do |device|
|
17
|
+
if device.is_valid
|
18
|
+
token = device.token
|
19
|
+
n = Grocer::Notification.new(device_token: token, alert: alert)
|
20
|
+
pusher.push n
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
feedback = Grocer.feedback(config)
|
25
|
+
feedback.each do |attempt|
|
26
|
+
token = attempt.device_token
|
27
|
+
device_token = DeviceToken.find_by_token(token)
|
28
|
+
device_token.update_attribute("is_valid", false) unless device_token.nil?
|
29
|
+
puts "APNS: Device #{token} failed at #{attempt.timestamp}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module FwtPushNotificationServer
|
2
|
+
|
3
|
+
module Notifier
|
4
|
+
|
5
|
+
class Base
|
6
|
+
|
7
|
+
def begin_transaction(message)
|
8
|
+
@device_tokens = []
|
9
|
+
@message = message
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_device_token(device_token)
|
13
|
+
@device_tokens << device_token if device_token.is_valid
|
14
|
+
end
|
15
|
+
|
16
|
+
def commit_transaction
|
17
|
+
notify_once(@message, @device_tokens.uniq)
|
18
|
+
end
|
19
|
+
|
20
|
+
def notify_once(message, device_tokens)
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/lib/notifier/gcm.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module FwtPushNotificationServer
|
2
|
+
|
3
|
+
module Notifier
|
4
|
+
|
5
|
+
class GCM < Notifier::Base
|
6
|
+
|
7
|
+
def notify_once(message, device_tokens)
|
8
|
+
|
9
|
+
@device_tokens = device_tokens.is_a?(Array) ? device_tokens : [device_tokens]
|
10
|
+
|
11
|
+
@gcm = ::GCM.new(FwtPushNotificationServer.gcm_api_key)
|
12
|
+
|
13
|
+
@registration_ids = []
|
14
|
+
@payload = { :data => { :message => message } }
|
15
|
+
@device_tokens.each do |device|
|
16
|
+
@registration_ids << device.token
|
17
|
+
if @registration_ids.count == 1000
|
18
|
+
send_batch
|
19
|
+
end
|
20
|
+
end
|
21
|
+
send_batch
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def send_batch
|
26
|
+
response = @gcm.send_notification(@registration_ids, @payload)
|
27
|
+
body = JSON.parse(response.fetch(:body, "{}"))
|
28
|
+
results = body.fetch("results", [])
|
29
|
+
results.each_with_index do |result, idx|
|
30
|
+
if result["error"]
|
31
|
+
@device_tokens[idx].update_attribute('is_valid', false)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
@registration_ids = []
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|