2017-03-09 5 views
11

Ich entwickelte local Notifications in iOS 10. Es funktioniert perfekt. Aber jetzt, wie sollte ich local notifications und push notification codieren, wenn Benutzer iOS 9 und höhere Versionen verwendet. Kann mir bitte jemand helfen?Lokale und Push-Benachrichtigungen in IOS 9 und 10 mit swift3

Im Folgenden finden Sie 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) 
     } 

    } 

} 
+0

Was ist Ihr Problem? Was hast du probiert? – shallowThought

+1

Ich muss meinen Code so ändern, dass er auch in iOS9 funktioniert. UserNotifications Framework, das ich hier verwendet habe, ist nur in iOS 10 –

+0

, wie verschiedene Datumskomponenten oder wie lokale Notfälle mehrmals aufrufen? – ArgaPK

Antwort

27

Lokale Mitteilung

IOS 11: - Sie können für iOS 11. folgenden Code verwenden, keine jede Art von Veränderungen in Push erfordert und lokale Meldung

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

Nur in ios verfügbar 10 und höher 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) { 

} 
+0

Wie kann man verschiedene Datumskomponenten einstellen oder lokale Notationen mehrmals aufrufen? – ArgaPK

9

Ich habe diese Klasse für Swift 3 gemacht, die eine Funktion zum Anfordern der Erlaubnis zum Push-Benachrichtigung und auch eine Sendebenachrichtigung hat. Funktioniert für iOS 9 und 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) 

    } 
} 

Verbrauch:

Sie Erlaubnis überall anfordern können:

LocalNotification.registerForLocalNotification(on: UIApplication.shared) 

und eine lokale Meldung Versandfertig:

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

Tipp:

Sie können festlegen, dass die Benachrichtigung zu jedem zukünftigen Datum ausgelöst wird. In diesem Beispiel verwende ich eine Datumserweiterung, um ein zukünftiges Datum in Minuten für das Benachrichtigungsfeuer zu erhalten. Das ist es:

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