Swift 3: desactivar insignia, alerta, sonido

He leído muchas respuestas aquí y no puedo encontrar respuestas a estas preguntas. ¿Cómo detener la insignia, la alerta y el sonido de las notifications cuando la aplicación no se está ejecutando? ¿Cómo detener la insignia, la alerta y el sonido de las notifications cuando la aplicación está en segundo plano?

en esta function:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 

He puesto completionHandler ([]) sin [.badge, .alert, .sound] y todavía recibo notifications en segundo plano cuando se ejecuta la aplicación.

También tengo function en mi código que envía notifications cuando alguien te está escribiendo y ves que él te está escribiendo cuando estás dentro de la aplicación, pero cuando la aplicación no está ejecutada, ¿estás recibiendo notifications con el sonido de alerta de insignia? ¿Cómo prevenir eso?

Código PHP:

 $body['aps'] = array( 'content-available' => 0, 'typingNewMessage' => 'true', 'senderId' => $your_id ); 

Dos cosas primero: ¿Estás usando websocket / socket.io para el chat en tu aplicación? Y en cuanto a las notifications, ¿ha configurado notifications remotas en modos de background?

Modos de background

Lee los documentos para las notifications push , parece que estás agregando pasos aquí o faltan algunos. Básicamente como lo mencionó Kathayatnk, su método debería darle lo que quiere. Entonces, si no ha activado las notifications remotas de background:

Para configurar su aplicación para procesar las notifications silenciosas en segundo plano

  1. En Project Navigator, select su proyecto.
  2. En el editor, selecciona tu objective de aplicación de iOS.
  3. Seleccione la pestaña Capacidades.
  4. Habilite la capacidad de modos de background.
  5. Habilite el modo de background de notifications remotas.

Si esto se hace, debe recibirlos en segundo plano.

Además, está utilizando el método incorrecto para recibir notifications de background en segundo plano. Como se indica en el mismo enlace anterior:

En iOS, el sistema ofrece notifications silenciosas llamando a la aplicación: didReceiveRemoteNotification: fetchCompletionHandler : método de su delegado de la aplicación. Use ese método para iniciar cualquier operación de descarga necesaria para get datos nuevos.

cómo lo uso habitualmente:

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { guard let aps = userInfo["aps"] as? [String:Any] else { //handle something here.. return } //handle the content here... } 

También puede realizar tareas en segundo plano desde estados inactivos aquí jugando con el valor devuelto de completionHandler . Le sugiero que lo lea también.

Para tu problema de chat …

Aclara cómo estás realizando esto …

Si está utilizando una architecture websocket / socket.io:

Recomendaría encarecidamente no usar notifications para notificar a un usuario sobre cualquier cosa con APNS cuando use un websocket. Los Websockets son muy eficientes y mucho más rápidos. Manejar ambas cosas puede complicar mucho las cosas. Manténgase en el enfoque de socket y use un lado del server de methods que compruebe si un usuario todavía está dentro de la aplicación. Algo así como un método de ping-pong como aquí . Haga que ese método cambie a la entrega de APNS cuando el método de ping del cliente de socket muestre que el usuario ha dejado la aplicación o la ha cerrado. Esto significa que, si el usuario todavía está en la aplicación, pero no en la conversación, permanezca con el enfoque de ping pero programe la respuesta de la interfaz de usuario de manera diferente (tome FB Messenger o las tabs de notifications de Snapchat, por ejemplo).

Si no usa websockets / socket.io:

… Cambie a tecnologías o packages de websockets (según el tipo de plataforma de su server) o socket.io o utilice los services de chat en time real de firebase .

Déjame saber tu configuration como le pregunté antes, pero si estás haciendo todo esto y aún recibes los problemas, publica tu código.

Personnaly, he usado RawWenderlicht para guías de APNS por más de un año, buenas cosas si me preguntas.

Para silent push notification silent la payload debe contener la key de content-available como:

 { "aps": { "content-available": 1 } } 

Además, debe habilitar Remote Notifications en Background Modes en la configuration de Capabilities de su proyecto Xcode .

introduzca la descripción de la imagen aquí

Ahora su app will wake up in the background cuando reciba una de estas push notifications .

didReceiveRemoteNotification se llamará en AppDelegate cada vez que se reciba la push notification .

 func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { let aps = userInfo["aps"] as! [String: AnyObject] if aps["content-available"] as? Int == 1 { //Your code } } 

Para más información sobre cómo manejar las notifications push en primer plano / background, consulte: https://www.raywenderlich.com/156966/push-notifications-tutorial-getting-started

puede agregar notifications push silenciosas (establecer key de contenido disponible apropiadamente) al enviar pushes, como a continuación.

 //when you want the badge and sound aps { content-available: 1 } //When you want silent notifications aps { content-available: 0 } 

Esto llamará al método de delegado apropiado, pero no mostrará cnetworkingenciales ni sonido.