You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:08