La fonction UNUserNotificationCenter n’est pas appelée en cliquant sur Bouton d’action Discuter dans Notification après 3D Si l’application n’est pas active (même en arrière-plan ou si elle est terminée). J'ai utilisé "attacher au processus par nom" dans Xcode pour déboguer une application lorsque celle-ci était fermée. Voici le code:
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
}
Lorsque Notification Pop-up (Envoyé de MixPanel), cette fonction est appelée en premier,
Appel 1:
func handlePushNotificationWithUserInfo(launchOptions: [NSObject: AnyObject]?) {
//Handle PushNotification when app is opened
}
Alors ça va ici,
Appel 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()
}
Appel 3:
// remote notification
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
....Some Code....
}
Mais ci-dessous la fonction ne s'appelle pas . Mais si app est exécuté en arrière-plan , la fonction ci-dessous est appelée et tout fonctionne correctement. OTHERWISE App passe au premier plan et le chat ne le fait plus après .
// 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])
}
}
Cette fonction n’est jamais appelée peut-être parce qu’elle est dépréciée dans iOS 10 par rapport à userNotificationCenter (), pas sûre. S'il vous plaît expliquer cela aussi ..
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
....Some Code....
}
J'utilise l'iPhone 6s iOS 10 en tant que périphérique de débogage. XCode 8 beta-3
D'après mes propres expériences, les notifications locales dans Swift 3 et Xcode 8 sont les suivantes:
Conformité
Conforme à UNUserNotificationCenterDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { .... }
Inscrivez-vous en tant que délégué du centre de notification:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let center = UNUserNotificationCenter.current()
center.delegate = self
return true
}
Méthodes de délégué
Répondre aux notifications manquées (par exemple, l'application de visualisation de l'utilisateur lorsque la notification est envoyée)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
print(notification.request.content.userInfo)
}
Répondre aux notifications activées (par exemple, notification ouverte par l'utilisateur)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
print(response.notification.request.content.userInfo)
}
Swift 3.1 Mise à jour
Conforme à UNUserNotificationCenterDelegate
Inscrivez-vous en tant que délégué du centre de notification:
UNUserNotificationCenter.current().delegate = self
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)
}
Lorsque l'application n'est pas en cours d'exécution ou est tuée par l'utilisateur et que la notification est reçue, dans ce cas, vous devez gérer didFinishLaunchingWithOptions et vérifier si l'application est ouverte via la notification et agir de manière appropriée.
// Vérifier si lancé depuis la notification
if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
notificationReceived(notification)
}