我正在使用PHP脚本从我的服务器发送Apple推送通知(APN)。第一步是使用设备令牌和要发送的消息填充数据库表。然后我的脚本遍历这些表行并逐个发送通知。该脚本每分钟都由一个cronjob调用,如果我的表中有消息,它最多发送50个然后退出。我脚本中最重要的部分如下所示。
我可以使用此脚本向五个或十个测试设备发送消息,并成功传递所有消息。但是,如果我使用相同的脚本将消息发送到所有300个已注册的设备,则只有50%会被发送。同一设备有时会收到通知,有时则不会。所以,我知道我的脚本有效,而且我知道我的设备可以接收通知,但如果我想向所有设备发送消息,则只收到大约一半的消息。
我知道APN不能保证成功传递信息,但50%的成功率对我来说似乎很低。因此,这些是我的问题:
这是我脚本中的代码:
// 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;
}
}