我正在为我的 iOS 应用程序实现存折功能。我使用 php 作为服务器端语言来生成传递并分发到设备。通行证已成功安装在设备上,我还可以使用 pull to referesh 手动更新通行证。当我尝试从服务器端自动更新 pass 时,我得到响应状态 8-invalid-token 并显示消息“标识符是导致问题的数据库中的 rowID(index)。Apple 将断开您的连接.....”。我不明白为什么会这样。设备正在正确注册,其他端点也工作正常。如果 pass 最初不正确,则不应将其安装在设备上。我使用与发送推送通知相同的通行证类型 ID 证书签署通行证。我还使用列出的这个命令检查了我的证书 在这里。
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourSSLCertAndPrivateKey.pem -debug -showcerts -CAfile server-ca-cert.pem
我在沙盒和生产中都使用了它,它没有显示任何错误。我正在使用生产 url 发送推送通知以更新通行证;这是我发送推送的代码;
$apnsHost = 'gateway.push.apple.com';
$apnsPort = 2195;
$apnsCert = base_path().'/path/to/ptypeidcert.pem';//converted using ssl from passtypeid.p12 certificated
$push_token = $token;
$passIdentify = 'pass.myidentifier.coupon';
$payload = '{}';
$msg = chr(0) . pack('n', 32) . pack('H*', $push_token) . pack('n', strlen($payload)) . $payload . pack('n', strlen($passIdentify)) . $passIdentify;
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'cafile', base_path().'/path/to/entrust_2048_ca.cer');
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', 'export_password');
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
fwrite($apns, $msg);
PushNotifications::checkAppleErrorResponse($apns);// Just created a class to read response from apn server
@socket_close($apns);
fclose($apns);
任何有助于进一步调试的帮助都会非常感激。调试我的证书的东西?注意:我的 API 端点仅出于测试目的在 http 协议上提供,将它们更新为 https 协议。我已在设备上启用 HTTP 服务以安装 pass on passbook。
============ 更新 ============== 以下是生成我的证书的步骤。
- 首先,我使用 CSR 请求和我的密钥下载了我的 Pass Type Id 证书(.cer)。
- 然后使用 Mac 上的钥匙串访问将证书导出到
.p12
在创建时签署优惠券所需的扩展。该优惠券已成功安装在设备上。 然后我将其转换
.p12
为.pem
在上面的代码中用于连接推送服务器。使用命令;openssl pkcs12 -in path.p12 -out newfile.pem
如果我的证书生成有任何问题,请指出。