рдЕрдкрдиреЗ рд░реЗрд▓ рдЖрд╡реЗрджрди рд╕реЗ рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдВ рдХреИрд╕реЗ рднреЗрдЬреЗрдВ

рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзрдХреНрдХрд╛ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдореЗрд░рд┐рдХрд╛ рдХреА рдЦреЛрдЬ рдЖрдкрдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рддрдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рднрд╛рд░реА рднреНрд░рдо рдХреЗ рдХрд╛рд░рдг рд╣реИ (рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рдЬрд╛рдирдХрд╛рд░реА) ред рдпрд╣ рднреНрд░рдо рдерд╛ рдЬрд┐рд╕рдиреЗ рд╡реЗрд▓рд╡рд┐рдердПрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдореИрдВ рдкреБрд╢ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд░реНрд╡рд░ рдкрдХреНрд╖ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред



рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЬрд╛рд░реА рд░рдЦреВрдВ , рдореБрдЭреЗ рдкреНрд▓рдЧ-рдПрди-рдкреНрд▓реЗ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( рдкрд╛рд░реНрд╕ , рдореЛрдмрдбреАрдбреАрдмреА , рдкреБрд╢рд╡реЛрд╢ , рдЕрд░реНрдмрди рдПрдпрд░рд╢рд┐рдк , рдЖрджрд┐), рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдпреЛрджреНрдзрд╛ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд░реЛрдВрдЪ рд╕реЗ (рдФрд░ рдореБрдХреНрдд) (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдЦрд░реЛрдВрдЪ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛) ред

рдпрджрд┐ рдЖрдк рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рд╕реЗрдм рдкрд╛рдИ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рдмреНрд░рд╣реНрдорд╛рдВрдб рдмрдирд╛рдПрдВ
рдХрд╛рд░реНрд▓ рд╕рд╛рдЧрди

рдпрд╣рд╛рдВ рддреАрди рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдбрд┐рд▓реАрд╡рд░реА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВ:


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдпрд╣ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди (рд╕реБрдирд╣рд░реЗ рд╢рдмреНрдж) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реИ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рднреЗрдЬреЗрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдХреЛ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛) ред рд╣рдо рдЙрдиреНрд╣реЗрдВ (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди) рдПрдХ рд╕рд╛рдзрд╛рд░рдг ActiveRecord рдореЙрдбрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╣реЗрдВрдЧреЗ
# 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 


рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдЙрдкрдпреБрдХреНрдд 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 


рдПрдХ рдХрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдбрд┐рд╕ рд╕реЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

 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 


рдЕрдзрд┐рд╕реВрдЪрдирд╛рдХрд░реНрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╢ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдмрд┐рдирд╛, рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдХрддрд╛рд░ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Apple рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ: рдкреБрд╢ рд╕реВрдЪрдирд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Apple рдХрд╛ рдиреЛрдЯ

рдпрд╣ рдХреЛрдб рд╣рд░ рдорд┐рдирдЯ рдЪрд▓рддрд╛ рд╣реИ, Redis рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрддрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрддрд╛ рд╣реИред

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЖрдИрдУрдПрд╕ рдФрд░ рдЬреАрд╕реАрдПрдо рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рдХрд┐рд░рд╛рдиреЗ рдХреЗ рдЬрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреЛрдиреЛрдВ рдЬрд╛рдо рдорд╣рд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИрдВред рдХреЗрд╡рд▓ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ iOS рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдмрд╕ Apple рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред

рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рдкреБрд╢ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдВ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рд╡рд┐рдкрд░реАрдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛
рдФрд░ рдЕрдиреБрд╡рд╛рджрдХ рдЕрдкрдиреА рдмреИрд╕рд╛рдЦреА рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗрдЧрд╛, рдХреЗрд╡рд▓ рд░реЗрдбрд┐рд╕ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛

Source: https://habr.com/ru/post/In214607/


All Articles