The Util Designer
SwiftUI 發送Local Notification
xcode 13.4.1, swift 5.5, iOS 15.4
2022-09-03
App的Notification通知是一種很常用的方法來通知使用者的手段,這次我們來學習從App自身發出的Local Notification。
鎖住屏幕時收到的通知
1. 我們使用兩個按鈕來做兩件事件,第一個按鈕是向使用者要求使用Notification,第二個按鈕是發送一個延時的Local Notification。
import SwiftUI

struct UserNotificationsExample: View {
    var body: some View {
        VStack {
            Button("Request Permission") {
            }
            .buttonStyle(.borderedProminent)

            Button("Schedule Notification") {
            }
            .buttonStyle(.borderedProminent)
        }
    }
}
2. 第一個按鈕是向使用者要求使用Notification,所以要引入UserNotifications的library,然後使用UNUserNotificationCenter的requestAuthorization來向使用者要求需要發通知的權限,當使用者回答人後,會用一個closure來告訴App使用者的回應,如果使用者按了allow,success是true代表使用者允許可以發送權知的權限,如果使用者按了Don't Allow,success是返回false:
import SwiftUI
import UserNotifications

struct UserNotificationsExample: View {
    var body: some View {
        VStack {
            Button("Request Permission") {
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
                    if success {
                        print("Notification Permission Set!")
                    } else if let error = error {
                        print(error.localizedDescription)
                    }
                }
            }
            .buttonStyle(.borderedProminent)

            Button("Schedule Notification") {
            }
            .buttonStyle(.borderedProminent)
        }
    }
}
若不小心按了Don't Allow,可以到iPhone的Settings把該App的Notifications改為Allow Notifications。
4. 再來做定時發送Notification,以下是做一個延時5秒的Local Notification,再按完第二個按鈕後立即,5秒後就會在頂部看到該Notification。或再第完第二個按鈕後,立即按Command+L把鎖住屏幕,5秒後就會看到中間的Notification。
import SwiftUI
import UserNotifications

struct UserNotificationsExample: View {
    var body: some View {
        VStack {
            Button("Request Permission") {
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
                    if success {
                        print("Notification Permission Set!")
                    } else if let error = error {
                        print(error.localizedDescription)
                    }
                }
            }
            .buttonStyle(.borderedProminent)

            Button("Schedule Notification") {
                let content = UNMutableNotificationContent()
                content.title = "School Time"
                content.subtitle = "It's time to go to school"
                content.sound = UNNotificationSound.default

                // show this notification five seconds from now
                let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

                // choose a random identifier
                let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

                // add our notification request
                UNUserNotificationCenter.current().add(request)
            }
            .buttonStyle(.borderedProminent)
        }
    }
}
退出App的頂部通知
鎖住屏幕時收到的通知