建立 iOS 10 的本地推播通知 Local Notification

Patty
9 min readNov 15, 2021

--

本文記錄目前所知建立本地推播通知的步驟流程作為筆記,說明可能略微簡潔,加上目前仍為學習階段可能說明用詞不準確,若有需要改正之處再請大家不吝嗇地提出。

【本文大綱】

建立本地推播通知

  • 徵求使用者接收推播通知的意願以取得發送通知的權限
  • 設定註冊推播並新增
    推播三大組成:推播內容 content、觸發方式 trigger、請求 request

補充

經常使用

  • 在前景可以接收推播
  • 點擊推播通知之後做的事
  • 刪除、更新推播

心有餘力的練習

  • 推播內容加入圖片
  • 客製化推播的音效

如果還可以

  • 推播客製化按鈕 (目前尚未研究,之後有時間研究後再補上)

建立本地推播通知

1.徵求使用者接收推播的意願以取得發送通知的權限

AppDelegate.swift

✔︎ 匯入 UserNotifications

✔︎ 在 function application(_:didFinishLaunchingWithOptions:) 詢問使用者是否接收推播通知。
p.s. 只有在一開始啟動 App 會詢問,如果當下選擇不允許之後想開啟通知必須到手機的設定選擇 App 後再開啟通知。

2.設定註冊推播

推播三大組成

  • 推播內容 content (UNMutableNotificationContent 物件):設定主旨標題、文字內容、App icon 顯示通知數量(badge)、推播音效,最後補充的實作提到加入推播內容的圖片以及夾帶資訊 (例如:網址)。
  • 觸發方式 trigger:間隔時間、特定日期時間、地點觸發方式,repeats 參數設定是否要重複觸發。
    p.s. 以下透過幾個實作模擬不同的情境套用不同觸發方式
  • 請求 request (UNNotificationRequest 物件)
    ps. 注意 id 是之後需要刪除或修改該則推播通知的辨識碼,如果要立刻推播 trigger 設為 nil。

實作示範不同觸發方式

  • 【觸發方式:時間間隔】倒數計時觸發推播通知連結 UIDatePicker 實現
    ✔️ 選擇 UNTimeIntervalNotificationTrigger 物件
    ✔️ 時間間隔選擇 UIDatePicker.countDownDuration
// 觸發方式
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: countdownDatePicker.countDownDuration, repeats: false)
  • 【觸發方式:特定日期時間】連結 UIDatePicker 選擇特定日期實現
    ✔️ 選擇 UNCalendarNotificationTrigger 物件
    ✔️ dateMatching 參數選擇 DateComponents 型別
    透過 Calendar 物件的 dateComponents 方法取得 DateComponents 物件,依 UIDatePicker 的特定日期,取得日期組件月、日、小時、分鐘。
// 觸發方式
let trigger = UNCalendarNotificationTrigger(dateMatching: Calendar.current.dateComponents([.month,.day,.hour,.minute], from: specificDatePicker.date), repeats: false)
  • 【觸發方式:特定日期 — 重複週】
    重複一週特定工作日或週末且連結 UIDatePicker 選擇時間
    ✔️ 選擇 UNCalendarNotificationTrigger 物件
    ✔️ dateMatching 參數選擇 DateComponents 型別
    和上述實作相似,差別於多設日期組件的 weekday property
    p.s. 星期日是1,星期一是2,以此類推,星期六是7。
// 生成DateComponents型別物件
func dateComponent(weekday: Int?) -> DateComponents {
let date = specificTimeDatePicker.date
let calendar = Calendar.current
var components = calendar.dateComponents([.weekday, .hour, .minute],from: date)
components.weekday = weekday
return components
}
// 觸發
let trigger = UNCalendarNotificationTrigger(dateMatching:dateComponent(weekday: i), repeats: true)

3.新增推播通知:跟通知中心請求將推播通知加入排程

UNUserNotificationCenter.current().add(request,withCompletionHandler: {error in
print("成功建立通知...")
})

補充

經常使用

在前景也可以接收推播

需要透過 UNUserNotificationCenterDelegate 協定的 userNotificationCenter(_:willPresent:withCompletionHandler:) 方法

1.遵從 UNUserNotificationCenterDelegate 的 protocol

2.定義 userNotificationCenter(_:willPresent:withCompletionHandler:)

3.指派 UNUserNotificationCenter 物件的代理人

// AppDelegate.swift
// func application(_:didFinishLaunchingWithOptions:)
// 前景也可以收到推播通知
UNUserNotificationCenter.current().delegate = self

點擊推播通知之後做的事

點擊推播會觸發 UNUserNotificationCenterDelegate protocol 的 function userNotificationCenter(_:didReceive:withCompletionHandler:)

p.s. 上述在前景推播的補充已經指派 UNUserNotificationCenter 物件的代理人且extension AppDelegate 遵從 UNUserNotificationCenterDelegate,因此客製化點擊後要做的事情只需要加入在上述的 extension 後面定義此方法即可。

說明:實作點擊後開啟連結
(第3行) 取得通知推播內容
(第4行) 呼叫閉包用否則無法取得推播內容的userInfo
(第5行) 透過條件辨別推播通知的id以客製化點擊不同推播通知的實作
(第7行) 取得 userInfo 的link
(第8行) 開啟連結

刪除、更新推播

透過呼叫 UNUserNotificationCenter 物件的方法實現

刪除推播

  • 已發送
removeDeliveredNotifications(withIdentifiers:)
removeAllDeliveredNotifications()
  • 尚未發送
removePendingNotificationRequests(withIdentifiers:)
removeAllPendingNotificationRequests()

更新推播

修改新的推播的內容或觸發方式,覆蓋之前的 reguest 但切記要同一個 id,再重新呼叫 UNUserNotificationCenter 物件的add(_:withCompletionHandler:) 方法將新的推播通知加入排程

心有餘力的練習

推播內容加入圖片

1.在Bundle加入圖片

2.取得圖片 (第2行)

3.生成 UNNotificationAttachment 物件 (第3行)

4.設定推播通知內容的 attachments 屬性 (第4行)

客製化推播的音效

設定推播內容的 sound 屬性,音樂不能超過30秒否則播放預設。

// 自訂音效
content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "bensound-sunny-cut.mp3"))

--

--