que notificaciones mail direct apple apns apple-push-notifications swift3 ios10 xcode8 xcode8-beta3

apple-push-notifications - notificaciones - push mail iphone



UNUserNotificationCenter didRecieve Response no se llama si la aplicaciĆ³n se termina (3)

La función UNUserNotificationCenter no se invoca al hacer clic en el botón Acción Chatear en notificación después de tocar en 3D si la aplicación no está activa (ni siquiera en el fondo o si ha finalizado). Utilicé "adjuntar al proceso por nombre" en Xcode para depurar la aplicación cuando finalizó la aplicación. Aquí está el Código:

import UIKit import Mixpanel import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //setup mixpanel self.handlePushNotificationWithUserInfo(launchOptions: launchOptions) //ask for push notification perms return true }

Cuando Pop-up de notificación (enviado desde MixPanel) esta función se llama primero,

Llamada 1:

func handlePushNotificationWithUserInfo(launchOptions: [NSObject: AnyObject]?) { //Handle PushNotification when app is opened }

Entonces va aquí,

Llamada 2:

//register for notification func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) { if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in // Enable or disable features based on authorization. } center.delegate = self let actionChat = UNNotificationAction(identifier: Constants.ActionType.CHAT.rawValue, title: "Chat", options: [.foreground]) let categoryOptions = UNNotificationCategoryOptions(rawValue: 0) let customerSupportCategory = UNNotificationCategory(identifier: Constants.NotificationType.CUSTOMER_SUPPORT.rawValue, actions: [actionChat], intentIdentifiers: [], options: categoryOptions) center.setNotificationCategories([customerSupportCategory]) } application.registerForRemoteNotifications() }

Llamar 3:

// remote notification func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { ....Some Code.... }

Pero debajo de la función no se llama . Pero si la aplicación se está ejecutando en segundo plano, entonces se llama a la función siguiente y todo funciona bien. DE OTRA MANERA, la aplicación entra en primer plano y el chat no, después de eso .

// action buttons in enhanced Notification @available(iOS 10, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) { guard let action = Constants.ActionType(rawValue: response.actionIdentifier) else { completionHandler() return } switch action { case .CHAT: _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL) default: _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL) } completionHandler() } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .sound]) } }

Esta función nunca se llama puede ser porque se depreció en iOS 10 sobre userNotificationCenter (), no estoy seguro. Por favor, explica esto también ...

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { ....Some Code.... }

Estoy usando iPhone 6s iOS 10 como dispositivo de depuración. XCode 8 beta-3


Desde mi propia experimentación, recibir notificaciones locales en Swift 3 y Xcode 8 son las siguientes:

Conformidad

  • Conforme a UNUserNotificationCenterDelegate

    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { .... }

  • Registrarse como delegado del centro de notificaciones:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let center = UNUserNotificationCenter.current() center.delegate = self return true }

Delegar métodos

  • Responder a las notificaciones perdidas (por ejemplo, la aplicación de visualización del usuario cuando se envía una notificación)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { print(notification.request.content.userInfo) }

  • Responder a las notificaciones activadas (por ejemplo, notificación abierta por el usuario)

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) { print(response.notification.request.content.userInfo) }


Cuando el usuario no ejecuta la aplicación o la mata y se recibe una notificación, en ese caso, debe manejarla en didFinishLaunchingWithOptions y comprobar si la aplicación se abre mediante notificación y actuar de forma adecuada.

// Comprobar si se inició desde la notificación

if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] { notificationReceived(notification) }


Actualización de Swift 3.1

  • Conforme a UNUserNotificationCenterDelegate

  • Registrarse como delegado del centro de notificaciones:

UNUserNotificationCenter.current().delegate = self

  • Delegar métodos

public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print(response.notification.request.content.categoryIdentifier) } public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print(notification.request.content.categoryIdentifier) }