Local and Push Notifications in IOS 9 and 10 using swift3

匿名 (未验证) 提交于 2019-12-03 01:55:01

问题:

I developed local Notifications in iOS 10. It is working perfectly. But now how should i code local notifications and push notification if user is using iOS 9 and above versions. Can anyone help please?

Below is code in 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)         }       }   } 

回答1:

Local Notification

IOS 11 :- You can use following code for iOS 11. No any kind of changes requires in push and local notification

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)      let notification1 = UILocalNotification()     notification1.fireDate = NSDate(timeIntervalSinceNow: 15) as Date     notification1.alertBody = "Hey you! Yeah you! Swipe to unlock!"     notification1.alertAction = "be awesome!"     notification1.soundName = UILocalNotificationDefaultSoundName      UIApplication.shared.scheduleLocalNotification(notification1)  } 

Push Notification

import UserNotifications  if #available(iOS 10.0, *) {      //iOS 10 or above version     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()  } 

UIApplicationDelegate

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

UNUserNotificationCenterDelegate

Only available in ios 10 and above version

@available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {  }  @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {  } 


回答2:

I have made this class for Swift 3 which has a function for requesting permission to push notification and also a send notification. Works on for iOS 9 and 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)      } } 

Usage:

You can request permission anywhere:

LocalNotification.registerForLocalNotification(on: UIApplication.shared) 

And to dispatch a local notification:

LocalNotification.dispatchlocalNotification(with: "Notification Title for iOS10+", body: "This is the notification body, works on all versions", at: Date().addedBy(minutes: 2)) 

Tip:

You can set the notification to fire at any future Date, in this example I'm using a date extension to get a future date in minutes to the notification fire. This is it:

extension Date {     func addedBy(minutes:Int) -> Date {         return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!     } } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!