APN单一尺寸(simple format apn)

2019-09-21 08:19发布

我在苹果推送通知服务指南阅读:

通过简单的格式,如果您发送的通知包就是以某种方式,例如畸形,有效载荷超过了规定的限度,通过的APN切断连接响应。

但是,如果消息(简易格式)就是正确的吗? 将十个分量的APN的连接,如果我发送保活包? 我不希望建立一个非常大的数量的连接,因为这可能被视为DOS。

Answer 1:

散列了我的意见,以更详细的版本:

  • 打开到APNS服务器的单个连接,连接到您的SQL(或类似)的设备ID的数据库(正式:设备令牌,不UDID),并遍历这些 - 创建有效载荷,然后发送该到APNS服务器。
  • 您也可以考虑检查你有多远沿着你的设备列表中,因此,如果连接你和APNS服务器(或别的东西时)之间被切断,那么你可以再次尝试。
  • 如果出现错误,切断连接之前APNS服务器会返回一个错误响应包。 这个更多的信息可以在文档的表5-1可以发现, 在这里连结 。

下面是我的第一点细节的示例:

// connect to your MySQL database
$con = mysql_connect("localhost", "username", "password");

// select a database
mysql_select_db("my_database", $con);

// run a query to grab your device tokens
$result = mysql_query("SELECT device_tokens FROM some_table");

// set your message
$msg = 'important update';

// create the payload
$body['aps'] = array('alert' => array('body' => $msg, 'action-loc-key' => 'Read'));

// convert to JSON
$payload = json_encode($body);

// setup APNS connection
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', 'password');

// open a connection to the APNS server
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

while ($row = mysql_fetch_array($result))
{
    $deviceToken = $row['device_tokens'];
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
    fwrite($apns, $apnsMessage, strlen($apnsMessage));
}

// close APNS connection
fclose($apns);

// close database connection
mysql_close($con);

...并记住沙箱或现场推送服务器之间的URL在上面的代码转换。



文章来源: simple format apn