[iOS] SwiftUIでLocal Notificationを実装する
今回は最初にアプリを起動した時ローカルプッシュ通知の権限を求め、許可された場合View内のボタンをタップすると5秒後にプッシュ通知が来るサンプルアプリを紹介します。
1. プロジェクト生成
最初に、SwiftUIのプロジェクトを生成します。
2. Local Notification
次は、notificationを管理するNotificationManager.swiftファイルを生成します。
そしてこの中にnotificationの権限を求めるrequestPermission()メソッドを作成します。
import Foundation
import UserNotifications
final class NotificationManager {
static let instance: NotificationManager = NotificationManager()
// 権限リクエスト
func requestPermission() {
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, _) in
print("Permission granted: \(granted)")
}
}
}
メソッド内に書いている.requestAuthorization()でPermission許可のアラートが出てきます。
.requestAuthorization()のオプションとしては
- .alert
- .sound
- .badge
の3つがあります。
プッシュ通知が来る際に指定した選択したオプションで来るようになります。
その次は、notificationを登録するsendNotification()メソッドを作成します。
import Foundation
import UserNotifications
final class NotificationManager {
static let instance: NotificationManager = NotificationManager()
// 権限リクエスト
func requestPermission() {
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, _) in
print("Permission granted: \(granted)")
}
}
// notificationの登録
func sendNotification() {
let content = UNMutableNotificationContent()
content.title = "Notification Title"
content.body = "Local Notification Test"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: "notification01", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
}
UNMutableNotificationContent()でプッシュ通知のタイトル、内容などの指定を行います。
また、トリガーの設定もUNTimeIntervalNotificationTrigger()を用いて定義します。
今回はtimeInterval: 5にして5秒後にプッシュ通知が来るように設定します。
他のnotificationトリガーを使いたい場合は、以下のリンクを参照してください。
- UNCalendarNotificationTrigger
- UNLocationNotificationTrigger
- UNPushNotificationTrigger
3. AppDelegate
アプリ起動時に権限を求める場合は、AppDelegateでその設定を行います。
ただし、SwiftUIのプロジェクトには基本的にAppDelegate.swiftがないので、新しく追加する必要があります。
実は、SwiftUIプロジェクトの@main内でAppDelegateクラスを定義することもできますが、今回は別のファイルとして定義したいと思います。
AppDelegate.swiftの追加ができたら、以下のように権限リクエストメソッドを呼び出しましょう。
import Foundation
import NotificationCenter
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
// リクエストのメソッド呼び出し
NotificationManager.instance.requestPermission()
UNUserNotificationCenter.current().delegate = self
return true
}
}
その後、@mainにAppDelegateをアダプターとして定義します。
import SwiftUI
@main
struct SampleLocalNotificationApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
これでローカルプッシュ通知の権限を求めることができるようになりました。
あとはプッシュ通知を送るボタンを置くだけです!💪
4. View
ボタンを用意し、NotificationManagerのsendNotification()メソッドを呼び出すようにアクションを設定します。
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Local Notification Demo")
.padding()
Button(action: { NotificationManager.instance.sendNotification() }) {
Text("Send Notification!!")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
これで完成です。5秒後にプッシュ通知が来るか試してみましょう。
設定したnotificationの内容通りにローカルプッシュ通知がきちんと来てますね!
プッシュ通知のバナーをタップするとアプリに移動することもできるはずです。
最後に
今回紹介させていただきましたLocal Notificationの仕組みを使っていろんな実装ができそうなのでやってみると良さそうと思いました。
実際に私もこのローカル通知を個人アプリのアラーム機能の一部として導入して開発をしています。
その内容についても後で紹介していきたいと思います。
この記事が気に入ったらサポートをしてみませんか?