Apple Push Notifications apns批量推送失败,有些用户获得了推送,有些则没有,为什么?

时间:2019-11-15 01:24:21

标签: push-notification apple-push-notifications

我正在通过php脚本向我的应用程序用户发送批量推送通知。我的用户群很小,只有675名左右。

当我只有几百个用户时,脚本运行良好。但是在大约400个用户标记时,脚本突然出现504错误超时。有些用户会收到推送通知,有些则不会。

这是我正在使用的脚本。在网上找到。 (谢谢你写的人。)

    $query ="SELECT * FROM ios_tokens";
    $execute=mysqli_query($conn,$query);
    while($row=mysqli_fetch_array($execute)){
        $deviceToken[] = $row['devicetoken'];
    }
    if(empty($feedback_tokens)){
        //Start IOS Push Notification
        $passphrase = 'abcd1234';
        $data = array('mtitle'=>'My App', 'mdesc'=>$notify_msg);
        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.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|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'],
            ),
            'badge' => 1,
            'sound' => 'default'
        );
        // Encode the payload as JSON
        $payload = json_encode($body);
        // Build the binary notification
        foreach($deviceToken as $token){
            $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack        ("n",strlen($payload)) . $payload;
            // Send it to the server
            $result = fwrite($fp, $msg, strlen($msg));
        }
        // Close the connection to the server
        fclose($fp);

有人对为什么只有部分通知通过有任何想法吗?我尝试在每发送50条消息后发出一个sleep命令,但此后我没有超时,但是一些通知没有通过。

        foreach($deviceToken as $i => $token){

            if ($i > 0 && $i % 50 == 0) {
        echo 'sleeping for 8 seconds...'."/r/n<br>";
            sleep(8);
            }

        $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack        ("n",strlen($payload)) . $payload;

        // Send it to the server
        $result = fwrite($fp, $msg, strlen($msg));
        }

更多数据。前100个左右发出的通知始终会通过。只是最后几百个没有成功。

感谢您的帮助。

0 个答案:

没有答案