Swiftで通知の許可とローカル通知を出す方法

目次

概要

SwiftでiOSアプリの開発をしています。アプリにできることのひとつに通知があります。

今回はこの通知を出す方法についてSwiftのコードを紹介しつつ説明します。

環境

  • SwiftUI 2
  • Xcode 13.2

通知を出す方法の検討

iOS/iPadOSのアプリで通知を出す際には、ユーザーが通知を許可している必要があります。デフォルトでは通知の許可はないので、通知を出す前に最初に通知を出してよいかをユーザーに確認する必要があります。

最初は、この通知の確認のためのコードを説明します。

次に、実際に通知を出すコードを紹介します。通知を出す方法として、アプリ自身が通知を出すローカル通知と呼ばれるものと、サーバーから通知を出すように通信を受け取ったら通知を出すものがあります。

通知は、Push通知とも呼ばれますが、後者の通知方法はサーバー側から見てプッシュする通知ということで、その名の通りです。

しかし、サーバーを利用するため少々利用方法が面倒です。そこでここでは、ローカル通知のみを取り扱います。

通知をしてよいかの確認

最初に通知可能かどうかを確認します。

UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in
    if granted {
        // 通知の処理を記述
    } else {
        // 許可がないときの記述
    }
}

これを、通知を指定よいかの確認をしたい部分に書きます。[.alert, .sound, .badge]の部分は通知の出し方に関する部分で、今回は全ての通知方法で通知を出すようにしています。もしも一部の通知方法だけにする場合は、必要なもののみ残します。

何度もこのような確認が出ると利用者にとって邪魔なものとなってしまうので、通知をする直前などに記述するとよいです。

ローカル通知

それでは、実際にローカル通知を出します。

// 通知タイミングを指定(今回は5秒後)
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

// 通知情報の準備
let content = UNMutableNotificationContent()
content.title = "ローカル通知"
content.body = "ローカル通知です"
content.sound = UNNotificationSound.default

// 通知を登録
let request = UNNotificationRequest.init(identifier: "アプリ独自のものを設定", content: content, trigger: trigger)
let center = UNUserNotificationCenter.current()
center.add(request)

この処理は、通知を出したい場所に記述します。

例えば、このように記述する方法があります。

UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge]) { (granted, error) in
    if granted {
        // 通知タイミングを指定(今回は5秒後)
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

        // 通知情報の準備
        let content = UNMutableNotificationContent()
        content.title = "ローカル通知"
        content.body = "ローカル通知です"
        content.sound = UNNotificationSound.default

        // 通知を登録
        let request = UNNotificationRequest.init(identifier: "アプリ独自のものを設定", content: content, trigger: trigger)
        let center = UNUserNotificationCenter.current()
        center.add(request)
    } else {
        // 許可がないときの記述
    }
}

通知の許可があるときに通知を出すというものです。

通知はアプリがバックグラウンドにいるときしかできないため、通知のタイミングを通知の登録後5秒として、このコードを実行してすぐに、ホームボタン等でアプリをバックグラウンドへ移動して、実際に通知がされるかを確認します。もし時間を変える場合はtimeIntervalに遅延させたい時間を秒数として記述します。

UNNotificationRequest.initのidentitifierには、アプリ独自の文字列を設定します。例えば、com.example.sampleappのようなものです。

このようなコードで通知ができました。

さいごに

現在iPhoneやiPadのアプリでは、ブラウザを介した通知を出せません。いわゆるPWAでは通知を出せないということです。つまり、通知を出すにはアプリである必要があると言うことです。

せっかく、アプリ開発をしているのであれば通知を使って便利なアプリを作っていきたいものです。