我正在使用 this tutorial 学习推送通知。
<?php
// Put your device token here (without spaces):
$deviceToken = '1675ba8bb005740bb514222227f861c30230a81e6eed6bb6b8f353c57831341d';
// Put your private key's passphrase here:
$passphrase = '111134';
// Put your alert message here:
$message = 'My first push notification!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
echo 'result =' . $result. PHP_EOL;
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
我还为推送通知配置应用程序。配置推送后,我还重新创建配置文件,旧的删除一个,安装新的配置文件。 我运行应用程序,它为我提供了设备 ID,然后我连接了服务器沙箱和生产环境以使用它们的相关推送配置文件发送推送通知,但我仍然无法在我的设备上接收推送通知。
我还在我的设备上安装了 ipusher 并检查推送通知。它们来自该应用程序。
我注意到一件奇怪的事情是我更改了我的应用程序标识符并使用任何其他应用程序 ID,然后设备 token 保持不变
现在我的问题是我没有在我的设备上收到推送通知。
问题不在我的配置文件中。可能错误是我正在使用的 php 代码,因为当我在远程服务器上使用简单的 apns 时,它会发送推送通知。 收到通知的时间为 6 到 7 小时。我认为这是由于我设备端的网络问题。 但是现在在生产配置文件上运行 2 天后它工作正常。现在,通知在我的设备上无需花费时间即可传送,但在某些设备上需要 30 秒到 5 分钟。
如果您在设备上也没有收到来自其他应用程序的推送通知,则可能还有一个问题,那么您应该检查您的 DNS 连接。
最佳答案
首先确保您正在使用:
- 应用程序是使用调试/发布条款编译的
- 你的钥匙串(keychain)有开发/生产推送通知证书
然后使用下面的代码(已经过开发和生产测试)
<?php
// Comment these lines in production mode
ini_set('display_errors','on');
error_reporting(E_ALL);
// Apns config
// true - use apns in production mode
// false - use apns in dev mode
define("PRODUCTION_MODE",false);
$serverId = 1;
$serverName = 'my-server-domain.com';
if(PRODUCTION_MODE) {
$apnsHost = 'gateway.sandbox.push.apple.com';
} else {
$apnsHost = 'gateway.push.apple.com';
}
$apnsPort = 2195;
if(PRODUCTION_MODE) {
// Use a development push certificate
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-development.pem';
} else {
// Use a production push certificate
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-production.pem';
}
// --- Sending push notification ---
// Insert your device token here
$device_token = "<dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8>"; // Some Device Token
// Notification content
$payload = array();
//Basic message
$payload['aps'] = array(
'alert' => 'testing 1,2,3..',
'badge' => 1,
'sound' => 'default',
);
$payload['server'] = array(
'serverId' => $serverId,
'name' => $serverName
);
// Add some custom data to notification
$payload['data'] = array(
'foo' => "bar"
);
$payload = json_encode($payload);
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', "");
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
$deviceToken = str_replace(" ","",substr($device_token,1,-1));
echo $deviceToken;
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);
//socket_close($apns);
fclose($apns);
?>
关于php - iPhone 收不到推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8132664/