- PVSM.RU - https://www.pvsm.ru -
Один из наиболее популярных способов связи мобильного приложения с сервером — отправка push уведомлений пользователю. Если Вы уже сталкивались с реализацией push уведомлений, то для Вас открытия Америки не произойдет, однако, новичкам в данной теме приходиться туго — это связанно с огромной путаницей в информации (от переводчика: действительно довольно много противоречивой, а зачастую и вовсе бесполезной информации). Именно эта путаница стала причиной написания данной статьи для WellWithMe, где я опишу разработку серверной части push уведомлений.
Прежде, чем я продолжу, должен предупредить о plug-n-play сервисах предоставляющих отправку push уведомлений, если вы желаете платить им (Parse [1], mobDB [2], Pushwoosh [3], Urban Airship [4], etc.), но это не путь война. Давайте сделаем это сами, с нуля (и бесплатно) (на самом деле — не так уж и с нуля, но платить никому не придется).
Если ты хочешь сделать яблочный пирог с нуля, то сначала создай вселенную
Карл Саган
Вот три компонента, которые играют важную роль в нашей системе доставки push уведомлений:
Прежде всего надо спросить пользователя, хочет ли он принимать push уведомления (золотые слова) и если пользователь согласиться — отправить device token (не знаю как перевести, думаю device token будет понятно всем). Их (device token) мы будем сохранять в простую модель ActiveRecord, которую назовем Device
# Schema Information
# Table name: devices
# id :integer not null, primary key
# user_id :integer
# token :string(255)
# enabled :boolean default(TRUE)
# created_at :datetime not null
# updated_at :datetime not null
# platform :string(255)
class Device < ActiveRecord::Base
attr_accessible :enabled, :token, :user, :platform
belongs_to :user
validates_uniqueness_of :token, :scope => :user_id
end
Экземпляры Device (записи в базу) должны создаваться когда приложение вызывает соответствующий API метод
resource :devices do
post do
@device = Device.create(user: current_user, token: params[:token], platform: params[:platform])
present @device, with: WellWithMe::Entities::Device
end
end
Используем модель Notification из Redis в качестве очереди
class NotificationSender
@queue = :notifications
def self.perform
@list = Redis::List.new(Notification.key_name)
while notification = @list.pop do
notification_json = JSON.parse(notification)
if notification_json['platform'] == 'iOS'
note = Grocer::Notification.new(
device_token: notification_json['token'],
alert: notification_json['message'],
sound: 'default',
badge: 0
)
PUSHER.push(note)
elsif notification_json['platform'] == 'Android'
gcm = GCM.new(ENV['gcm_key'])
registration_id = [notification_json['token']]
options = {
'data' => {
'message' => notification_json['message']
},
'collapse_key' => 'updated_state'
}
response = gcm.send_notification(registration_id, options)
end
end
end
end
NotificationSender читает задачи из очереди при этом постоянно поддерживает соединение с серверами, не пытаясь устанавливать новые соединения для отправки каждого push уведомления, чему Apple активно препятствует: заметка Apple о соединения с серверами push уведомлений [5]
Данный код отрабатывает каждую минуту, проверяя очередь уведомлений Redis и отсылая push уведомления на устройства.
Были использованы замечательные джемы grocer [6] для iOS и GCM [7] для Android. Оба джема прекрасно работают и очень хорошо документированы. Единственно ограничение состоит в том, что вы должны создать сертификаты для iOS и правильно их экспортировать — просто следуйте инструкциям от Apple.
Теперь у Вас есть легко расширяемая система отправки Push уведомлений. Push уведомления помогут увеличить число Ваших пользователей, но не злоупотребляйте ими, иначе возникнет обратный эффект
А переводчик пойдет писать свой костыль почти в том же духе, только выкинув Redis и добавив Windows Phone
Автор: t0pep0
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ios/56333
Ссылки в тексте:
[1] Parse: https://www.parse.com/
[2] mobDB: https://www.mobdb.net/
[3] Pushwoosh: http://www.pushwoosh.com/
[4] Urban Airship: http://urbanairship.com/
[5] заметка Apple о соединения с серверами push уведомлений: https://developer.apple.com/news/?id=03212012a
[6] grocer: https://github.com/grocer/grocer
[7] GCM: https://github.com/spacialdb/gcm
[8] Источник: http://habrahabr.ru/post/214607/
Нажмите здесь для печати.