转载请标明出处
欢迎交流
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数组,所以第一次循环的时候,数组就被改变了,所以不会推送成功(只推送数组第一个设备)。所以只要把返回值付给另一个变量即可。