iOS10推送通知(本地&遠程)/Swift

iOS10本地通知

一.發送一個簡單的本地通知php

1.註冊通知git

  • 須要導入頭文件或者框架UserNotifications
  • 在iOS8.0以後,若是想要用戶接收通知須要主動請求受權,爲了能讓該代碼必定被執行,通常寫在Appdelegate中
 
  1. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  2.  
  3. // 1.獲取通知中心
  4. let center = UNUserNotificationCenter.current()
  5.  
  6. // 2.註冊通知(會彈框請求用戶受權)
  7.  
  8. // 若是有錯誤則直接返回
  9. if error != nil {
  10. return
  11. }
  12.  
  13. // 受權成功則爲true
  14. if granted {
  15. print("用戶贊成通知")
  16. } else {
  17. print("用戶拒絕通知")
  18. }
  19.  
  20. }

2.發送通知(點擊控制器View的時候發送通知)api

 
  1. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  2.  
  3. // 建立通知標識(用於標識哪個通知)
  4. let identifier = "SimpleNotificationIdentifier"
  5.  
  6. // 建立通知中的內容
  7. let content = UNMutableNotificationContent()
  8. // 設置內容
  9. content.body = "我是內容"
  10.  
  11. // 設置通知發送的時間
  12. // 注意:重複時間必須大於60秒
  13. let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
  14.  
  15. // 建立請求對象
  16. let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
  17. // 獲取通知中心
  18. let center = UNUserNotificationCenter.current()
  19.  
  20. // 添加本地通知
  21. center.add(request, withCompletionHandler: {(error: Error?) in
  22.  
  23. if error == nil {
  24. print("本地通知添加成功")
  25. }
  26. })
  27. }

3.展現效果服務器

  • 前臺沒有彈框
  • 後臺/退出應用/通知中心/鎖屏都可以接收到彈框
    通知01

二.發送一個帶附件的通知閉包

  • 在iOS10以後發送通知的時候能夠附帶一些內容
    • 內容包含圖片、GIF圖片、視頻以及音頻(格式最好是caf,不然沒有效果)
 
  1. /* 設置其餘內容 */
  2. // 應用文字
  3. content.badge = 10
  4.  
  5. // 設置通知的聲音
  6. content.sound = UNNotificationSound(named: "win.aac")
  7.  
  8. // 設置標題
  9. content.title = "我是標題"
  10.  
  11. // 設置子標題
  12. content.subtitle = "我是子標題"
  13.  
  14. // 設置附件內容
  15. // 附件標識
  16. let attachmentIdentifier = "ImageAttachmentIdentifier"
  17. // 附件URL
  18. if let url = Bundle.main.url(forResource: "70s Electric Piano 52.caf", withExtension: nil) {
  19. do {
  20. let attachment = try UNNotificationAttachment(identifier: attachmentIdentifier, url: url, options: nil)
  21. content.attachments = [attachment]
  22. print("---")
  23. } catch {
  24. print(error)
  25. }
  26. }
  • 展現的效果

圖片app

通知02

Gif框架

通知03

音頻ide

通知04

視頻
通知05ui

三.對通知的操做url

  • 當一個通知添加成功以後,能夠對添加成功的通知作一些操做,分別爲:
    • 查看即將發送的通知
    • 取消即將發送的通知
    • 查看已經發送的通知
    • 取消已經發送的通知
 
  1. /// 查看即將發送的通知
  2. @IBAction func showUnsendNotification() {
  3. UNUserNotificationCenter.current().getPendingNotificationRequests { (request: [UNNotificationRequest]) in
  4. print("即將發送的通知:\(request)")
  5. }
  6. }
  7.  
  8. /// 刪除即將發送的通知
  9. @IBAction func removeUnsendNotification() {
  10.  
  11. // 經過標識刪除某一個通知
  12. // UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: <#T##[String]#>)
  13.  
  14. // 刪除全部
  15. UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
  16. }
  17.  
  18. /// 查看發送成功的通知
  19. @IBAction func showSendedNotification() {
  20. UNUserNotificationCenter.current().getDeliveredNotifications { (notification: [UNNotification]) in
  21. print("查看發送成功的通知:\(notification)")
  22. }
  23. }
  24.  
  25. /// 刪除發送成功的通知
  26. @IBAction func removeSendedNotification() {
  27.  
  28. // 經過標識刪除某一個發送成功的通知
  29. // UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: <#T##[String]#>)
  30.  
  31. // 刪除全部發送成功的通知
  32. UNUserNotificationCenter.current().removeAllDeliveredNotifications()
  33.  
  34. }

四.監聽通知的點擊

  • 當用戶點擊通知進入App後,監聽用戶通知行爲
  • 須要設置通知的代理,當用戶點擊了通知後,會經過代理告訴咱們

設置代理

 
  1. UNUserNotificationCenter.current().delegate = self

遵照協議並實現代理方法

 
  1. extension ViewController: UNUserNotificationCenterDelegate {
  2.  
  3. /// 當接收到通知的時候會來到該方法
  4. ///
  5. /// - Parameters:
  6. /// - center: 通知中心
  7. /// - response: 響應
  8. /// - completionHandler: 成功回調
  9. func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  10. print("接收到通知\(response)")
  11. completionHandler()
  12. }
  13.  
  14.  
  15. /// 當一個通知發送成功後會來到該方法
  16. ///
  17. /// - Parameters:
  18. /// - center: 通知中心
  19. /// - notification: 發送的通知
  20. /// - completionHandler: 回調閉包,能夠設置在前臺收到通知橫幅
  21. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
  22. print("發送通知成功\(notification)")
  23.  
  24. // 在前臺也能接收到通知
  25. completionHandler([.alert,.badge,.sound])
  26.  
  27. }
  28. }

五.通知的觸發條件

  • iOS10與以前的通知的觸發條件一共有三種
    • 多少時間以後發送通知
    • 指定日期發送通知
    • 觸發區域發送通知
  • 在iOS10以後,觸發條件的類爲UNNotificationTrigger
  • 而具體設置須要使用到它的子類
    • UNTimeIntervalNotificationTrigger : 多少時間以後
    • UNCalendarNotificationTrigger : 指定日期
    • UNLocationNotificationTrigger : 指定區域

1.多少時間以後發送通知

注意: 若是須要重複,那麼時間必須大於60秒

 
  1. let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)

2.指定日期發送通知

能夠經過添加年月日時,來固定一個時間發送通知

 
  1. // 建立時間組件
  2. var components = DateComponents()
  3. // 設置爲日曆時間
  4. components.calendar = Calendar(identifier: .gregorian)
  5. // 天天的早上10點10分發送通知
  6. components.hour = 10
  7. components.minute = 10
  8. print(components.date)
  9. let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)

3.指定區域發送通知

注意:在使用模擬器調試的過程當中,可能會沒法顯示,重置模擬器,或者換個模擬器則會解決該問題

 
  1. // 1.請求受權(iOS8.0以後獲取用戶的位置要主動請求受權,注意在info.plist中配置對應的key)
  2. lazy var locationM: CLLocationManager = {
  3. let locationM = CLLocationManager()
  4. locationM.requestAlwaysAuthorization()
  5. return locationM
  6. }()
  7.  
  8. // 2.建立區域觸發器
  9. let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 12.123, longitude: 123.456), radius: 1000, identifier: "RegionNotification")
  10. locationM.startMonitoring(for: region)
  11. let trigger = UNLocationNotificationTrigger(region: region, repeats: true)

六.額外操做項

1.設置通知的額外信息

 
  1. // 1.設置額外信息
  2. content.userInfo = ["name": "張三", "age": 18]
  3.  
  4. // 2.在接收到通知後,能夠獲取到額外信息
  5.  
  6. /// 當接收到通知的時候會來到該方法
  7. ///
  8. /// - Parameters:
  9. /// - center: 通知中心
  10. /// - response: 響應
  11. /// - completionHandler: 成功回調
  12. func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  13. print("接收到通知獲取額外信息\(response.notification.request.content.userInfo)")
  14. completionHandler()
  15. }
  16. // 打印爲:接收到通知獲取額外信息[AnyHashable("name"): 張三, AnyHashable("age"): 18]

2.設置額外操做項

  • 步驟
    • 註冊操做集合
    • 註冊操做組,添加到操做集合中
    • 註冊操做行爲,添加到操做組中
    • 設置通知所用到的操做組
 
  1. // 1.註冊操做項
  2. // 1.建立操做項
  3. let action1: UNNotificationAction = UNNotificationAction(identifier: "huifu", title: "回覆", options: .foreground)
  4. let action2: UNNotificationAction = UNNotificationAction(identifier: "jujue", title: "拒絕", options: .destructive)
  5. let actions: [UNNotificationAction] = [action1, action2]
  6. // 建立操做組
  7. // identifier: 操做組標識
  8. // actions: 操做組行爲
  9. // intentIdentifiers:暫時未發現該用途
  10. // options: 支持的場景
  11.  
  12. let categoryIdentifier = "category1"
  13. let category: UNNotificationCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: actions, intentIdentifiers: [], options: .customDismissAction)
  14. // 註冊操做集合(其中設置操做組)
  15. let categories: Set<UNNotificationCategory> = [category]
  16. center.setNotificationCategories(categories)
  17.  
  18. // 設置該通知用到的額外操做組
  19. content.categoryIdentifier = "category1"
  • 展現效果
    • 點擊回覆打開app
    • 點擊拒絕則不會打開app
    • 二者都會調用接收通知的代理方法
      *

七.設置快捷回覆

  • 操做行爲有2個類來實現’UNNotificationAction’以及UNTextInputNotificationAction
  • 其中UNTextInputNotificationAction是’UNNotificationAction’的子類,用於實現快捷回覆
    • 下列代碼中的action3 爲便捷回覆行爲
 
  1.  
  2. // 1.建立操做項
  3. let action1: UNNotificationAction = UNNotificationAction(identifier: "huifu", title: "回覆", options: .foreground)
  4. let action2: UNNotificationAction = UNNotificationAction(identifier: "jujue", title: "拒絕", options: .destructive)
  5.  
  6. let action3 = UNTextInputNotificationAction(identifier: "kuaijie", title: "快捷回覆", options: .foreground, textInputButtonTitle: "回覆按鈕", textInputPlaceholder: "佔位字符")
  7. let actions: [UNNotificationAction] = [action1, action2,action3]
  8.  
  9. // 建立操做組
  10. // identifier: 操做組標識
  11. // actions: 操做組行爲
  12. // intentIdentifiers:暫時未發現該用途
  13. // options: 支持的場景
  14.  
  15. let categoryIdentifier = "category1"
  16. let category: UNNotificationCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: actions, intentIdentifiers: [], options: .customDismissAction)
  17. // 註冊操做集合(其中設置操做組)
  18. let categories: Set<UNNotificationCategory> = [category]
  19. center.setNotificationCategories(categories)
  • 展現效果

八.通知觸發的場景

  • 在實際開發中,前臺獲取通知與後臺獲取通知所要執行的邏輯不一致,那麼就有必要去判斷一下,當前的通知觸發的場景
  • 步驟
    • 在獲取到通知的代理方法中獲取該應用的狀態
    • 判斷當前狀態
 
  1. /// 當接收到通知的時候會來到該方法
  2. ///
  3. /// - Parameters:
  4. /// - center: 通知中心
  5. /// - response: 響應
  6. /// - completionHandler: 成功回調
  7. func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  8.  
  9. if let response = response as? UNTextInputNotificationResponse {
  10. print(response.userText)
  11.  
  12. } else {
  13. print("接收到通知獲取額外信息\(response.notification.request.content.userInfo)")
  14.  
  15. }
  16.  
  17. let status = UIApplication.shared.applicationState
  18.  
  19. switch status {
  20. case .active:
  21. print("在前臺")
  22. case .inactive:
  23. print("進入前臺")
  24. default:
  25. print("在後臺")
  26. }
  27.  
  28. completionHandler()
  29. }

iOS10遠程推送通知

一.獲取DeviceToken

  • 此處省略配置真機調試證書通知調試證書以及通知生產證書步驟
  • 必須保證BundleId與在開發者中心的AppId一致
  • 必須使用真機

1.註冊通知

  • 須要導入頭文件或者框架UserNotifications
  • 在iOS8.0以後,若是想要用戶接收通知須要主動請求受權,爲了能讓該代碼必定被執行,通常寫在Appdelegate中
 
  1. // 1.獲取通知中心
  2. let center = UNUserNotificationCenter.current()
  3.  
  4. // 2.註冊通知
  5. center.requestAuthorization(options: [.alert,.carPlay,.badge,.sound], completionHandler: {(granted: Bool, error: Error?) in
  6. if error != nil {
  7. return
  8. }
  9.  
  10. if granted {
  11. print("用戶容許通知")
  12. } else {
  13. print("用戶拒絕通知")
  14. }
  15. })

2.向蘋果服務器申請DeviceToken

  • 獲取方式與iOS8.0一致
 
  1.  
  2. // 3.獲取deviceToken
  3. application.registerForRemoteNotifications()
  • 從代理中獲取deviceToken
    • 此處Data打印的是32types,轉爲NSData便可
 
  1. /// 當獲取到deviceToken會來到該方法
  2. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  3. print(NSData(data: deviceToken))
  4. }
  5.  
  6. /// 註冊失敗會來到該方法
  7. func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
  8. print(error)
  9. }

3.開啓遠程推送功能

  • 工程->target->Capabilities->Push
  • 開啓的條件
    • 1.Apple Id 必須配置了遠程推送通知
    • 2.權利文件(打開會自動生成該文件)

4.運行真機,獲取DeviceToken

二.發送通知

  • 藉助PushMeBaby做爲服務器向蘋果服務器發送消息,蘋果服務器推送通知

極光推送

  • 註冊應用
  • 上傳通知證書.p12
  • 集成Jpush SDK

1.註冊Jpush並獲取DeviceToken

 
  1.  
  2. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  3.  
  4. // 註冊通知
  5. let entity = JPUSHRegisterEntity()
  6. entity.types = Int(JPAuthorizationOptions.alert.rawValue | JPAuthorizationOptions.badge.rawValue | JPAuthorizationOptions.sound.rawValue)
  7.  
  8. JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)
  9.  
  10. // 初始化JUSH
  11. JPUSHService.setup(withOption: launchOptions, appKey: "b29ccf03d1e6aca9baa3c34a", channel: "App Store", apsForProduction: false)
  12.  
  13. return true
  14. }
  15.  
  16. /// 獲取DeviceToken
  17. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  18. JPUSHService.registerDeviceToken(deviceToken)
  19. }
  20.  
  21. /// 註冊失敗
  22. func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
  23. print(error)
  24. }

2.設置代理,處理通知

 
  1. extension AppDelegate : JPUSHRegisterDelegate {
  2.  
  3. /// 獲取通知
  4. func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
  5.  
  6. }
  7.  
  8. /// 可設置在前臺獲取通知
  9. func jpushNotificationCenter(_ center: UNUserNotificationCenter!, willPresent notification: UNNotification!, withCompletionHandler completionHandler: ((Int) -> Void)!) {
  10.  
  11.  
  12. let userInfo = notification.request.content.userInfo
  13.  
  14. let isPushTrigger = notification.request.trigger?.isKind(of: UNPushNotificationTrigger.self) ?? false
  15.  
  16. if isPushTrigger {
  17. JPUSHService.handleRemoteNotification(userInfo)
  18.  
  19. }
  20.  
  21. let value = Int(UNNotificationPresentationOptions.alert.rawValue | UNNotificationPresentationOptions.sound.rawValue | UNNotificationPresentationOptions.badge.rawValue)
  22.  
  23. completionHandler(value)
  24. // 須要執行這個方法,選擇是否提醒用戶,有Badge、Sound、Alert三種類型能夠選擇設置
  25. }
  26. }

 

 

//原文:http://bbs.520it.com/forum.php?mod=viewthread&tid=3020

相關文章
相關標籤/搜索