如何将数组循环适应当前接受/发送到单个ios设备令牌的ios推送通知功能


How can I adapt an array loop to this ios Push Notification function that currently accepts / sends to a SINGLE ios Device token?

我正在为我已经构建并成功启动的 iOS 应用程序构建推送通知例程,并且使用以下代码可以正常工作的单个设备令牌的通知,但我想将通知发送到多个设备令牌(我会从 mySQL 数据库中提取这些令牌并将该数组传递给处理推送通知过程的 PHP 页面)...

这是我现在用于单设备令牌测试的代码:

<?php
// Message to send
$message = 'Test Push Notification message sent at '. date('H:i');
// Put your device token here (without spaces):
$deviceToken = 'abcdefghijklmnopqrstuvwxyz1234567890';  // DADS device
////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $certfile);
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;
// Create the payload body
$body['aps'] = array(
    'alert' => $message,
    'badge' => 1,
    'sound' => 'default'
);

// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . 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;
    echo $result ;
// Close the connection to the server
fclose($fp); return $response;
?>

由于这是我第一次真正体验 php(我每天都在处理 AS3、javascript、一些和一些遗留的 VBscript/classic ASP),我尝试了基于 PHP 的数组循环,并且能够完成这个非常基本的例程......我的目标是将其添加到上述代码中,以使用与推送通知服务器的单个连接向所有设备令牌发送一条消息:

// START WITH A COMMA SEPARATED STRING OF VALUES AND TURN IT INTO AN ARRAY...
$myArr = 'test1, test2, test3, test4, test5';
$myList = explode(", ",$myArr);

// HEAVY LIFTING HANDLED HERE... A FUNCTION THAT LOOPS THROUGH ARRAY, AND SHOWS THE VALUE AND THE LENGTH OF THE VALUE
function doArrayListing($funcList){
    foreach ($funcList as $value) {
        print_r($value . "  " . strlen($value) ."'n");
    }
}
// CALL THE FUNCTION AND PASS THE ARRAY TO IT...
doArrayListing($myList);
所以简而言之,

我试图使用类似的东西来循环访问设备令牌数组,发送消息并在完成每个 OR 后验证/读取响应。

我的计划"B"是执行一个过程,该过程仅将消息发送到单个设备令牌,然后等待 x 秒再调用它,但是例如,如果我有 300 个设备令牌,则可能需要很长时间才能发送给所有用户...更不用说我不知道我是否能够延长 php 页面/进程的超时。

我还在研究 apns 反馈服务,因为根据我的研究,听起来如果我发送到设备令牌列表,并且其中一个无效或不再在 apns 中注册,那么连接就会断开,它就会死亡......所以我会事先运行一个进程,从我的数据库中删除任何无效的设备令牌。

感谢任何人可以为此提供的任何帮助/指导!

对于任何可能遇到这种情况的人来说,答案似乎就像修改它以执行多个$fwrites一样简单......

foreach ($myDevicesArray as $deviceToken) {
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . 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;
    echo $result ;
};

。所以基本上,我有我的设备令牌数组,我遍历该数组,构建二进制通知,然后发送到服务器,然后print_r结果。