2017-03-09 66 views
11

iOS 10開發local Notifications。它工作完美。但是,現在應該如何,如果用戶使用的是iOS 9及以上版本的I CODE local notificationspush notification。任何人都可以幫忙嗎?本地和推送通知和10使用swift3

下面是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

你的問題是什麼?你有什麼嘗試? – shallowThought

+1

我需要修改我的代碼,以使它也可以在iOS9中運行。我在這裏使用的UserNotifications框架僅存在於iOS 10 –

+0

如何設置不同的日期組件或如何多次調用本地通知? – ArgaPK

回答

27

本地通知代碼

IOS 11: - 您可以使用下面的代碼爲iOS 11.沒有任何樣的變化,需要在推動和本地通知

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) 

} 

推送通知

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

在IOS 10及以上版本僅適用

@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

如何設置不同的日期組件或如何多次調用本地通知? – ArgaPK

9

我有此類斯威夫特3這對於請求允許推送通知,併發送一個通知的功能。 適用於iOS 9和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) 

    } 
} 

用法:

您可以申請許可的任何地方:

LocalNotification.registerForLocalNotification(on: UIApplication.shared) 

並派遣一個本地通知:

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

提示:

您可以設置通知開火任何未來的日期,在這個例子中,我使用的日期延長獲得在幾分鐘內通知消防將來的日期。這是它:

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