【发布时间】:2014-10-12 08:42:47
【问题描述】:
我有一个带有 MySQL 数据库的 PHP 脚本,用于 Apple 推送通知。该脚本有效,但并非所有通知都会收到通知。怎么了?
<?PHP
$db_user = "xx_fw"; // Gebruiker voor MySQL
$db_pass = "xxx"; // Wachtwoord voor MySQL
$db_host = "localhost"; // Host voor MySQL; standaard localhost
$db_db = "xx_fw"; // Database
// Als je al ergens anders een database connectie hebt gemaakt,
// maak dan van de volgende twee regels commentaar (# of // ervoor zetten)
mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_db);
$query = mysql_query("SELECT * FROM iospush");
$deviceToken = ARRAY();
while ($row = mysql_fetch_array($query)) {
$deviceToken[] = $row["token"];
}
if($_POST['politie']){
$message = stripslashes($_POST['message']);
$politiemessage = "POLITIEBERICHT: ".$message;
$payload = '{
"aps" :
{ "alert" : { "body" : "'.$politiemessage.'" },
"badge" : 1,
"sound" : "politiepush.wav"
}
}';
$ssl='ios-ssl.pem';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $ssl);
stream_context_set_option($ctx, 'ssl', 'passphrase', 'xxx');
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if(!$fp){
print "Failed to connect $err $errstrn";
return;
} else {
print "Notifications sent!";
}
$devArray = array();
$devArray[] = $deviceToken;
foreach($deviceToken as $token){
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack ("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "n";
fwrite($fp, $msg);
echo "<br><br>";
echo "Verstuurd aan: ".$token;
echo "<br><br>";
}
fclose($fp);
} else if($_POST['message']){
$message = stripslashes($_POST['message']);
$payload = '{
"aps" :
{ "alert" : { "body" : "'.$message.'" },
"badge" : 1,
"sound" : "chime"
}
}';
$ssl='ios-ssl.pem';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $ssl);
stream_context_set_option($ctx, 'ssl', 'passphrase', 'xxx');
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if(!$fp){
print "Failed to connect $err $errstrn";
return;
} else {
print "Notifications sent!";
}
$devArray = array();
$devArray[] = $deviceToken;
foreach($deviceToken as $token){
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack ("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "n";
fwrite($fp, $msg);
echo "<br><br>";
echo "Verstuurd aan: ".$token;
echo "<br><br>";
}
fclose($fp);
}
?>
问题是发送推送的方式,还是苹果方面出了问题? 谢谢!
【问题讨论】:
-
请记住,Apple 不保证消息的传递。另外,这是我的经验,当我使用开发推送服务器时,它有时没有发送通知,或者在严重延迟后发送通知。使用生产 APNS 它没有这些问题
-
但这是生产服务器,而不是开发服务器..
-
运行此脚本时您在屏幕上看到的输出是什么?
-
我会在我的数据库中看到“通知发送!发送消息:xx Verstuurd aan:xx”。没有错误
-
我有个主意;数据库中有多少个设备?您绝对确定此代码会尝试将通知发送到每个设备吗?我只是想,也许这个脚本执行的时间太长了,你的服务器在脚本被杀死之前可以花多长时间有一些限制;通常这些推送服务器脚本作为守护进程运行,而不是作为响应 POST 请求的东西。
标签: php mysql ios apple-push-notifications