Это не мое первое приложение, отправляющее push-уведомления, но это мое первое приложение, в котором я отправляю уведомление всем моим пользователям одновременно.
То, что я испытываю, заключается в том, что не все мои пользователи получают уведомление, только некоторые из них, даже если у них есть правильные настройки (т. Е. Уведомления для моего приложения включены), также код правильный, поскольку он отправляется некоторым из них, поэтому мой предположим, что код «пропускает» некоторые казни, так как связь с APNS асинхронна, так почему-то (вы говорите мне, если я ошибаюсь), что она помещает очередь отправки уведомлений.
Вот код:
function sendNotification(){ $sql = "SELECT * FROM users WHERE phone = 'iPhone' AND pushID != ''"; try { $db = getConnection(); $stmt = $db->prepare($sql); $stmt->execute(); $users = $stmt->fetchAll(PDO::FETCH_OBJ); $request = Slim::getInstance()->request(); $content = json_decode($request->getBody()); $message = $content->message; foreach($users as $user){ // Put your device token here (without spaces): $deviceToken = $user->pushID; // Put your private key's passphrase here: $passphrase = 'xxxxxxx'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'xxxxx.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.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)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); } $db = null; } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .'}}'; } }
Как вы можете видеть, я привожу всех своих пользователей с iPhone, и я отправляю им уведомление. Мой телефон является последним пользователем в этом списке, и я не получил его, другой пользователь, которого я знаю, является одним из первых, и она получила его. Он либо пропускает некоторые из пользователей в массиве, либо просто выполняет первую половину, при этом не отображается ошибка.
Im использует Slim для этого.
надеюсь, вы можете мне помочь, спасибо!