Memo

メモ > 技術 > IDE: Xcode > SwiftUI+通知

SwiftUI+通知
■通知 ※未検証 SwiftUIのディープリンク対応:プッシュ通知から画面遷移する方法 - Quipper Product Team Blog https://quipper.hatenablog.com/entry/2020/12/24/swiftui-deeplinking iOSシミュレータにプッシュ通知を送ってみる - Qiita https://qiita.com/koogawa/items/85c0dd0abd2f1970c5fc 【SwiftUI】Firebase Cloud Messagingで受信したプッシュ通知の内容をSwiftUIのViewで利用する - Swift・iOS https://www.hfoasi8fje3.work/entry/2021/01/20/%E3%80%90SwiftUI%E3%80%91Firebase_Cloud_Messaging%E3%8... 【SwiftUI】プッシュ通知を選択した時に特定の画面に遷移する - Swift・iOS https://www.hfoasi8fje3.work/entry/2021/01/25/%E3%80%90SwiftUI%E3%80%91%E3%83%97%E3%83%83%E3%82%B7%E... ※以下2022年に改めて調べたときのもの 未検証 【SwiftUI】通知機能の実装方法!ローカル通知とリモート通知の違い https://tech.amefure.com/swift-notification 【Swift】Firebaseからプッシュ通知を受け取るために最低限の実装をする(iOS15対応) https://zenn.dev/tomsan96/articles/0cdfde2a49bfb2 ■ローカル通知 【SwiftUI】ローカル通知と通知からのアプリ起動(DeepLink) | thwork https://thwork.net/2021/08/29/swiftui_notification_deeplink/ 【SwiftUI】ローカル通知を実装する方法【バックグラウンド】 - おもちblog https://omochiblog.com/2021/02/28/swiftui-localnotification-background/ 最低限のローカル通知
import SwiftUI import UserNotifications struct ContentView: View { @State var buttonText = "5秒後にローカル通知を発行する" var body: some View { // ローカル通知発行ボタン Button(action: { UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in if granted { // 通知が許可されている場合の処理 // 通知を作成 makeNotification() } else { // 通知が拒否されている場合の処理 // ボタンの表示を変える buttonText = "通知が拒否されているので発動できません" DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // 1秒後に表示を戻す buttonText = "5秒後にローカル通知を発行する" } } } }) { //ボタンのテキストを表示 Text(buttonText) } } // 通知を作成 func makeNotification() { // 通知コンテンツを指定 let content = UNMutableNotificationContent() content.title = "ローカル通知" content.body = "これはローカル通知のテストです。" content.sound = UNNotificationSound.default // 通知タイミングを指定 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) // 通知リクエストを作成 let request = UNNotificationRequest(identifier: "notification001", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) } } #Preview { ContentView() }
フォアグラウンドでも通知を受け取れるように
import SwiftUI import UserNotifications struct ContentView: View { var notificationDelegate = ForegroundNotificationDelegate() @State var buttonText = "5秒後にローカル通知を発行する" var body: some View { // ローカル通知発行ボタン Button(action: { UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in if granted { // 通知が許可されている場合の処理 // 通知を作成 makeNotification() } else { // 通知が拒否されている場合の処理 // ボタンの表示を変える buttonText = "通知が拒否されているので発動できません" DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // 1秒後に表示を戻す buttonText = "5秒後にローカル通知を発行する" } } } }) { //ボタンのテキストを表示 Text(buttonText) } } // 通知を作成 func makeNotification() { // 通知コンテンツを指定 let content = UNMutableNotificationContent() content.title = "ローカル通知" content.body = "これはローカル通知のテストです。" content.sound = UNNotificationSound.default // 通知タイミングを指定 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) // 通知リクエストを作成 let request = UNNotificationRequest(identifier: "notification001", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) // フォアグラウンドでの通知に対応 UNUserNotificationCenter.current().delegate = notificationDelegate } } class ForegroundNotificationDelegate:NSObject, UNUserNotificationCenterDelegate{ func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { //completionHandler([.alert, .list, .badge, .sound]) // iOS13まで completionHandler([.banner, .list, .badge, .sound]) // iOS14から } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let queryString = response.notification.request.identifier let url = URL(string:"deeplinktest://deeplink?\(queryString)") if let openUrl = url { UIApplication.shared.open(openUrl) } completionHandler() } } #Preview { ContentView() }
通知のタイミングを指定
// 5秒後に通知 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) // 5秒後に通知(別の指定方法) let notificationDate = Date().addingTimeInterval(5) let dateComp = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: notificationDate) let trigger = UNCalendarNotificationTrigger(dateMatching: dateComp, repeats: false) // 日時を指定して通知 let calendar = Calendar(identifier: .gregorian) let notificationDate = calendar.date(from: DateComponents(year: 2021, month: 12, day: 5, hour: 17, minute: 51, second: 45)) let dateComp = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: notificationDate!) let trigger = UNCalendarNotificationTrigger(dateMatching: dateComp, repeats: false)

Advertisement