我有一个iPhone应用程序,它接收从PHP服务器发送的推送通知。我为此任务实施了tutorial on Raywenderlich。
我正在为用户日历中的日程安排发送推送通知,并且一些用户报告了重复发送提醒用户有关特定日程安排的推送通知。
准确地说,当第一次通知出现时它表现正常,但是当第二次通知时它也会显示较旧的通知。旧通知的时间也很旧。只有当前通知显示Now
,旧版通知会显示10 hours ago
之类的内容。然后第三个通知显示3个通知,依此类推。
有人告诉我使用APNSPHP library并在每个通知上设置唯一的自定义标识符,但这也无济于事。
我正在做的是我通过与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);
}
}
有其他人遇到过这样的问题吗?