博客> 远程推送-踩过的坑!
远程推送-踩过的坑!
2017-09-23 04:21 评论:0 阅读:137 Lambert_F
ios 远程推送
最近项目有个需求,后台服务器需要把室内机报警和呼叫请求消息推送给室内机好友(即手机客户端),需要用到苹果远程推送。然而,测试好的推送,上架后(生产环境)竟然不能推送,客户催得紧,妈蛋,赶紧排查:

首先说下我的 1.证书制作:请参照 http://www.open-open.com/lib/view/open1431566847716.html,最后打包生成一个XX.pem的推送证书,此类资料网上一搜一大把,此处略过

2.测试环境搭建: 至于配置服务器,首先需要在mac的终端启动Apache和PHP,可以借鉴这篇文章:http://www.tuicool.com/articles/ZjmqYb3

搭建过程(基于PHP已经开启的状态): 1)Finder -> 前往文件夹 -> 输入: /Library/WebServer/Documents/ -> 前往,跳转到服务器文件夹,在里面创建一个文件夹push -> 将打包的XX.pem证书文件复制到这个文件夹 -> 在此文件夹下创建一个PHP文件 如push.php,记得更改文件的操作权限,其代码主要为下: <?php set_time_limit(0); sleep(1); // 此处根据测试或生产环境选择不同的deviceToken(记得去掉空格) $deviceToken = '**4879524d0a6ca79bdfc0f17b4f2eaa5****';

// Put your private key's passphrase here:证书密码(导出p12文件时要求输入的密码)
$passphrase = '*********';

// Put your alert message here:推送消息
$message = 'hello';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'allow_self_signed', true);
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
//这个为正是的发布地址
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
//这个是沙盒测试地址,发布到appstore后记得修改哦
//$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
//$fp=stream_socket_client("udp://127.0.0.1:1113", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
                     'alert' => $message,
                     'sound' => 'default'
                     );

// Encode the payload as JSON
$payload = json_encode($body);
//$deviceToken = str_replace(' ', '', $deviceToken);
// 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));

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

?>

将上面代码复制粘贴到simplepush.php中,只需要改动其中四个地方: 第一个是:deviceToken,将1中获取的token复制过来; 第二个是:passphrase,是在合成私钥时输入的密码; 第三个是:local_cert后面的ck.pem,改成自己合成的公钥和私钥pem的合成文件xx.pem; 第四个是:根据测试或生产环境切换地址。 此处有大坑请绕行:测试和生产的deviceToken是不一样的,千万不要用测试的deviceToken去测生产环境,楼主原本以为不管测试和生产deviceToken都是一样的,在此掉坑许久(推送成功,但手机收不到消息)。

3.测试: 在终端输入(需在证书和PHP文件的同一目录下)php push.php 将收到 Connected to APNS Message successfully delivered

或在浏览器输入:http://localhost/push/push.php 如果显示为:Connected to APNS Message successfully delivered 则已经推送成功了,手机将收到推送。

最后发现问题是:由于我们服务器测试和生产是同一环境,上架后服务器链接的还是测试的环境,把我测试的php发给后台参照修改,终于问题解决啦!

收藏
0
sina weixin mail 回到顶部