2017-03-09 2 views
11

J'ai développé local Notifications en iOS 10. Cela fonctionne parfaitement. Mais maintenant, comment dois-je le code local notifications et push notification si l'utilisateur utilise iOS 9 et versions ci-dessus. Quelqu'un peut-il aider s'il vous plaît?Notifications locales et push dans IOS 9 et 10 en utilisant swift3

Code ci-dessous est 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) 
     } 

    } 

} 
+0

Quel est votre problème? Qu'avez-vous essayé? – shallowThought

+1

J'ai besoin de modifier mon code de telle sorte qu'il fonctionne également dans iOS9. Le framework UserNotifications que j'ai utilisé ici est uniquement présent dans iOS 10 –

+0

comment définir des composants de date différents ou comment appeler des notfications locales plusieurs fois? – ArgaPK

Répondre

27

notification locale

IOS 11: - Vous pouvez utiliser le code suivant pour iOS 11. Pas tout type de changements, il faut en push et la notification locale

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

Uniquement disponible en ios 10 et version ci-dessus

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

} 
+0

comment définir différents composants de date ou comment appeler des notfications locales plusieurs fois? – ArgaPK

9

J'ai fait cette classe pour Swift 3 qui a une fonction pour demander l'autorisation de pousser la notification 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) 

    } 
} 

Utilisation:

Vous pouvez demander la permission partout:

LocalNotification.registerForLocalNotification(on: UIApplication.shared) 

et à 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 définir la notification pour une date future, dans cet exemple j'utilise une extension de date pour obtenir une date future en minutes pour le déclenchement de la notification. C'est ça:

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