notification - Envío de múltiples notificaciones push de iPhone+APNS+PHP+Tutorial
push notifications ios firebase (4)
Estoy trabajando en un sitio web php + aplicación de iPhone y API para aplicaciones de iPhone, tengo un sistema de mensajería para estudiantes y doctores, cuando alguien envía un mensaje (desde el sitio web o iphone) el otro usuario debe recibir notificación push en su iphone. Por ejemplo, si el alumno agrega una nueva pregunta para el docente, se enviará una notificación de inserción a los docentes de iphone / ipad a la maestra y cuando el docente responda a la respuesta del alumno, el alumno recibirá una notificación de inserción. Ya que no hay restricciones en el número de maestros y estudiantes que se registran en el sitio web. Así que mi pregunta es cómo enviar mensajes push a usuarios registrados de iphone, quiero enviar un mensaje push tan pronto como alguien responda o agregue una pregunta. Por favor, proporcione el código php para enviar múltiples mensajes push. Estoy guardando el token del dispositivo para cada usuario durante el registro.
Cuando la maestra responde a la pregunta que estoy enviando al alumno, también quiero enviar una notificación de inserción al alumno y viceversa, así que especifique un código que permita gestionar las condiciones de error.
Sugiera cualquier tutorial para enviar notificaciones automáticas en iOS.
Debería usar mejor la biblioteca APNS para PHP. Puedes encontrarlo here . Mire las muestras que los desarrolladores proporcionan.
También tuve problemas con los certificados. Mis acciones fueron:
- localizar archivo
ApnsPHP/Abstract.php
realice algunos cambios al método
_connect()
, pegue estas líneas$streamContext = stream_context_create( array( ''ssl'' => array( ''local_cert'' => $this->_sProviderCertificateFile, ''passphrase'' => '''' ) ) ); $this->_hSocket = @stream_socket_client( $sURL, $nError, $sError, $this->_nConnectTimeout, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
en lugar del original enumerado allí
ahora puede usar * .pem certificados sin necesidad de encomust_root_certification_authority.
Esto funcionó bien para mi.
Esta es la forma en que lo he hecho finalmente
- apns-php descargado
- Código PHP
set_time_limit(0);
$root_path = "add your root path here";
require_once($root_path."webroot/cron/library/config.php");
require_once($root_path."Vendor/ApnsPHP/Autoload.php");
global $obj_basic;
// Basic settings
$timezone = new DateTimeZone(''America/New_York'');
$date = new DateTime();
$date->setTimezone($timezone);
$time = $date->format(''H:i:s'');
//Get notifications data to send push notifications
$queueQuery = " SELECT `notifications`.*, `messages`.`mes_message`, `messages`.`user_id`, `messages`.`mes_originated_from` FROM `notifications`
INNER JOIN `messages`
ON `notifications`.`message_id` = `messages`.`mes_id`
WHERE `notifications`.`created` <= NOW()";
$queueData = $obj_basic->get_query_data($queueQuery);
if(!empty($queueData)) {
// Put your private key''s passphrase here:
$passphrase = ''Push'';
$ctx = stream_context_create();
stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''server_certificates_bundle_sandbox.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 ''<br>''.date("Y-m-d H:i:s").'' Connected to APNS'' . PHP_EOL;
foreach($queueData as $val) {
// Put your device token here (without spaces):
$deviceToken = $val[''device_token''];
// Create message
// Get senders name
$sql = "SELECT `name` FROM `users` WHERE id =".$val[''user_id''];
$name = $obj_basic->get_query_data($sql);
$name = $name[0][''name''];
$message = $name." : ";
// Get total unread messaged for receiver
$query = "SELECT COUNT(*) as count FROM `messages` WHERE mes_parent = 0 AND user_id = ".$val[''user_id'']." AND mes_readstatus_doc != 0 AND mes_status = 1";
$totalUnread = $obj_basic->get_query_data($query);
$totalUnread = $totalUnread[0][''count''];
$message .= " This is a test message.";
// Create the payload body
$body[''aps''] = array(
''alert'' => $message,
''badge'' => $totalUnread,
''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 ''<br>''.date("Y-m-d H:i:s").'' Message not delivered'' . PHP_EOL;
} else {
$sqlDelete = "DELETE FROM `notifications` WHERE id = ".$val[''id''];
$query_delete = $obj_basic->run_query($sqlDelete,''DELETE'');
echo ''<br>''.date("Y-m-d H:i:s").'' Message successfully delivered'' . PHP_EOL;
}
}
// Close the connection to the server
fclose($fp);
echo ''<br>''.date("Y-m-d H:i:s").'' Connection closed to APNS'' . PHP_EOL;
} else {
echo ''<br>''.date("Y-m-d H:i:s").'' Queue is empty!'';
}
Este es un buen tutorial sobre todo eso. Me ayudó a configurar mi servidor y la aplicación de demostración http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
Manera simple de hacerlo sin usar ningún archivo. Puedes llamarlo varias veces con diferentes tokeid.
$ctx = stream_context_create();
stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''ckipad.pem'');
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)
//exit("Failed to connect amarnew: $err $errstr" . PHP_EOL);
//echo ''Connected to APNS'' . PHP_EOL;
// Create the payload body
$body[''aps''] = array(
''badge'' => +1,
''alert'' => $message,
''sound'' => ''default''
);
$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 amar''.$message. PHP_EOL;
// Close the connection to the server
fclose($fp);