我有一个接收从 PHP 服务器发送的推送通知的 iPhone 应用程序。我为此任务实现了关于 Raywenderlich 的教程。
我正在发送用户日历中日程的推送通知,一些用户报告说,提醒用户特定日程的推送通知被重复发送。
准确地说,当第一个通知出现时,它的行为正常,但当第二个通知出现时,它也会显示较旧的通知。旧通知的时间也很旧。仅显示当前通知Now
,较旧的通知显示类似10 hours ago
. 然后第三个通知显示 3 个通知,依此类推。
有人告诉我使用APNSPHP 库并在每个通知上设置一个唯一的自定义标识符,但这也无济于事。
我正在做的是通过与 APNS 的单个连接发送多个推送通知(尽管发送给不同的用户)。有效负载包含一个键和一个参数列表,这些参数与存储在 iPhone 应用程序的 Localizable.strings 中的本地化格式化字符串列表相对应。
function __push_data($push_notifications, $push_content) {
$ctx = stream_context_create();
if (ENVIRONMENT == 'development') {
stream_context_set_option($ctx, 'ssl', 'local_cert', 'dev.combined.pem');
} else if (ENVIRONMENT == 'production') {
stream_context_set_option($ctx, 'ssl', 'local_cert', 'prod.combined.pem');
}
stream_context_set_option($ctx, 'ssl', 'passphrase', A_PRIVATE_KEY);
/* Open a connection to the APNS server */
$apns_server = "ssl://gateway.sandbox.push.apple.com:2195";
if (ENVIRONMENT == 'production') {
$apns_server = "ssl://gateway.push.apple.com:2195";
}
$fp = stream_socket_client(
$apns_server, $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if ($fp) {
foreach ($push_notifications as $index => $push_notification) {
$body = array();
/* Create the payload body */
$body['aps'] = array('alert' => array('loc-key' => $push_notification['key'], 'loc-args' => $push_notification['message']), 'sound' => 'default');
$body['sopnc'] = $push_content;
/* Encode the payload as JSON */
$payload = json_encode($body);
/* Build the binary notification */
$msg = chr(0) . pack('n', 32) . pack('H*', $push_notification['push_token']) . 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);
}
}
有没有其他人遇到过这样的问题?