我可以将通知推送到一台设备,但无法循环推送

发布于 2024-12-23 01:05:13 字数 2490 浏览 0 评论 0原文

我对推送通知服务进行了编码,如下所示。它将获取存储在 test_db 中的令牌,然后发送它。问题是我没有收到来自所有设备的通知。但是,如果我向一台特定设备发送通知并取消注释 **//if( $row['pushtoken']=='bfd53a383e0f65bc96b43f3547548ec13d4c46d61526d7b6be5d7ed581563e77')**,则该设备将收到通知。这很奇怪。这是我的代码:

$link = mysql_connect('localhost', 'root', '111111');
if (!$link) {
    error_log( "mysql_connect fail\n");
    die('could not connect: ' . mysql_error());
}
else
{
    $is_db_selected = mysql_select_db('test_db',$link);
    if($is_db_selected)
    {
        $sql = "select * from pushtoken;";
        error_log($sql);
        $result = mysql_query($sql, $link);
        if ($result) 
        {
            echo "ready to push notification\n";
            $apnsHost = 'gateway.sandbox.push.apple.com';
            $apnsPort = 2195;
            $apnsCert = 'aps_dev.pem';

            $streamContext = stream_context_create();
            stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

            $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 10, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT , $streamContext);
             if (!$apns)
                exit("Failed to connect: $error $errorString" . PHP_EOL);
            echo 'Connected to APNS' . PHP_EOL;
            ob_flush();
            flush();
            $payload['aps'] = array('alert' => 'xman give mortal 7 messages!!!', 'badge' => 1, 'sound' => 'default');
            $payload = json_encode($payload);
            while ($row = mysql_fetch_assoc($result)) 
            {
                ***//if( $row['pushtoken']=='bfd53a383e0f65bc96b43f3547548ec13d4c46d61526d7b6be5d7ed581563e77')***
                {
                echo "push notification one by one\n";
                $deviceToken = $row['pushtoken'];
                $apnsMessage = chr(0) . pack("n", 32) . pack('H*',  $deviceToken) .pack("n", strlen($payload)). $payload;
                if(fwrite($apns, $apnsMessage,strlen($apnsMessage))==FALSE)
                {
                    echo "can't write to socket!<br />";
                }
                    ob_flush();
                flush();
                //fclose($apns);
                echo "token is ".$deviceToken ."\n";
                //break;
                }


            }
            //socket_close($apns);
            fclose($apns);
        } else {
            error_log ('error select pushtoken: ' . mysql_error() . "\n");
        }

    }       
}

I code my push notification service as shown below. It will gain token stored in test_db and then send it. The problem is that I don't receive notification from all my device. But, if I send notification to one specific device and I uncomment **//if( $row['pushtoken']=='bfd53a383e0f65bc96b43f3547548ec13d4c46d61526d7b6be5d7ed581563e77')**, the device will receive a notification. It is very weird. Here is my code:

$link = mysql_connect('localhost', 'root', '111111');
if (!$link) {
    error_log( "mysql_connect fail\n");
    die('could not connect: ' . mysql_error());
}
else
{
    $is_db_selected = mysql_select_db('test_db',$link);
    if($is_db_selected)
    {
        $sql = "select * from pushtoken;";
        error_log($sql);
        $result = mysql_query($sql, $link);
        if ($result) 
        {
            echo "ready to push notification\n";
            $apnsHost = 'gateway.sandbox.push.apple.com';
            $apnsPort = 2195;
            $apnsCert = 'aps_dev.pem';

            $streamContext = stream_context_create();
            stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

            $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 10, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT , $streamContext);
             if (!$apns)
                exit("Failed to connect: $error $errorString" . PHP_EOL);
            echo 'Connected to APNS' . PHP_EOL;
            ob_flush();
            flush();
            $payload['aps'] = array('alert' => 'xman give mortal 7 messages!!!', 'badge' => 1, 'sound' => 'default');
            $payload = json_encode($payload);
            while ($row = mysql_fetch_assoc($result)) 
            {
                ***//if( $row['pushtoken']=='bfd53a383e0f65bc96b43f3547548ec13d4c46d61526d7b6be5d7ed581563e77')***
                {
                echo "push notification one by one\n";
                $deviceToken = $row['pushtoken'];
                $apnsMessage = chr(0) . pack("n", 32) . pack('H*',  $deviceToken) .pack("n", strlen($payload)). $payload;
                if(fwrite($apns, $apnsMessage,strlen($apnsMessage))==FALSE)
                {
                    echo "can't write to socket!<br />";
                }
                    ob_flush();
                flush();
                //fclose($apns);
                echo "token is ".$deviceToken ."\n";
                //break;
                }


            }
            //socket_close($apns);
            fclose($apns);
        } else {
            error_log ('error select pushtoken: ' . mysql_error() . "\n");
        }

    }       
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青丝拂面 2024-12-30 01:05:13

您可能需要检查所有令牌是否有效。在过去,我遇到了一个问题,如果我的数据库中有开发令牌并尝试使用生产推送服务器,则在使用开发令牌的消息之后发送的所有消息都将无法传递。

You may want to check that all of the tokens are valid. In the past I had an issue where if I had a dev token in my DB and tried to use the production push server all the messages that were sent after the message using the dev token would fail to be delivered.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文