J'ai développé local Notifications
dans iOS 10
. Cela fonctionne parfaitement. Mais maintenant, comment devrais-je coder local notifications
et Push notification
si l'utilisateur utilise iOS 9
et versions précédentes. Quelqu'un peut-il aider s'il vous plaît?
Ci-dessous le code en iOS 10
import UIKit
import UserNotifications
@available(iOS 10.0, *)
class ViewController: UIViewController,UNUserNotificationCenterDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 10.0, *) {
//Seeking permission of the user to display app notifications
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in })
UNUserNotificationCenter.current().delegate = self
}
}
//To display notifications when app is running inforeground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound, .badge])
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func buttonPressed(_ sender: UIButton) {
if #available(iOS 10.0, *) {
//Setting content of the notification
let content = UNMutableNotificationContent()
content.title = "hello"
content.body = "notification pooped out"
content.badge = 1
//Setting time for notification trigger
let date = Date(timeIntervalSinceNow: 10)
var dateCompenents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateCompenents, repeats: false)
//Adding Request
let request = UNNotificationRequest(identifier: "timerdone", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
}
}
IOS 12: - Notification de groupe
set threadIdentifier
UNMutableNotificationContent
pour créer une notification de groupe
créer un groupe de notification local
let content = UNMutableNotificationContent()
content.title = "Group Notifications"
content.body = "Body of notification"
content.threadIdentifier = "group-identifire"
créer un groupe de notifications à distance doit réussir thread-id
en charge utile
{
"aps" : {
"alert" : {
"title" : "Group Notifications",
"body" : "Body of notification"
}
"thread-id" : "group-identifire"
}
}
IOS 11: - Vous pouvez également utiliser le code suivant pour iOS 11. Aucun type de modification ne nécessite des notifications Push et locales.
Création d'une demande de notification
import UserNotifications
if #available(iOS 10.0, *) {
//iOS 10.0 and greater
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert], completionHandler: { granted, error in
DispatchQueue.main.async {
if granted {
UIApplication.shared.registerForRemoteNotifications()
}
else {
//Do stuff if unsuccessful...
}
}
})
}
else {
//iOS 9
let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
let setting = UIUserNotificationSettings(types: type, categories: nil)
UIApplication.shared.registerUserNotificationSettings(setting)
UIApplication.shared.registerForRemoteNotifications()
}
Notification locale de planification
if #available(iOS 10.0, *) {
//iOS 10 or above version
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = "Late wake up call"
content.body = "The early bird catches the worm, but the second mouse gets the cheese."
content.categoryIdentifier = "alarm"
content.userInfo = ["customData": "fizzbuzz"]
content.sound = UNNotificationSound.default()
var dateComponents = DateComponents()
dateComponents.hour = 15
dateComponents.minute = 49
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
center.add(request)
} else {
// ios 9
let notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 5) as Date
notification.alertBody = "Hey you! Yeah you! Swipe to unlock!"
notification.alertAction = "be awesome!"
notification.soundName = UILocalNotificationDefaultSoundName
UIApplication.shared.scheduleLocalNotification(notification)
}
IApplicationDelegate
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
print(token)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
}
NUserNotificationCenterDelegate
Uniquement disponible dans les versions iOS 10 et supérieures
La méthode ne sera appelée sur le délégué que si l'application est au premier plan
Vous pouvez présenter la bannière par défaut avec l'aide de la méthode suivante
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.badge,.alert,.sound])
}
La méthode sera appelée sur le délégué lorsque l'utilisateur aura répondu à la notification en ouvrant l'application, en rejetant la notification ou en choisissant une UNNotificationAction.
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
}
J'ai fait cette classe pour Swift qui a une fonction pour demander l'autorisation de notification Push et aussi une notification d'envoi. Fonctionne sur iOS 9 et iOS 10 +.
import UIKit
import UserNotifications
class LocalNotification: NSObject, UNUserNotificationCenterDelegate {
class func registerForLocalNotification(on application:UIApplication) {
if (UIApplication.instancesRespond(to: #selector(UIApplication.registerUserNotificationSettings(_:)))) {
let notificationCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
notificationCategory.identifier = "NOTIFICATION_CATEGORY"
//registerting for the notification.
application.registerUserNotificationSettings(UIUserNotificationSettings(types:[.sound, .alert, .badge], categories: nil))
}
}
class func dispatchlocalNotification(with title: String, body: String, userInfo: [AnyHashable: Any]? = nil, at date:Date) {
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.categoryIdentifier = "Fechou"
if let info = userInfo {
content.userInfo = info
}
content.sound = UNNotificationSound.default()
let comp = Calendar.current.dateComponents([.hour, .minute], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: comp, repeats: true)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
center.add(request)
} else {
let notification = UILocalNotification()
notification.fireDate = date
notification.alertTitle = title
notification.alertBody = body
if let info = userInfo {
notification.userInfo = info
}
notification.soundName = UILocalNotificationDefaultSoundName
UIApplication.shared.scheduleLocalNotification(notification)
}
print("WILL DISPATCH LOCAL NOTIFICATION AT ", date)
}
}
tilisation:
Vous pouvez demander la permission n'importe où:
LocalNotification.registerForLocalNotification(on: UIApplication.shared)
Et pour envoyer une notification locale:
LocalNotification.dispatchlocalNotification(with: "Notification Title for iOS10+", body: "This is the notification body, works on all versions", at: Date().addedBy(minutes: 2))
Astuce:
Vous pouvez configurer la notification pour qu'elle déclenche à n'importe quelle date future. Dans cet exemple, j'utilise une extension de date pour obtenir une date future en quelques minutes pour le déclenchement de la notification. Ça y est:
extension Date {
func addedBy(minutes:Int) -> Date {
return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!
}
}