TigerZF
🌐Español

50.2. Zend_Mobile_Push_Apns

Zend_Mobile_Push_Apns proporciona la capacidad de enviar notificaciones push a APNS generalmente en conjunto con Zend_Mobile_Push_Message_Apns; sin embargo, hay un caso en el que no se utilizaría, y es al obtener retroalimentación (feedback) del servidor APNS.

50.2.1. Enviando mensajes

[Note] Nota

Antes de enviar mensajes, debe seguir los pasos de aprovisionamiento y despliegue descritos por Apple.

Al implementar APNS, dispone de algunos componentes que utilizará. Zend_Mobile_Push_Apns que contiene los componentes del servidor y Zend_Mobile_Push_Message_Apns que contiene el mensaje que desea enviar. Generalmente, al enviar notificaciones push a Apple debería hacerlo por lotes.

La implementación real del código es bastante mínima; sin embargo, se deben tener en cuenta consideraciones sobre el manejo de errores.

$message = new Zend_Mobile_Push_Message_Apns();
$message->setAlert('Zend Mobile Push Example');
$message->setBadge(1);
$message->setSound('default');
$message->setId(time());
$message->setToken('ABCDEF0123456789');

$apns = new Zend_Mobile_Push_Apns();
$apns->setCertificate('/path/to/provisioning-certificate.pem');
// if you have a passphrase on your certificate:
// $apns->setCertificatePassphrase('foobar');

try {
    $apns->connect(Zend_Mobile_Push_Apns::SERVER_SANDBOX_URI);
} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) {
    // you can either attempt to reconnect here or try again later
    exit(1);
} catch (Zend_Mobile_Push_Exception $e) {
    echo 'APNS Connection Error:' . $e->getMessage();
    exit(1);
}

try {
    $apns->send($message);
} catch (Zend_Mobile_Push_Exception_InvalidToken $e) {
    // you would likely want to remove the token from being sent to again
    echo $e->getMessage();
} catch (Zend_Mobile_Push_Exception $e) {
    // all other exceptions only require action to be sent
    echo $e->getMessage();
}
$apns->close();

Tabla 50.3. Excepciones y técnicas de remediación

Excepción Significado Manejo
Zend_Mobile_Push_Exception Este tipo de excepciones son de naturaleza más genérica y se lanzan ya sea desde APNS o internamente durante la validación de entrada Lea el mensaje y determine los pasos de remediación.
Zend_Mobile_Push_Exception_InvalidPayload Generalmente, el payload no lanzará una excepción a menos que el tamaño del payload sea demasiado grande o le falte contenido requerido. Verifique que el tamaño del payload esté dentro de los requisitos de APNS
Zend_Mobile_Push_Exception_InvalidToken Cualquier forma de token inválido ocurrirá si el token ya no está registrado, falta un token o tiene un formato inválido. Debe eliminar el token y no intentar enviar a él nuevamente.
Zend_Mobile_Push_Exception_InvalidTopic Un topic inválido simplemente significa que el id del mensaje era demasiado largo o no era un entero. Asegúrese de que el ID del mensaje sea un entero.

[Warning] Advertencia

Al enviar por lotes y estar enviando una gran cantidad de notificaciones push, debe asegurarse de usar usleep de vez en cuando. Esto garantizará que sus mensajes se entreguen y que APNS no simplemente le cuelgue la conexión.

50.2.2. Obteniendo retroalimentación

APNS tiene un servicio de retroalimentación al que debe escuchar. Apple indica que monitorea a los proveedores para asegurarse de que estén escuchando este servicio.

El servicio de retroalimentación simplemente devuelve un array de tokens de dispositivo y la hora. Puede usar la hora para asegurarse de que el dispositivo no se haya vuelto a registrar para notificaciones push desde el último envío.

$apns = new Zend_Mobile_Push_Apns();
$apns->setCertificate('/path/to/provisioning-certificate.pem');

try {
    $apns->connect(Zend_Mobile_Push_Apns::SERVER_FEEDBACK_SANDBOX_URI);
} catch (Zend_Mobile_Push_Exception_ServerUnavailable $e) {
    // you can either attempt to reconnect here or try again later
    exit(1);
} catch (Zend_Mobile_Push_Exception $e) {
    echo 'APNS Connection Error:' . $e->getMessage();
    exit(1);
}

$tokens = $apns->feedback();
foreach ($tokens as $token => $time) {
    echo $time . "\t" . $token . PHP_EOL;
}
$apns->close();

50.2.3. Mensajes avanzados

APNS ofrece la capacidad de enviar mensajes más avanzados; por ejemplo, los ejemplos anteriores muestran la implementación más básica de un mensaje. Zend_Mobile_Push_Message_Apns le permite hacer mensajes mucho más avanzados como se describe a continuación.

50.2.3.1. Alertas

Las alertas pueden contener desde un simple mensaje de cuerpo hasta tener una clave de acción y una imagen de inicio (iOS 4). Es posible que solo desee proporcionar una clave de acción cuando solo se necesite una confirmación, O cuando busque localizar el botón con texto no estándar (es decir, no "View").

El siguiente ejemplo de código muestra alertas de los ejemplos de payload de APNS.

    $message = new Zend_Mobile_Push_Message_Apns();

    // message with different button
    $message->setAlert('Bob wants to play poker', 'PLAY');
    // message using apps localized strings w/ string replacements
    $message->setAlert(null, null, 'GAME_PLAY_REQUEST_FORMAT', array('Jenna', 'Frank'));
    

50.2.3.2. Datos personalizados

Puede enviar a su aplicación datos personalizados que le permiten tomar decisiones basadas en las notificaciones, como sincronizar datos.

                $message = new Zend_Mobile_Push_Message_Apns();
                $message->addCustomData('foo', 'bar');
                $message->addCustomData('foo', array('bar' => 1));
                $message->addCustomData('bar', 'foo');
[Warning] Advertencia

No puede usar una clave personalizada 'aps' ya que está reservada por Apple y se utiliza para los datos push principales.