首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单格式apn

简单格式apn
EN

Stack Overflow用户
提问于 2012-08-18 13:45:08
回答 1查看 975关注 0票数 0

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

使用简单的格式,如果以某种方式发送格式错误的通知包(例如,有效负载超过规定的限制),则APN通过切断连接来响应。

但是,如果消息(简单格式)是正确的呢?如果我发送保持活动的数据包,APN会停止连接吗?我不想建立一个非常多的连接,因为这可能被视为DOS。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-19 16:29:02

对我的评论进行了详细说明:

  • 打开到APNS服务器的单个连接,连接到设备ID的SQL (或类似的)数据库(正式名称:设备令牌,而不是UDID),然后遍历这些--创建有效负载,然后将其发送到APNS服务器。
  • 您还可以考虑检查设备列表中的距离,以便如果您和APNS服务器之间的连接被切断(或者发生了其他事情),那么您可以再试一次。
  • 如果确实发生错误,则在断开连接之前,an服务器将返回错误响应数据包。有关这方面的更多信息,请参见docs,链接在这里的表5-1。

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

代码语言:javascript
复制
// 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中的沙箱或活动推送服务器之间切换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12019077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档