iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Swift】ローカルプッシュを送信する

今日はタイトルの通り、Swift でローカルプッシュを送信する方法を紹介したいと思います👷‍♀️ ちなみに、実装は Swift5.3 で動作確認は iOS14.1 で行っておりやす。

それではやっていく🦅

まずは、通知を送信できるようにするためにユーザに許可してもらう必要があります。

    func requestAuthorizationForNotification() {
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in
            // リクエスト終了した時のハンドリング
        }
    }

requestAuthorizationcompletionHandler の第一引数、第二引数の内容は下記の通りになります。

  • granted

    • 一つ以上のオプションが許可されたかどうかの Boolean。オプションについては こちら を参照してください。
  • error

    • エラー情報を含むオブジェクト。

また、アプリがフォアグランド状態にある時もバックグランド時と同じように通知を表示させたいので AppDelegate で下記のようにコードを付け加えます。ちなみに、イベントを受け取るために UNUserNotificationCenter.current().delegate = self の設定は必要なので、起動時などに適所設定しましょう。

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.badge, .sound, .alert])
    }
}

次に、ローカルプッシュを送信するためのコードを書いていきます。下記がメソッドが呼ばれてから 5秒後 に通知を送信するサンプルコードです。

func sendNotificationAfterFiveSeconds() {
        let content = UNMutableNotificationContent()
        content.title = "これはタイトルです"
        content.body = "これはボディです"
        content.sound = UNNotificationSound.default

        let request = UNNotificationRequest(identifier: "fiveSeconds", content: content, trigger: UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false))
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
    }

UNMutableNotificationContent は、通知のタイトルやメッセージ、サウンドなどのコンテンツを設定するためのクラスです。ちなみに、userInfo などの通知のカスタム情報などもこのクラスで設定します。詳しくは下記を参照してみてください。

developer.apple.com

UNNotificationRequest では、その名の通り通知のリクエストを作成します。引数の identifier には通知の一意の識別子を、content には前述した通知のコンテンツを、trigger には通知を送信するトリガーをそれぞれ設定します。

トリガーには、主に下記の4つの種類がありますが、最後の UNPushNotificationTrigger はリモートプッシュ通知が送信される際にシステムによってインスタンスが生成されるので、ローカルで通知を送信する際は上3つがトリガーになります。また、即時通知を送信したい場合は trigger 引数を nill に設定します。

今回の場合だと、UNTimeIntervalNotificationTrigger を使用して 5秒後 に通知を送信できるようにしています。その他にも UNCalendarNotificationTrigger を使用すればイベントの予定日に通知を送ったり、UNLocationNotificationTrigger を使用することで特定の場所に到着した時に通知を送るなんてこともできます。

ちなみに、UNUserNotificationCenter.current().add で設定してリクエストで、既にスケジュールされている identifier があるものはスケジュールが上書きされます。

という感じで今日は以上になります🦅

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com