Module: Rpush::Client::ActiveModel::Apns::Notification

Included in:
Rpush::Client::ActiveRecord::Apns::Notification, Redis::Apns::Notification
Defined in:
lib/rpush/client/active_model/apns/notification.rb

Constant Summary collapse

APNS_DEFAULT_EXPIRY =
1.day.to_i
APNS_PRIORITY_IMMEDIATE =
10
APNS_PRIORITY_CONSERVE_POWER =
5
APNS_PRIORITIES =
[APNS_PRIORITY_IMMEDIATE, APNS_PRIORITY_CONSERVE_POWER]
MDM_KEY =
'__rpush_mdm__'
MUTABLE_CONTENT_KEY =
'__rpush_mutable_content__'
CONTENT_AVAILABLE_KEY =
'__rpush_content_available__'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/rpush/client/active_model/apns/notification.rb', line 11

def self.included(base)
  base.instance_eval do
    validates :device_token, presence: true
    validates :badge, numericality: true, allow_nil: true
    validates :priority, inclusion: { in: APNS_PRIORITIES }, allow_nil: true

    validates_with Rpush::Client::ActiveModel::Apns::DeviceTokenFormatValidator
    validates_with Rpush::Client::ActiveModel::Apns::BinaryNotificationValidator

    base.const_set('APNS_DEFAULT_EXPIRY', APNS_DEFAULT_EXPIRY) unless base.const_defined?('APNS_DEFAULT_EXPIRY')
    base.const_set('APNS_PRIORITY_IMMEDIATE', APNS_PRIORITY_IMMEDIATE) unless base.const_defined?('APNS_PRIORITY_IMMEDIATE')
    base.const_set('APNS_PRIORITY_CONSERVE_POWER', APNS_PRIORITY_CONSERVE_POWER) unless base.const_defined?('APNS_PRIORITY_CONSERVE_POWER')
  end
end

Instance Method Details

#as_json(options = nil) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/rpush/client/active_model/apns/notification.rb', line 47

def as_json(options = nil) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
  json = ActiveSupport::OrderedHash.new

  if data && data.key?(MDM_KEY)
    json['mdm'] = data[MDM_KEY]
  else
    json['aps'] = ActiveSupport::OrderedHash.new
    json['aps']['alert'] = alert if alert
    json['aps']['badge'] = badge if badge
    json['aps']['sound'] = sound if sound
    json['aps']['category'] = category if category
    json['aps']['url-args'] = url_args if url_args

    if data && data[MUTABLE_CONTENT_KEY]
      json['aps']['mutable-content'] = 1
    end

    if data && data[CONTENT_AVAILABLE_KEY]
      json['aps']['content-available'] = 1
    end

    if data
      non_aps_attributes = data.reject { |k, _| k == CONTENT_AVAILABLE_KEY || k == MUTABLE_CONTENT_KEY }
      non_aps_attributes.each { |k, v| json[k.to_s] = v }
    end
  end

  json
end

#content_available=(bool) ⇒ Object



42
43
44
45
# File 'lib/rpush/client/active_model/apns/notification.rb', line 42

def content_available=(bool)
  return unless bool
  self.data = (data || {}).merge(CONTENT_AVAILABLE_KEY => true)
end

#device_token=(token) ⇒ Object



26
27
28
# File 'lib/rpush/client/active_model/apns/notification.rb', line 26

def device_token=(token)
  write_attribute(:device_token, token.delete(" <>")) unless token.nil?
end

#mdm=(magic) ⇒ Object



31
32
33
# File 'lib/rpush/client/active_model/apns/notification.rb', line 31

def mdm=(magic)
  self.data = (data || {}).merge(MDM_KEY => magic)
end

#mutable_content=(bool) ⇒ Object



36
37
38
39
# File 'lib/rpush/client/active_model/apns/notification.rb', line 36

def mutable_content=(bool)
  return unless bool
  self.data = (data || {}).merge(MUTABLE_CONTENT_KEY => true)
end

#to_binary(options = {}) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/rpush/client/active_model/apns/notification.rb', line 77

def to_binary(options = {})
  frame_payload = payload
  frame_id = options[:for_validation] ? 0 : send(options.fetch(:id_attribute, :id))
  frame = ""
  frame << [1, 32, device_token].pack("cnH*")
  frame << [2, frame_payload.bytesize, frame_payload].pack("cna*")
  frame << [3, 4, frame_id].pack("cnN")
  frame << [4, 4, expiry || APNS_DEFAULT_EXPIRY].pack("cnN")
  frame << [5, 1, priority_for_frame].pack("cnc")
  [2, frame.bytesize].pack("cN") + frame
end