5

Estoy obteniendo datos de comentarios de Apple APNS con éxito mediante PHP. La estructura que estoy recibiendo (después de algún procesamiento) se ve algo como esto:CÓMO eliminar tokens de dispositivo recibidos por Apple APNS retroalimentación

marca de tiempo

dispositivo de testigo de

Mi pregunta es cómo saber cuál de los tokens de dispositivo debería eliminar de mi base de datos y detener enviándoles notificaciones.

Regardz,

Mlado

Respuesta

10

Todos los dispositivos están dadas por retroalimentación 'falló y deben eliminarse. Sin comentarios significa que no se deben eliminar los dispositivos. Está cubierto por encima de la documentación de Apple:

Apple APN Documentation

+1

La retroalimentación APNS devuelve tokens de dispositivo si la entrega de la notificación ha fallado. Esto no significa que la aplicación se haya desinstalado del dispositivo, simplemente puede ser que el usuario no tenga una conexión wifi persistente en este momento. – Mladen

+1

Eso no es lo que dice la documentación. "Si un proveedor intenta entregar una notificación push a una aplicación, pero la aplicación ya no existe en el dispositivo, el dispositivo informa de ello al Servicio de notificaciones push de Apple. Esta situación suele ocurrir cuando el usuario ha desinstalado la aplicación. un dispositivo informa intentos fallidos de entrega para una aplicación, APNs necesita informar al proveedor para que se abstenga de enviar notificaciones a ese dispositivo ". – Lee

+5

@Mladen. Incorrecto. Si el dispositivo no tiene wifi o conexión 3/4G, Apple enviará la notificación de inserción más tarde cuando tenga conexión. – midspace

-1

debería almacenar dispositivos con su dispositivo de testigo de datos, y entonces usted puede encontrar estos dispositivos en función de sus tokens de dispositivo. Puede usar un token de dispositivo para el identificador de cada dispositivo. Que sería fácil de encontrar y cambiar sus estados en su db.

11

La marca de tiempo es el elemento crucial aquí. La marca de tiempo enviada por Apple indica la última vez que el servicio de inserción intentó entregar un mensaje al dispositivo y encontró que la aplicación debía desinstalarse. Si el dispositivo se ha vuelto a registrar con su servicio, entonces no hay necesidad de eliminarlo.

Por lo tanto, cada vez que su aplicación carga y envía el token a su servicio, debe registrar la hora en su almacén de datos. Cuando realices comentarios, deberías consultar la hora de Apple y compararla con la última vez que recibiste una actualización de la aplicación en el dispositivo. Si el momento en que Apple envía es más reciente que la vez que recibió una actualización, entonces debe eliminar (o deshabilitar) el dispositivo. Si el tiempo de Apple es anterior, entonces no necesita eliminarlo porque el usuario ha reinstalado el dispositivo desde la última vez que Apple intentó entregarlo.

0

clara explicación @argon, sin embargo, tengo otra pregunta sobre la marca de tiempo.

Cada vez que una aplicación habilita la notificación de inserción, el token del dispositivo se envía al servidor. ¿Debo tomar la marca de tiempo de mi servidor como para persistir junto con el token del dispositivo como didRegisterForRemoteNotificationsWithDeviceToken solo da deviceToken y no el tiempo. Si mi servidor se ejecuta en diferentes zonas horarias y APNS se ejecuta en diferentes zonas horarias, el tiempo de registro almacenado (junto con el token del dispositivo) no se puede comparar con la marca de tiempo recibida de los comentarios APNS para verificar la secuencia de registro -> desinstalar -> volver a registrar.

Supongo que la marca de tiempo de comentarios APNS está en UTC y la marca de tiempo que almacena el servidor junto con el token del dispositivo tiene que convertirse a UTC antes de almacenar la marca de tiempo ISO. De esta manera, la marca de tiempo estará en la misma zona horaria y la verificación de diferencias será consistente.

favor aclarar

+0

Correcto, es una indicación de fecha y hora UTC, por lo que debe almacenar los valores UTC en su tienda. Referencia: [Última tabla en "Servicio de comentarios"] (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/ TP40008194-CH101-SW3) – argon

0

@fyasar,

Por lo que su recomendación es almacenar el token dispositivo contra el ID de dispositivo (o alguna clave). Cuando se recibe un comentario para un token de dispositivo, elimine esa fila de token de dispositivo de DB, ¿verdad? Si hubiera entendido bien, eso no funcionaría en el escenario si una aplicación de instalación de usuario la desinstalara y luego la instalara de nuevo con una duración corta y el servicio de comentarios solo se consultara después de que todo esto sucedió.En este caso, si no se tiene en cuenta la marca de tiempo en los comentarios, se eliminará el token del dispositivo, que es incorrecto ya que el usuario volvió a instalar la aplicación y se volvió a registrar para la notificación automática.

Mi pregunta es esta, como se sugiere en Apple Doc y en muchos blogs, en el registro, cuando el token del dispositivo es persistente, la marca de tiempo tiene que persistir junto con ella. Qué hora ISO de la zona horaria debe persistir o cuál es la zona horaria en la que el servicio de comentarios devuelve la marca de tiempo.

0

Una marca de tiempo (como un valor time_t de cuatro bytes) que indica cuando APNs determinaron que la aplicación ya no existe en el dispositivo. Este valor, que está en orden de red, representa los segundos desde las 12:00 de la medianoche el 1 de enero de 1970 UTC.

se puede comparar con el último tiempo de inserción de la mesa y luego retire el token no válido de db, en mi caso estoy usando MySQL y PHP para el lado del servidor

$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1"; 

le proporcione al día por último momento de db y luego me acaba de convertirlo en marca de tiempo mediante el uso de época

$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')"; 

y finalmente acabo de comparo con APNs marca de tiempo de realimentación como esto

if($inactive_Timestamp>$dbTime_stamp) 
    { 
foreach ($apnsfeedback_tokens as $key => $value) { 
    # code... 

    $inactive_Token=$value['devtoken']; 

$sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'"; 


if ($conn->query($sql) === TRUE) { 
    echo "Record deleted successfully"; 
} else { 
    echo "Error deleting record: " . $conn->error; 
} 
Cuestiones relacionadas