记录第一次整合ios推送遇到的坑
2018-01-23 00:00
411 查看
测试环境
OSX证书生成
这部分很多教程,基本没什么坑,直接跳过了尝试连接
function send(){ $deviceToken = 'xx='; $ctx = stream_context_create(); // ck.pem is your certificate file stream_context_set_option($ctx, 'ssl', 'local_cert', '/cert/push.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', self::$passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); // Create the payload body $body['aps'] = array( 'alert' => array( 'title' => $data['mtitle'], 'body' => $data['mdesc'], ), 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); // Close the connection to the server fclose($fp); if (!$result) return 'Message not delivered' . PHP_EOL; else return 'Message successfully delivered' . PHP_EOL; }
第一次测试:失败
返回错误:1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
缺少本机的验证证书
cd 进去 /etc/ssl/certs 发现空空如也,然后
curl http://curl.haxx.se/ca/cacert.pem -o ./cacert.pem
把默认的cacert.pem加进去,然后再加到php.ini openssl.cafile=/etc/ssl/certs/cacert.pem 里,再跑代码
第二次测试:失败
返回错误:1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
握手失败最先想到应该是证书错误了,估计没读到push证书,把证书地址改成如下
stream_context_set_option($ctx, 'ssl', 'local_cert', __DIR__.'/cert/push.pem');
再跑一次
第三次测试:失败
返回错误:pack(): Type H: illegal hex digit z
证书的问题是过了,不过这个应该是代码的问题,代码是网上copy过来的,还没细看。
改成如下:
$msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', sprintf('%u', CRC32($deviceToken)))) . pack('n', strlen($payload)) . $payload;
再跑一次
第四次测试:成功
最终代码:function send(){
$deviceToken = 'xxx';
$ctx = stream_context_create();
// ck.pem is your certificate file
stream_context_set_option($ctx, 'ssl', 'local_cert', __DIR__.'/cert/push.pem');stream_context_set_option($ctx, 'ssl', 'passphrase', self::$passphrase);
// stream_context_set_option($ctx, 'ssl', 'extensions', 'ssl_client');
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
$data['mtitle'] = 'test';
$data['mdesc'] = 'hello world';
// Create the payload body
$body['aps'] = array(
'alert' => array(
'title' => $data['mtitle'],
'body' => $data['mdesc'],
),
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', sprintf('%u', CRC32($deviceToken)))) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
// Close the connection to the server
fclose($fp);
if (!$result)
var_dump('Message not delivered' . PHP_EOL);
else
var_dump('Message successfully delivered' . PHP_EOL);
}
Testcase的代码就不贴出来了,然后去看看IOS端能不能接收到了,拜拜。
相关文章推荐
- 第一次使用MongoDB 插入记录遇到的问题
- 【转】iOS消息推送实现过程记录
- 记录遇到的ios下的bugs[废弃]
- ssh整合中遇到的问题及解决记录
- iOS推送遇到终端无法生成pem
- iOS 【极光推送】第一次打开app,收不到推送消息
- 整合两个工程遇到的小问题~记录一下
- 制作IOS 后台推送时,遇到的小问题
- iOS学习爬坑记录14:自定义远程推送通知铃声(Custom Alert Sounds)
- 记录iOS的消息推送
- IOS开发日志记录 - 推送
- iOS 远程推送参考资料及自己遇到的问题
- 记录一下第一次工作时遇到的问题有关iframe父子页面相互调用
- iOS 10、Xcode 8 遇到部分问题解决记录
- 解决hive+hbase整合的时候遇到问题记录
- 适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue
- 最近做了一个iOS小应用,记录下遇到的问题以及解决方法
- iOS证书与推送通知证书制作过程遇到的问题
- iOS中数据类型转换--遇到则记录
- 记录遇到的ios下的坑和bugs