iOS推送通知不能使用PHP

我试图在iOS中使用APNS库实现推送通知。 这是我的代码:

<?php // Put your device token here (without spaces): $deviceToken = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // Put your private key's passphrase here: $passphrase = 'XXXXXX'; // Put your alert message here: $message = 'My first push notification!'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'Certificates.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));print_r($result); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); ?> 

它显示消息发送成功,但在iOS中不显示通知。

 2015-07-28 08:32:39 Connected to APNS result = 97 2015-07-28 08:32:39 Message successfully delivered 2015-07-28 08:32:39 Connection closed to APNS 

为什么发生这种情况? 我错过了什么?

有两个可能的原因是造成这种情况:

  1. 你的应用程序在foreground
  2. 您的设备令牌无效

在我的应用程序。 我直接获取NSData deviceToken

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *deviceTokenString = [NSString stringWithFormat:@"%@", deviceToken]; // this is producing something like: // <xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb> // // and i am directly saving that to my servers database 

这是我在我的服务器。

 $from_database = "<xxxxxxx 9b0f527f xxxxxxxx 2727ed28 xxxxxxxx 4e693a61 xxxxxxx ac2f7dbb>"; // this removes the '<' and '>' to make the device token valid // $token_string = substr($from_database, 1, -1); $token_array[] = $token_string; // you can also add multiple 'token_string' to the 'token_array' for push notification broadcasting, i am currently doing that and it is working properly. ... public function __push_notification($message_input, $token_array) { $message = stripslashes($message_input); $passphrase = 'xxxxxx'; $cert = realpath('xxx.pem'); $payload = '{ "aps" : { "alert" : "'.$message.'", "badge" : 1, "sound" : "bingbong.aiff" } }'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $cert); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) { // echo "Failed to connect $err $errstr <br>"; return; } else // echo "Post notification sent<br>"; $dev_array = array(); $dev_array = $token_array; foreach ($dev_array as $device_token) { $msg = chr(0) . pack("n", 32) . pack('H*', str_replace(' ', '', $device_token)) . pack("n", strlen($payload)) . $payload; // echo "sending message :" . $payload . "n"; fwrite($fp, $msg); } fclose($fp); } 

也检查这一点,可能会有所帮助: 面对ios推送通知php代码中的问题

他的错误是与ios 9,如果这样停止使用目标C中的代码,并在迅速使用,因为它有一个生成客观的令牌 – C为ios9的错误。 我build议您紧急更改您的代码。 另外通过这个想法是服务器当计划的IOS更改为迅速的一切都解决了,我的PHP几乎是平等的。 关心:

  $ msg = chr (0). pack ('N', 32). pack (H * ','. '$deviceToken [0].'). pack ('N', strlen ($ payload)). $ payload;