2013-04-06 119 views
4

我有一个推送通知令牌(约10k)为我的应用程序的列表,我是而不是跟踪活动/删除令牌的状态。当新用户被添加到系统中时,它被添加了推送令牌通过PHP广播推送通知

(一个设备可以容纳一个推送通知令牌,以防令牌更改 - 在我的应用生命周期的最后6个月内未发生 - 修改它与新的令牌)

对于发送推送通知到单个用户我使用下面的PHP脚本

<?php 
// connecting to sql 
sql_connect(); 
// get user token from sql 
$token = sql_gettoken(); 

// Put your device token here (without spaces): 
$deviceToken = $token; 
// Put your private key's passphrase here: 
$passphrase = 'my_passphrase'; 

// Put your alert message here: 
if ($_GET["message"]) $message = $_GET["message"]; 
else $message = 'This is a default message in case no message is defined'; 

//////////////////////////////////////////////////////////////////////////////// 

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

// Open a connection to the APNS server 
$fp = stream_socket_client(
    'ssl://gateway.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, 
    '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; 

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

我相信,如果我保持$ FP(连接到APNS服务器)打开我可以发送多个推送通知之间(我不确定?)。但我已经读过,如果令牌离线/删除应用程序,然后连接被苹果方关闭,这意味着推送通知周期将失败。

将此单个推送通知脚本转换为广播通知的任何提示?因为第一次测试是实况转播,所以我对此感到气馁,我只有一次投篮。

编辑:我已经错过了最重要的部分,如果我只是去和所有设备令牌环,这意味着它将尝试调用这个已删除的应用程序和活性物质,称之为PHP脚本,将苹果块/取消激活/禁止我的证书或我的发送推送通知的能力?

  • 对于那些寻找广播的人来说,苹果似乎对推送通知没有任何限制。

干杯

+0

+1对于您的编辑,我建议您查看[反馈服务](http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html),你可以在网上查找PHP中的示例代码,如果你得到有效的反馈,即用户还没有卸载应用程序,你可以发送推送通知。 – 2013-04-06 12:00:48

+0

@Jennis感谢您的反馈服务,我会研究它。使用它,我可以检查并发送推送通知(如果可用),并且我可以使用此脚本,但这意味着1个连接到APNS,1个检查,1个推送(如果可用)和1个连接关闭时间,所有令牌。它会在几分钟内发生,这就像对APNS服务器的40k动作。它会被视为垃圾邮件吗? – Bartu 2013-04-06 12:34:20

+0

不应该的情况下,也没有记录限制可用的或者我可以为目前搜索,[检查这(http://stackoverflow.com/questions/5374135/any-limitation-push-notification-via-apns - 或 - c2dm),请保持连接打开,直到发送所有推送通知。 – 2013-04-06 12:39:22

回答

3

你应该保持连接和发送使用相同的连接,只要它保持开放的通知。这就是苹果说你应该做的。

如果应用程序已从设备上卸载,则发送到该设备时连接将不会关闭。只有当令牌对当前环境永远无效时(它通常发生在您尝试将沙箱设备令牌发送到生产环境时(反之亦然)),或者消息有其他错误(例如,有效负载太长)。

当您向卸载应用程序的设备发送通知时,APNS会发现设备已卸载该应用程序,并且以后在您拨打反馈服务时会获得该设备令牌。 Apple会要求您定期拨打反馈服务,并从数据库中删除由其返回的设备。如果您不使用反馈服务,并且不断向通过多次卸载应用程序的设备发送通知,Apple可能会阻止您。

我建议你阅读Troubleshooting Push Notifications,尤其是推送通知吞吐量和错误检查部分。这非常有帮助。