Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向多个设备令牌发送推送通知_Php_Ios_Xcode_Apple Push Notifications - Fatal编程技术网

Php 向多个设备令牌发送推送通知

Php 向多个设备令牌发送推送通知,php,ios,xcode,apple-push-notifications,Php,Ios,Xcode,Apple Push Notifications,我有一个PHP脚本: $q = mysql_query("SELECT `token` FROM `tokens`"); $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns.pem'); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60,

我有一个PHP脚本:

$q = mysql_query("SELECT `token` FROM `tokens`");

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns.pem');
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);


while($token = mysql_fetch_array($q))
{
    $deviceToken = $token[0];
    echo $deviceToken.": ";
    $payload['aps'] = array('alert' => $message, 'sound' => 'Completed.wav');
    $payload = json_encode($payload);

    if (!$fp)
    {
        echo "Failed to connect {$err} {$errstrn}<br />";
    }
    else
    {
        echo "Connection OK<br />";
    }

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

    if (fwrite($fp, $msg, strlen($msg)) === FALSE)
    {
        echo "can't write to socket!<br />";
    }
}

fclose($fp);
$q=mysql\u查询(“从“令牌”中选择“令牌”);
$ctx=stream_context_create();
stream_context_set_选项($ctx,'ssl','local_cert','apns.pem');
$fp=流\u套接字\u客户端($fp)ssl://gateway.sandbox.push.apple.com:2195“,$err,$errstr,60,流式客户端连接|流式客户端持久化,$ctx);
而($token=mysql\u fetch\u数组($q))
{
$deviceToken=$token[0];
echo$deviceToken。“:”;
$payload['aps']=array('alert'=>$message,'sound'=>'Completed.wav');
$payload=json_encode($payload);
如果(!$fp)
{
echo“未能连接{$err}{$errstrn}
”; } 其他的 { 回显“连接正常
”; } $msg=chr(0).pack(“n”,32).pack('H*,$deviceToken).pack(“n”,strlen($payload))。$payload; if(fwrite($fp,$msg,strlen($msg))==FALSE) { echo“无法写入套接字!
”; } } fclose($fp);

所有令牌的结果-连接正常!但是推送通知仅由一个设备接收!我尝试发送不同的消息,但结果没有改变:(

试试我的代码。我用4台设备进行了测试

很抱歉,这些评论都是西班牙语的

    <?php
include("../conectar.php");

if (isset($_GET['msj']) and isset($_GET['cupon']) and $_GET['msj'] != '' and $_GET['cupon'] != '') {

    $msj = $_GET['msj'];
    $cupon = $_GET['cupon'];

    echo '<textarea name="textarea" id="textarea" cols="70" rows="10">';

    // Le mandamos el msj a todos los tokens registradosdevice_token
    $sql =  "SELECT * FROM  active_users";
    $resultSql = mysql_query($sql) or die (mysql_error());

    echo "Se enviaran: ".mysql_num_rows($resultSql)." notificaciones" . PHP_EOL;
    ob_flush();
    flush();

    $i = 0;
    while($row = mysql_fetch_array($resultSql)) {

        $deviceToken[$i] = $row['token'];
        $i++;
    }

        // Put your private key's passphrase here:
        $passphrase = '****';

        // Put your alert message here:
        $message = $msj;

        ////////////////////////////////////////////////////////////////////////////////    
        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
        stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

        // Open a connection to the APNS server
        $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;
        ob_flush();
        flush();

        // Create the payload body
        $body['aps'] = array(
            'alert' => $message,
            'sound' => 'default',
            'badge' => '+1'
        );
        $body['tags'] = array(
            'cupon' => $cupon
        );

        // Encode the payload as JSON
        $payload = json_encode($body);

        for($i = 0; $i<count($deviceToken); $i++) {

            // Build the binary notification
            $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken[$i]) . pack('n', strlen($payload)) . $payload;

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

            if (!$result)
                echo 'Message not delivered' . PHP_EOL;
            else
                echo 'Message successfully delivered' . PHP_EOL;
            ob_flush();
            flush();

        }

        // Close the connection to the server
        fclose($fp);

    echo '</textarea>';
}else{
    echo 'error #2';
}
?>

只是一个(可能很愚蠢)想法-APN网关在一个连接中支持多个PNs吗?也许你应该尝试在循环中移动流的打开/关闭。不,它不起作用。但我在google代码中找到了类,在这个类中实现了消息的唯一Id,但在apple文档中关于唯一Id没有关于这个Id…在我的例子中是打开关闭循环中的连接有效。有人解决了这个问题吗?请帮助我,当我在db中只有一个设备时,我可以发送通知,但当我不能发送多个设备时,我也可以在循环中包含stream\u socket\u client和fclose,时间稍微晚了一点…但这适用于meThis代码与e问题中的一个(关于连接和文件)