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)
}