向群组发送推送通知

Posted

技术标签:

【中文标题】向群组发送推送通知【英文标题】:Send push notification to a group 【发布时间】:2011-12-23 07:08:21 【问题描述】:

我不确定如何向多个令牌发送推送通知。使用我的脚本,它似乎只向一个人发送推送通知......根据Apple,最好有一个打开的连接并保持打开状态并在需要时发送消息。不确定如何在我的 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"

【问题讨论】:

【参考方案1】:

好的。我发现了问题。

当编译为调试时,它只会在使用 DEV 认证时在第一个设备上发送。如果我使用像 Ad-Hoc 这样的部署,我必须使用 Prod Servers 和 Prod Certificates。

现在一切正常。

【讨论】:

所以你的意思是只有将 apns 证书从 dev 更改为 prod 才有效? 是的。当然选择 prod 推送服务器而不是沙盒服务器。这必须用于部署和产品构建。 哦,好的。很高兴知道您的问题已解决:)。顺便说一句,早些时候我也能够使用开发证书来实现这一点。不确定苹果方面是否有任何改变。【参考方案2】:

我认为你必须根据令牌的数量循环运行这个脚本。

意思是先获取token数组,然后根据count循环。然后从索引 0 中获取一个设备令牌并运行此脚本。然后在索引 1 处选择另一个标记,然后再次运行此脚本。

要将推送通知发送到您每次连接到苹果服务器并关闭连接并再次打开并发送的多个设备。这是这个过程。

【讨论】:

【参考方案3】:

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

如果您需要其他帮助,请查看此问题:How to send Push Notification to multiple devices?

【讨论】:

您确定令牌确实每次都被替换了吗?我的意思是正确的设备令牌是否被替换?你能放一些日志并检查一次吗?您是否在日志中收到“无法写入”声明?如果 fwrite 调用后连接自动断开,则可能是您的设备令牌无效。 不能写遗嘱不会被调用。令牌也被替换了......让我再做一些检查 经过几次检查后确定。不知何故,只有我在收到消息。所有其他令牌似乎都被忽略了。令牌是有效的,因为我没有从反馈服务中获得任何列表。 这看起来很奇怪。您可以尝试记录以数据包形式发送的实际二进制数据并进行验证吗?还可以尝试仅硬编码 2 个设备令牌并检查它是否有效。

以上是关于向群组发送推送通知的主要内容,如果未能解决你的问题,请参考以下文章

向群组发送消息(通知) - Android

如果我使用 Firebase 作为后端,我如何在 android 应用程序的后端发生事件时自动发送推送通知

使用 OneSignal 推送通知服务向特定测试设备发送推送通知

显示最后一个通知推送,我需要显示所有通知推送

限制向设备发送推送通知

如何在固定时间发送推送通知?