6

我正在使用此 Ruby 代码在推送失败时从 APN 接收错误:

if IO.select([ssl], nil, nil, 5)
    read_buffer = ssl.read(6)
    process_error_response(read_buffer)
end

我注意到一个奇怪的情况,其中 IO.select 不是 nil 但 read_buffer 返回一个空字符串。经过一些调试后,我意识到如果您使用开发 APNs 证书连接到 gateway.push.apple.com 会发生这种情况,并且如果您使用生产证书连接到 gateway.sandbox.push.apple.com 显然会发生同样的事情。

有没有办法以编程方式检测到这种情况,例如,如果用户给你一个推送证书并告诉它是生产/开发,但实际上无法在 Apple 开发者网站上验证这一事实?我原以为连接会被拒绝,但它似乎已创建但处于部分断开的状态。

4

3 回答 3

0

一种方法是打开证书并检查主题,例如:

require 'openssl'
def production?(cert_path)
  certificate = ::OpenSSL::X509::Certificate.new(File.read(cert_path))
  !certificate.subject.to_s.include?('Development')
end

对于生产证书,主题如下所示:

"Apple Production IOS Push Services: com.mybundle.app..."

对于开发证书如下所示:

"Apple Development IOS Push Services: com.mybundle.app..."
于 2015-04-05T18:28:16.117 回答
0

好吧,这不是一种检查证书是否是 APNS 有效的方法,但是如果您想检测它是开发证书还是生产证书,则可以对其进行检查。开发将包含“Developer”字符串,而生产将包含“Production”字符串。

于 2012-05-11T14:07:47.107 回答
0

我只是使用证书直接从命令行将其发送给自己...

使用开发证书时,我看到:

api.development.push.apple.com

我没有使用生产证书进行测试,但是我很确定当您将其与生产一起发送时,您会看到:

api.push.apple.com

FWIW生产证书将在开发(应用程序使用分发证书签名)环境中工作 - 只要两个环境具有相同的 bundleId。但是生产证书在生产环境中不起作用(使用分发证书签名的应用程序)

除此之外,现在更安全的方法是不使用用户证书,而只使用密钥/令牌机制。看这里

于 2020-12-17T23:00:30.370 回答