Php 向多个设备令牌发送推送通知
我有一个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,
$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问题中的一个(关于连接和文件)