本文記錄目前所知建立本地推播通知的步驟流程作為筆記,說明可能略微簡潔,加上目前仍為學習階段可能說明用詞不準確,若有需要改正之處再請大家不吝嗇地提出。
【本文大綱】
建立本地推播通知
- 徵求使用者接收推播通知的意願以取得發送通知的權限
- 設定註冊推播並新增
推播三大組成:推播內容 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"))