转载请标明出处
欢迎交流
zltqzj@163.com
我是一个单线程妞~
在写推送的时候,PHP老是有问题,网上的代码几乎都是给一台设备推送,我推送多台的时候有的设备接收不到,后来琢磨了一周,总算有点结果。
因为每次请教大牛的时候,很多大牛都会说,我只负责IOS客户端,不会PHP。汗死。
PHP代码,里面查询数据库中device token要换成你们自己的相关代码。
<?php
// 发布地址:gateway.push.apple.com:2195
// 测试通过
require_once "/home/bae/app/include/db.php";
$db_obj = new DB();
$sql = "select appleID from appleDevice ";
$result = $db_obj->db_array($sql);
$countArray = count($result);
$passphrase = 'zhaojian';
$message = '开发-推送-测试!';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$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);
echo 'Connected to APNS' . PHP_EOL;
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
for($i = 0; $i < $countArray; $i++)
{
$deviceToken = $result[$i]['appleID'];
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result1 = fwrite($fp, $msg, strlen($msg));
if (!$result1)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
}
fclose($fp);
?>
网上的代码最后fwrite的返回值都付给了device token数组,所以第一次循环的时候,数组就被改变了,所以不会推送成功(只推送数组第一个设备)。所以只要把返回值付给另一个变量即可。