開始用Swift開發(fā)iOS 10 - 26 使用本地用戶通知

iOS 10 之前用戶通知相對而言是簡單的懂讯,iOS 10讓用戶通知更加豐富了荷憋,可以有靜態(tài)圖片,動態(tài)gif褐望,視頻勒庄,音頻等。

用戶通知可以出現(xiàn)在通知中心瘫里,主屏实蔽,鎖屏時,當用戶錯過了用戶通知時减宣,可以在通知中心查看盐须。

用戶通知分為兩類:

  • 本地通知。 是通過應用本身和用戶設備本身觸發(fā)的漆腌。比如:基于用戶位置的app贼邓,在用戶進入某個特殊區(qū)域發(fā)送通知;to-do list的app在某些特定時間發(fā)送通知闷尿。
  • 遠程通知塑径。 是遠程服務器端首先向蘋果推送服務器(Apple Push Notification Service ,APNS)發(fā)送填具,然后再經(jīng)過APNS推送通知到用戶設備统舀。

這一篇只討論本地通知。

三種不同觸發(fā)的本地通知:

  • 特定數(shù)量的時間劳景。 比如是10分鐘后誉简。
  • 特定日期和時間點。
  • 特定位置盟广。

詢問用戶授權

向用戶發(fā)送通知是要得到用戶允許的闷串。

  • AppDelegate.swift中添加 import UserNotifications
  • application(_:didFinishLaunchingWithOptions:)方法中添加授權
          UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {
              (granted, error) in
              
              if granted {
                  print("User notifications are allowed.")
              } else {
                  print("User notifications are not allowed.")
              }
          })
    

創(chuàng)建通知

通知的一般結(jié)構(gòu):

通知用UNMutableNotificationContent類來表示。

  • RestaurantTableViewController中添加一個方法
    func prepareNotification() {
        // Make sure the restaurant array is not empty
        if restaurants.count <= 0 {
            return
        }
        // 1
        let randomNum = Int(arc4random_uniform(UInt32(restaurants.count)))
        let suggestedRestaurant = restaurants[randomNum]
        // 2 
        let content = UNMutableNotificationContent()
        content.title = "Restaurant Recommendation"
        content.subtitle = "Try new food today"
        content.body = "I recommend you to check out \(suggestedRestaurant.name!).The restaurant is one of your favorites. It is located at \(suggestedRestaurant.location!). Would you like to give it a try?"
        content.sound = UNNotificationSound.default()
        // 3
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats:
        false)
        let request = UNNotificationRequest(identifier: "foodpin.restaurantSuggestion", content: content, trigger: trigger)
        // Schedule the notification
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
        
    }
  • 1 獲得一個隨機的restaurant
  • 2 通過UNMutableNotificationContent獲得一個通知筋量,配置參數(shù)烹吵,sound表示需要通知聲音。
  • 3 UNTimeIntervalNotificationTrigger是一個時間觸發(fā)桨武,為了好測試肋拔,表示10s后通知一次。
  • viewDidLoad中實現(xiàn)上面函數(shù)呀酸。prepareNotification()

現(xiàn)在運行凉蜂,注意在應用內(nèi)是不能接受本應用通知,所以運行后立即進入主屏或鎖屏性誉。通知本身有高度限制窿吩,內(nèi)容過長會不顯示,只要向下滑動就可以顯示完整艾栋。

向通知中添加圖片

圖片等富文本內(nèi)容通過UNMutableNotificationContentattachments屬性添加爆存,attachments屬性是UNNotificationAttachment的數(shù)組。UNNotificationAttachment可以是圖片蝗砾、音頻先较、音效、視頻文件悼粮。

  • prepareNotification中的觸發(fā)之前添加代碼:
          // 1
          let tempDirURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory:
              true)
          let tempFileURL = tempDirURL.appendingPathComponent("suggested-restaurant.jpg")
          if let image = UIImage(data: suggestedRestaurant.image! as Data) {
             // 2 
              try? UIImageJPEGRepresentation(image, 1.0)?.write(to: tempFileURL)
              if let restaurantImage = try? UNNotificationAttachment(identifier:
                  "restaurantImage", url: tempFileURL, options: nil) {
                  content.attachments = [restaurantImage]
              }
          }
    
    • 1 由于使用Core Data闲勺,圖片以NSData形式存儲了,所以使用NSTemporaryDirectory來生成臨時目錄存儲臨時圖片文件
    • 2 UIImageJPEGRepresentation用來生成jpg圖片文件

運行查看扣猫,同樣向下滑動可查看完整菜循。

和通知的交互

之前只要點擊通知進入應用的交互,這是默認的交互申尤。

  • prepareNotification中的觸發(fā)之前添加代碼:
           // 1
          let categoryIdentifer = "foodpin.restaurantaction"
          // 3
          let makeReservationAction = UNNotificationAction(identifier: "foodpin.makeReservation", title: "Reserve a table", options: [.foreground])
          let cancelAction = UNNotificationAction(identifier: "foodpin.cancel", title:
              "Later", options: [])
          // 4
          let category = UNNotificationCategory(identifier: categoryIdentifer, actions:[makeReservationAction, cancelAction], intentIdentifiers: [], options: [])
          // 5
          UNUserNotificationCenter.current().setNotificationCategories([category])
          // 2 
          content.categoryIdentifier = categoryIdentifer
    
    • 1,2 categoryIdentifier是讓通知和category關聯(lián)起來
    • 3 UNNotificationAction有點類似UIAlertAction癌幕,options: [.foreground]表示讓應用到前臺衙耕,就是啟動應用
    • 4 UNNotificationCategory有點類似UIAlertController
    • 5 把UNNotificationCategory注冊到用戶中心

處理Actions

上面的options: [.foreground]只是啟動了應用,沒有實現(xiàn)具體操作勺远。UNUserNotificationCenterDelegate中的userNotificationCenter(_:didReceive:withCompletionHandler:)方法在UNNotificationAction被選擇時調(diào)用橙喘,在這個方法內(nèi)部可實現(xiàn)具體操作。

  • AppDelegate符合協(xié)議UNUserNotificationCenterDelegate
  • 實現(xiàn)userNotificationCenter(_:didReceive:withCompletionHandler:)
      func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
          // 1
          if response.actionIdentifier == "foodpin.makeReservation" {
              print("Make reservation...")
              // 2 
              if let phone = response.notification.request.content.userInfo["phone"] {
                  let telURL = "tel://\(phone)"
                  if let url = URL(string: telURL) {
                      if UIApplication.shared.canOpenURL(url) {
                          print("calling \(telURL)")
                          // 3
                          UIApplication.shared.open(url)
                      }
                  }
              }
          }
          completionHandler()
      }
    
    • 1 對應之前創(chuàng)建UNNotificationAction時的identifier胶逢。
    • 2 response.notification.request.content對應之前創(chuàng)建通知prepareNotification函數(shù)中的UNMutableNotificationContent厅瞎,userInfo屬性可用來存儲通知想傳遞的數(shù)據(jù)。比如在prepareNotification函數(shù)中添加content.userInfo = ["phone": suggestedRestaurant.phone!]初坠,這邊就可獲得和簸。
    • 3 撥打電話。
  • content.userInfo = ["phone": suggestedRestaurant.phone!]中添加UNUserNotificationCenter.current().delegate = self碟刺。

代碼

Beginning-iOS-Programming-with-Swift

說明

此文是學習appcode網(wǎng)站出的一本書 《Beginning iOS 10 Programming with Swift》 的一篇記錄

目錄

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末身诺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抄囚,更是在濱河造成了極大的恐慌霉赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔托,死亡現(xiàn)場離奇詭異穴亏,居然都是意外死亡,警方通過查閱死者的電腦和手機重挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門嗓化,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谬哀,你說我怎么就攤上這事刺覆。” “怎么了史煎?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵谦屑,是天一觀的道長。 經(jīng)常有香客問我篇梭,道長氢橙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任恬偷,我火速辦了婚禮悍手,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己坦康,他們只是感情好竣付,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涝焙,像睡著了一般卑笨。 火紅的嫁衣襯著肌膚如雪孕暇。 梳的紋絲不亂的頭發(fā)上仑撞,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音妖滔,去河邊找鬼隧哮。 笑死,一個胖子當著我的面吹牛座舍,可吹牛的內(nèi)容都是我干的沮翔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼曲秉,長吁一口氣:“原來是場噩夢啊……” “哼采蚀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起承二,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榆鼠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亥鸠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妆够,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年负蚊,在試婚紗的時候發(fā)現(xiàn)自己被綠了神妹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡家妆,死狀恐怖鸵荠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伤极,我是刑警寧澤蛹找,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站塑荒,受9級特大地震影響熄赡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜齿税,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一彼硫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦拧篮、人聲如沸词渤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缺虐。三九已至,卻和暖如春礁凡,著一層夾襖步出監(jiān)牢的瞬間高氮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工顷牌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剪芍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓窟蓝,卻偏偏與公主長得像罪裹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子运挫,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫状共、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 一谁帕、生活事件 1峡继、早上起,深呼吸雇卷,晨起做能量操淑掌。練習冥想丑勤。 2、溫開水滋養(yǎng)身體,感謝钮呀、感謝生命之源叫我起庫逗概,今天在...
    Cyylinxi閱讀 259評論 0 0
  • 昨天老公和我說,他被選中去香港培訓3個星期调榄。一聽到這個消息踊赠,腦袋一熱,第一個反應就是每庆,我要一個人帶寶貝了筐带,我該怎么...
    快快媽媽育兒說閱讀 559評論 1 0
  • 今晚, 又偷了東西缤灵,偷了黑夜的時間伦籍。 會貪戀這種“癖”蓝晒,可不是慣犯。 時間有限帖鸦,何必不多占一點芝薇,不越法不少德,不冒...
    青青橙閱讀 349評論 0 2