在上一篇文章中,我們已經建立了基本的 鬧鐘資料結構 (AlarmData),並且準備好管理鬧鐘所需的基礎資料。
今天要帶大家進一步完成一個很重要的功能:通知權限請求。
畢竟,如果我們沒有請求通知權限,系統就算排程了鬧鐘,也不會跳出提醒。那我們的鬧鐘 App 就完全失去意義了。
iOS 的設計相當注重使用者隱私與體驗。
要顯示通知(無論是提醒事項、鬧鐘、還是其他推播),App 必須經過使用者授權。
而這個授權動作通常會在 App 第一次啟動時 或 第一次要用到通知功能時 彈出詢問視窗。
這樣,使用者就能決定要不要允許通知。
首先,我們需要在 AppDelegate 中導入 UserNotifications
,並在application(_:didFinishLaunchingWithOptions:)
內進行權限請求。
import UIKit
import UserNotifications
@main
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 設定通知中心的 delegate
UNUserNotificationCenter.current().delegate = self
// 向使用者請求通知權限
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
print("✅ 使用者允許通知")
} else {
print("❌ 使用者拒絕通知")
}
}
return true
}
}
這段程式碼的重點有兩個:
AppDelegate
可以處理通知相關的事件。即使使用者允許通知,我們也要告訴系統 該如何呈現通知。
這就是 userNotificationCenter(_:willPresent:withCompletionHandler:)
的用途。
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// 指定通知要如何顯示
completionHandler([.alert, .sound, .badge])
}
.alert
→ 彈出視窗提醒.sound
→ 播放鬧鐘聲音.badge
→ 更新 App Icon 上的數字這樣就能確保當鬧鐘時間到時,通知能正常跳出來,不會被系統靜默忽略。
當我們完成以上設定,第一次啟動 App 時,會跳出系統的通知授權視窗:
「是否允許此 App 傳送通知?」
如果使用者選擇「允許」,那麼鬧鐘的提醒就能順利發送;
反之,若選擇「不允許」,就算你排程了鬧鐘,也不會響起。
今天我們完成了 通知權限設定,這是鬧鐘 App 中不可或缺的一環。