[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()
        }
    }
}

これでローカルプッシュ通知の権限を求めることができるようになりました。

画像1

あとはプッシュ通知を送るボタンを置くだけです!💪

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()
   }
}

画像2

これで完成です。5秒後にプッシュ通知が来るか試してみましょう。

画像3

設定したnotificationの内容通りにローカルプッシュ通知がきちんと来てますね!
プッシュ通知のバナーをタップするとアプリに移動することもできるはずです。

最後に

今回紹介させていただきましたLocal Notificationの仕組みを使っていろんな実装ができそうなのでやってみると良さそうと思いました。
実際に私もこのローカル通知を個人アプリのアラーム機能の一部として導入して開発をしています。
その内容についても後で紹介していきたいと思います。

この記事が気に入ったらサポートをしてみませんか?