Description:
App 中常會透過通知來告訴使用者某些特定訊息(e.g.行事曆提醒、收到新訊息),在 iOS 上的通知共分成兩種 local 及 remote。本篇是實作 Local 端的 UserNotifications。
Component:
Highlight function:
要能夠傳送通知之前需要跟使用者要求允許通知的權限。
// request user authorization
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (success, error) in
if error == nil {
print("Require Authorization success.")
}
}
在 requestAuthorization() 中 options 參數是用來表示顯示通知的方式,有圖文、聲音,以及在 App Icon 顯示數字或是carPlay。
建立通知的顯示內容(content)及觸發條件(trigger)和用來識別此通知的 uniqued ID:
let request = UNNotificationRequest(identifier: notificationId,
content: content,
trigger: trigger)
顯示內容除了文字之外,也可以帶入圖片或是檔案,在這個 demo 中帶入了一個 gif 檔:
let content = UNMutableNotificationContent()
let attachment = try! UNNotificationAttachment(identifier: "NickYoung", url: imgURL, options: .none)
content.title = "New notification"
content.subtitle = "Hello!"
content.body = "Content body."
content.attachments = [attachment]
content.sound = UNNotificationSound.default()
content.badge = (UIApplication.shared.applicationIconBadgeNumber + 1) as NSNumber
觸發的條件可設定多少時間後觸發及是否重複觸發:
let notifyInSecond = 10
let repeatNotify: Bool = false
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: inSeconds, repeats: repeatNotify)
若是設定為重複觸發, timeInterval 最短的時間區間是 60 秒。
將欲發送之通知加入 NotificationCenter 即可完成:
UNUserNotificationCenter.current().add(request) { (error) in
if error == nil {
completion(true)
} else {
completion(false)
}
}
Additional:
點擊 App 或是通知訊息後 App Icon 數字(badge)的清除方式:
func applicationDidBecomeActive(_ application: UIApplication) {
application.applicationIconBadgeNumber = 0 // clear badge count
}
Reference:
UserNotifications
Source code on Github