我已经在项目中实现了推送通知,到目前为止一切正常。我尝试过通过Pusher发送通知,但效果很好。但是我必须通过PHP发送它们,但尚无法使用。我发现了许多有关如何实现此目标的旧解释,但似乎没有一个对我有用。
这就是我要使用的方法:
// APNs Push testen auf Token $deviceToken = $_GET['key']; // Device-Token // Payload erstellen und JSON codieren $payload['aps'] = array('alert' => 'TitleText', 'badge' => 1, 'sound' => 'default'); $payload = json_encode($payload); $apnsHost = 'gateway.sandbox.push.apple.com'; $apnsPort = 2195; $apnsCert = 'certificate.pem'; // Stream erstellen $streamContext = stream_context_create(); stream_context_set_option($streamContext, 'ssl', 'certificate.cer', $apnsCert); $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); if ($apns) { // Nachricht erstellen und senden $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; fwrite($apns, $apnsMessage); // Verbindung schliessen fclose($apns); } else { echo "Fehler!"; var_dump($error); var_dump($errorString); }
尝试使用此php脚本,确保.pem证书在运行时以与该php脚本相同的路径退出,并获得正确的设备令牌
<?php /* We are using the sandbox version of the APNS for development. For production environments, change this to ssl://gateway.push.apple.com:2195 */ $apnsServer = 'ssl://gateway.sandbox.push.apple.com:2195'; /* Make sure this is set to the password that you set for your private key when you exported it to the .pem file using openssl on your OS X */ $privateKeyPassword = '1234'; /* Put your own message here if you want to */ $message = 'Welcome to iOS 7 Push Notifications'; /* Pur your device token here */ $deviceToken = '05924634A8EB6B84437A1E8CE02E6BE6683DEC83FB38680A7DFD6A04C6CC586E'; /* Replace this with the name of the file that you have placed by your PHP script file, containing your private key and certificate that you generated earlier */ $pushCertAndKeyPemFile = 'PushCertificateAndKey.pem'; $stream = stream_context_create(); stream_context_set_option($stream, 'ssl', 'passphrase', $privateKeyPassword); stream_context_set_option($stream, 'ssl', 'local_cert', $pushCertAndKeyPemFile); $connectionTimeout = 20; $connectionType = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT; $connection = stream_socket_client($apnsServer, $errorNumber, $errorString, $connectionTimeout, $connectionType, $stream); if (!$connection){ echo "Failed to connect to the APNS server. Error no = $errorNumber<br/>"; exit; } else { echo "Successfully connected to the APNS. Processing...</br>"; } $messageBody['aps'] = array('alert' => $message, 'sound' => 'default', 'badge' => 2, ); $payload = json_encode($messageBody); $notification = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; $wroteSuccessfully = fwrite($connection, $notification, strlen($notification)); if (!$wroteSuccessfully){ echo "Could not send the message<br/>"; } else { echo "Successfully sent the message<br/>"; } fclose($connection); ?>