我正在使用这个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,则会发生同样的事情。< / p>
有没有办法以编程方式检测到这种情况,例如:如果您获得了用户的推送证书并告知其生产/开发,但实际上无法在Apple开发人员网站上验证该事实?我本以为连接会被拒绝,但它似乎被创建了但是处于部分破坏的状态。
答案 0 :(得分:0)
嗯,这不是一种检查证书是否有效APNS的方法,但如果你想检测它是开发还是生产,你可以检查它。开发将在其中包含“Developer”字符串,而生产将具有“Production”字符串。
答案 1 :(得分: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..."
答案 2 :(得分:0)
我只是使用证书将其从command line directly发送给自己...
使用开发证书时,我看到:
api.development.push.apple.com
我没有使用生产证书进行测试,但是我很确定当您将其与生产一起发送时,您会看到上面的内容,而不是上面的内容:
api.push.apple.com
FWIW production 证书将在 development (应用程序 not 未经发行证书签名的)环境中工作-只要两个环境都相同的bundleId。但是,生产证书无法在生产环境中运行(应用程序已通过发行证书签名)
除此以外,如今更安全的方法是不使用用户证书,而仅使用 key / token 机制。参见here