从服务器向所有设备发送推送通知

Posted

技术标签:

【中文标题】从服务器向所有设备发送推送通知【英文标题】:Send Push Notifications to all devices from server 【发布时间】:2013-03-19 07:15:18 【问题描述】:

我想向所有设备发送推送通知。我通过将所有设备令牌保存在我的数据库中来做到这一点。然后loop 将我的消息发送到所有设备。

这是我将设备令牌发送到服务器的代码:

NSString *deviceTokenString = [[[deviceToken description]
                           stringByReplacingOccurrencesOfString: @"<" withString: @""]
                          stringByReplacingOccurrencesOfString: @">" withString: @""];


NSString *devicedeviceTokenForRealNow = deviceTokenString;

deviceTokenString = [deviceTokenString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

NSString *strURL = [NSString stringWithFormat:@"http://website/DeviceToken.php?devicetoken=%@",deviceTokenString];
NSLog(@"%@", strURL);
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];

NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];

NSLog(@"%@", strResult);

NSLog(@"%@", devicedeviceTokenForRealNow);

这是我的 PHP 代码:

<?PHP

if($_POST['message'])

///COUNT THE NUMBER OF DEVICES THAT IS IN THE DATABASE TO USE IN LOOP

    $con = mysql_connect(localhost,load2unet_root,hzXC3rUm) or die(mysql_error());
    mysql_select_db(load2unet_db,$con) or die(mysql_error());

    $sql = "SELECT COUNT(DeviceID) FROM DeviceToken";
    $res = mysql_query($sql,$con) or die(mysql_error());

    $row = mysql_fetch_array($res);

    $hello .= "\"" . $row["COUNT(DeviceID)"] . "\"";

    while($row = mysql_fetch_array($res))
        $hello .= " , \"" . $row["COUNT(DeviceID)"] . "\"";

    


/// USE LOOP TO SEND THE PUSH NOTIFICATION TO ALL DEVICES

for ($i=1; $i<=$hello; $i++)


    $con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error());
    mysql_select_db($DB_Name,$con) or die(mysql_error());

    $sql = "SELECT DeviceToken FROM $DB_Table WHERE DeviceID = $i;";
    $res = mysql_query($sql,$con) or die(mysql_error());

    $row = mysql_fetch_array($res);

    //$result .= "\"" . $row["DeviceToken"] . "\"";
    $deviceToken .= "" . $row["DeviceToken"] . "";
    while($row = mysql_fetch_array($res))
        $deviceToken .= "" . $row["DeviceToken"] . "";

    


$message = stripslashes($_POST['message']);

$payload = '
                "aps" : 

                     "alert" : "'.$message.'",
                      "badge" : 1,
                      "sound" : "bingbong.aiff"
                     
            ';

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'no');
stream_context_set_option($ctx, 'ssl', 'passphrase', 'no');
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if(!$fp)
    //print "Failed to connect $err $errstrn";
    return;
 else 
    //print "Notifications sent!";


$devArray = array();
$devArray[] = $deviceToken;

foreach($devArray as $deviceToken)
    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack        ("n",strlen($payload)) . $payload;
    //print "sending message :" . $payload . "n";
    fwrite($fp, $msg);

fclose($fp);
print "This is the Device Token Sent Each Time".$deviceToken."\n";


使用此代码,我尝试了for ($i=1; $i&lt;=1; $i++),并且成功了。但不是for ($i=1; $i&lt;=6; $i++)

有人可以帮忙吗?任何帮助将不胜感激! :D

【问题讨论】:

嗨,你能粘贴解决方案吗?我在发送通知时遇到同样的问题。如果只有一个令牌,我可以发送,但是当有更多时,我就不能发送。请帮忙 【参考方案1】:

试试ApnsPHP库,

这里还有一个push many demo sample_push_many.php

希望对你有帮助。

谢谢

【讨论】:

谢谢你的回答。在我的代码中,我必须在loop 的末尾添加$deviceToken = ""; 才能使其工作。不过谢谢!! @tnylee:也许你应该编辑你的问题并说出问题所在。它可能会帮助其他人。

以上是关于从服务器向所有设备发送推送通知的主要内容,如果未能解决你的问题,请参考以下文章

我们可以从 iOS 设备向 APNs 发送推送通知吗?

如何使用 Cordova 推送插件向我的所有设备发送推送通知

iOS 推送通知 - 向所有人发送消息

从 Windows Phone 设备向 Web 服务发送推送通知

从苹果推送通知服务向服务器发送设备令牌

通过通知中心向所有用户发送推送通知