我正在使用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
答案 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)
这个宝石可以通过一些拉动请求变得更加灵活,让您的生活更轻松,所以也要考虑到这一点。