如何从类中传递参数初始化方法?

时间:2017-06-08 05:55:14

标签: ruby-on-rails ruby apple-push-notifications

我正在使用Push8 gem进行Apple推送通知,该通知接受.P8证书。问题是我有两个独立应用程序的两个bundle_id,需要向两者发送推送通知。 Push8 gem从application.yml文件自动接受bundle_id ENV ['APN_BUNDLE_ID']参数。但是,我希望它使用ENV ['APN_VENDOR_BUNDLE_ID']以及其他APP发送推送通知。

我发送推送通知的代码在这里

  def self.send_notification_ios(device_id, notification_id)
    send = Notification.where(id: notification_id).first
     if Rails.env == 'development'
        apn = P8push::Client.development
     else
        apn = P8push::Client.production
     end

    token = device_id
    notification = P8push::Notification.new(device: token)
    notification.alert = send.template.message % { txnid: send.order.txnid }
    notification.sound = 'sosumi.aiff'
    apn.push(notification)
    end

此处如果send.end_user_type为“User”,我想使用Bundle id APN_BUNDLE_ID作为主题,其余部分想要使用APN_VENDOR_BUNDLE_ID。但我不知道如何将APN_VENDOR_BUNDLE_ID作为参数传递给gem的client.rb文件中的初始化方法。因此,它始终接受APN_BUNDLE_ID作为主题,因此会抛出错误主题。

这是gem的client.rb文件: https://github.com/andrewarrow/p8push/blob/master/lib/p8push/client.rb

gem的链接是https://github.com/andrewarrow/p8push

1 个答案:

答案 0 :(得分:1)

如果initialize方法无法自定义该属性,那么您有两个选择:对其进行修补以使其执行您想要的操作,这很麻烦,或者将其子类化并使用它来代替

子类解决方案如下所示:

class UserAwareClient < P8Push::Client
  def self.development(user_type)
    client = self.new(user_type)
    client.jwt_uri = APPLE_DEVELOPMENT_JWT_URI
    client
  end

  def self.production(user_type)
    client = self.new(user_type)
    client.jwt_uri = APPLE_PRODUCTION_JWT_URI
    client
  end

  def initialize(user_type)
    # Initialize as the parent class would
    super

    # Then detect the user_type argument and decide how to configure it
    @private_key =
      case (user_type)
      when 'User'
        File.read(ENV['APN_PRIVATE_KEY'])
      else
        File.read(ENV['APN_VENDOR_BUNDLE_ID'])
      end
    end
  end
end

然后你创建:

apn = UserAwareClient.development(user_type)

这个宝石可以通过一些拉动请求变得更加灵活,让您的生活更轻松,所以也要考虑到这一点。