与开发证书连接到prod APN

时间:2012-05-02 19:15:08

标签: ios ruby ssl apple-push-notifications

我正在使用这个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开发人员网站上验证该事实?我本以为连接会被拒绝,但它似乎被创建了但是处于部分破坏的状态。

3 个答案:

答案 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