Php 向组发送推送通知

Php 向组发送推送通知,php,iphone,queue,apple-push-notifications,Php,Iphone,Queue,Apple Push Notifications,我不确定如何向多个令牌发送推送通知。我的脚本似乎只向一个用户发送推送通知。。。根据苹果公司的说法,最好是有一个开放的连接,保持它的开放性,并在需要时发送消息。不知道如何在我的php服务器上执行 $payload['aps'] = array('alert' => "New Cave report for ".$caveName,'badge' => 1, 'sound' => 'default'); $payload['condition'] = array('conditio

我不确定如何向多个令牌发送推送通知。我的脚本似乎只向一个用户发送推送通知。。。根据苹果公司的说法,最好是有一个开放的连接,保持它的开放性,并在需要时发送消息。不知道如何在我的php服务器上执行

$payload['aps'] = array('alert' => "New Cave report for ".$caveName,'badge' => 1, 'sound' => 'default');
$payload['condition'] = array('conditionID' => $ccID, 'caveName' => $caveName);
$payload = json_encode($payload);

// Connection Part
$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = '/var/www/web543/files/apns-dev.pem';

if (!file_exists($apnsCert) )
{
    echo "Certification file not found!";
} else
{
    $streamContext = stream_context_create();
    stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort,$error,$errorString,2,STREAM_CLIENT_CONNECT,$streamContext);

    if ( !$apns )
    {
        echo "Connection Failed!".$errorString;
    } else
    {
        $db->query("SELECT DISTINCT token FROM notifications WHERE userID != '{$userID}'");
        if ($db->num_rows()>0) 
        {
            while ($db->next_record())
            {
                $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $db->f('token'))) . chr(0) . chr(strlen($payload)) . $payload;
                if ( fwrite($apns, $apnsMessage) === FALSE )
                {
                    echo "Can not write";
                }
            }
        }
    }

    fclose($apns);
}
$apnsMessage的一些输出

Token: 5a984922e19eab54f78fd54e24d5b02a3d30ccdbbeee34aadbdacaa687ee1261 Message: Z˜I"áž«T÷ÕN$Õ°*=0ÌÛ¾î4ªÛÚʦ‡îa†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: c607acc70bd4885bf56f3b4827523023bf93a1d644626768ab0304bb3b4414dc Message: ƬÇÔˆ[õo;H'R0#¿“¡ÖDbgh«»;D܆{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: 785ec3128972bd3d4c3e6fa1eeead97b73b0696e2361339a2467e6ba775b83ea Message: x^Ér½=L>o¡îêÙ{s°in#a3š$gæºw[ƒê†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: c592487e3c71e921d0b7a825b66ed5e58070fee709131535ac391f14febbcfdc Message: Å’H~Token: 061bc20ba3a0fc17c689e052b42b5789f502a52d43180ea114e3212077045315 Message: £ üƉàR´+W‰õ¥-C¡ã! wS†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}
Token: 26fb66fef67a122ca456f106363115285d4d7156e7c8ab6e51bd5bfa9bab2d03 Message: &ûfþöz,¤Vñ61(]MqVçÈ«nQ½[ú›«-†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}}

我认为您必须根据令牌的计数在循环中运行此脚本

表示首先获取令牌数组,然后根据计数进行循环。然后从索引0中获取一个设备令牌并运行此脚本。然后在索引1处选择另一个令牌,然后再次运行此脚本


要向多个设备发送推送通知,您必须每次连接到apple server并关闭连接,然后再次打开并发送。这是一个过程。

是的,您不应该每次需要发送推送时都创建和断开套接字连接。建立套接字连接后,可以向任意数量的设备写入任意数量的推送消息。 您观察到的确切问题是什么?你的套接字连接断开了吗


如果需要其他帮助,请查看此问题:

确定。我发现了问题

当编译为Debug时,它将仅在使用DEV认证的第一个设备上发送。如果我像adhoc一样使用部署,我必须使用Prod服务器和Prod证书


现在一切都正常了。

你确定代币每次都会被更换吗?我的意思是正确的设备令牌是否被替换?你能放一些日志并检查一下吗?日志中是否有“无法写入”语句?如果连接在fwrite调用后自动断开,则表示您的设备令牌可能无效。无法写入将不会被调用。而且代币正在被替换。。。让我再检查几次好的,检查几次之后。不知怎的,只有我得到了这些信息。所有其他托克似乎都被忽视了。这些令牌是有效的,因为我没有从反馈服务中得到任何列表。这似乎很奇怪。您能否尝试记录以数据包形式发送的实际二进制数据并进行验证?另外,试着只硬编码2个设备令牌,并检查它是否有效。那么,你的意思是,只有将apns证书从dev更改为prod才能奏效吗?是的。当然,选择prod push服务器而不是沙盒服务器。这必须用于部署和产品构建。哦,好的。很高兴知道您的问题已经解决:)。另一方面,早些时候我也能够使用开发人员证书实现这一点。但不确定苹果方面是否有任何改变。