2017-03-09 24 views
11

Tôi đã phát triển local Notifications trong iOS 10. Nó hoạt động hoàn hảo. Nhưng bây giờ tôi nên viết mã số local notificationspush notification nếu người dùng đang sử dụng các phiên bản iOS 9 trở lên. Ai có thể giúp tôi không?Thông báo địa phương và thông báo đẩy trong iOS 9 và 10 bằng swift3

Dưới đây là mã trong 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

Sự cố của bạn là gì? Bạn đã thử cái gì? – shallowThought

+1

Tôi cần phải sửa đổi mã của mình sao cho nó cũng hoạt động trong iOS9. Khung UserNotifications mà tôi đã sử dụng ở đây chỉ xuất hiện trong iOS 10 –

+0

cách đặt các thành phần ngày khác nhau hoặc cách gọi các thông báo địa phương nhiều lần? – ArgaPK

Trả lời

27

Thông báo địa phương

IOS 11: - Bạn có thể sử dụng đoạn mã sau dành cho iOS 11. Không bất kỳ loại thay đổi đòi hỏi trong push và thông báo địa phương

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

Chỉ có sẵn trong ios 10 trở lên phiên bản

@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

cách đặt các thành phần ngày khác nhau hoặc cách gọi các thông báo địa phương nhiều lần? – ArgaPK

9

Tôi đã thực hiện lớp này cho Swift 3 có chức năng yêu cầu quyền để đẩy thông báo và cũng có thể gửi thông báo. Hoạt động trên iOS 9 và 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) 

    } 
} 

Cách sử dụng:

Bạn có thể yêu cầu sự cho phép bất cứ đâu:

LocalNotification.registerForLocalNotification(on: UIApplication.shared) 

Và để gửi một thông báo địa phương:

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

Mẹo:

Bạn có thể đặt thông báo kích hoạt vào bất kỳ Ngày nào trong tương lai, trong ví dụ này tôi đang sử dụng tiện ích mở rộng ngày để có được một ngày trong tương lai trong vài phút tới cảnh báo cháy. Đây là:

extension Date { 
    func addedBy(minutes:Int) -> Date { 
     return Calendar.current.date(byAdding: .minute, value: minutes, to: self)! 
    } 
} 
Các vấn đề liên quan