Я пытаюсь реализовать push-уведомление в iOS на PHP с использованием библиотеки 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
Почему это происходит? Я что-то пропустил?
Существует две потенциальные причины:
foreground
В моем приложении. Я непосредственно получаю deviceToken
который находится в NSData
- (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 push notification php code
его ошибка связана с ios 9, если так прекратить использование кода в объекте C и использовать его быстро, поскольку он имеет ошибку при создании объектного токена – C для ios9. Я рекомендую срочно изменить ваш код. Также через эту мысль был сервер, когда запланированные изменения ios для быстрого были решены, и мой php был почти равным. Забота:
$ msg = chr (0). pack ('N', 32). pack (H * ','. '$deviceToken [0].'). pack ('N', strlen ($ payload)). $ payload;