如何提高Apple推送通知的成功率?

时间:2016-04-13 12:46:18

标签: php ios apple-push-notifications

我正在使用PHP脚本从我的服务器发送Apple推送通知(APN)。第一步是使用设备令牌和要发送的消息填充数据库表。然后我的脚本遍历这些表行并逐个发送通知。该脚本每分钟都由一个cronjob调用,如果我的表中有消息,它最多发送50个然后退出。我脚本中最重要的部分如下所示。

我可以使用此脚本向五个或十个测试设备发送消息,并成功传递所有消息。但是,如果我使用相同的脚本将消息发送到所有300个已注册的设备,则只有50%会被发送。同一设备有时会收到通知,有时则不会。所以,我知道我的脚本有效,而且我知道我的设备可以接收通知,但如果我想向所有设备发送消息,则只收到大约一半的消息。

我知道APN不能保证成功传递信息,但50%的成功率对我来说似乎很低。因此,这些是我的问题:

  • 通过APN发送的邮件的典型成功率是多少?
  • 我应该一次发送所有300个推送通知吗?
  • 有没有办法从APN服务器获取错误消息?

这是我脚本中的代码:

// create stream context
$ctx = stream_context_create();
stream_context_set_option(
    $ctx,
    'ssl',
    'local_cert',
    '/path/to/push.pem'
);
stream_context_set_option(
    $ctx,
    'ssl',
    'passphrase',
    $passphrase
);
// connect with Apple server
$fp = stream_socket_client(
    'ssl://gateway.push.apple.com:2195',
    $err,
    $errstr,
    60,
    STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
    $ctx
);
// get next 50 rows from database table
// ...
// for every row in my table
foreach( $rows as $row ) {
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    // send a message
    $result = fwrite($fp, $msg, strlen($msg));
    if( $result ) {
         // delete row from database
    } else {
         // log error
         break;
    }
}

0 个答案:

没有答案