メモ > 技術 > 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)