如何让rpush gem识别新的Apple推送通知证书?
问题原因与解决方法
1. 初始化器开启了embedded模式,忽略数据库配置
rpush支持embedded模式,该模式下会直接读取初始化器中硬编码的App配置,不会加载数据库中存储的App记录,你修改数据库的证书自然不会生效。
解决方法:
检查config/initializers/rpush.rb文件,确认是否存在config.embedded = true配置,以及下方是否有直接创建Rpush::Apns2::App实例、硬编码证书路径/内容的代码。如果有,更新这部分代码中的证书内容/路径后重启rpush即可。
2. 存在残留的rpush进程,未完成真正重启
systemctl停止服务时可能存在进程残留,你看到的报错实际是旧进程使用旧证书触发的。
解决方法:
执行以下命令清理所有残留进程后再重启服务:
# 查找所有rpush进程 ps aux | grep rpush | grep -v grep # 杀掉所有匹配的rpush进程 pkill -9 rpush # 重新启动rpush服务 systemctl --user start rpush
3. 存在多个同名的旧App记录
你只更新了Rpush::Apns2::App的证书,但如果数据库中还存在旧的Rpush::Apns::App同名记录,rpush加载所有App时会读取旧记录的过期证书,触发告警。
解决方法:
在Rails控制台执行以下代码检查所有同名App记录:
APP_NAME = "recode" Rpush::Client::ActiveRecord::App.all.each do |app| next unless app.name == APP_NAME puts "App类型: #{app.class.name}, 证书到期时间: #{app.certificate_expiration_time&.utc}" end
如果查询到其他类型的同名旧App记录,要么更新它的证书,要么删除废弃的旧记录后重启rpush。
4. 未触发配置重载
rpush启动时会将所有App配置预加载到内存,运行中修改数据库记录后如果没有触发重载,会一直使用内存中的旧配置。
解决方法:
重启rpush之外,也可以给rpush主进程发送SIGHUP信号触发配置重载,无需重启服务:
kill -HUP <rpush主进程PID>
内容的提问来源于stack exchange,提问作者FelixBones
相关产品推荐
相关产品推荐

