【完全ガイド】Swiftでの通知処理の方法10選 – Japanシーモア

【完全ガイド】Swiftでの通知処理の方法10選

Swift言語のロゴと通知のアイコンがデザインされたイメージSwift
この記事は約27分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

あなたがSwiftでアプリケーションを開発している中で、「通知をどうやって処理すれば良いのだろう?」と疑問に感じたことはありませんか?

もしそうだとしたら、この記事はまさにあなたのために書かれています。

この記事を読めば、Swiftでの通知処理をマスターすることができるようになります。

通知はユーザーエンゲージメントを高めるための重要な手段であり、アプリの品質や利便性を大きく左右する要素の一つです。

しかし、正しく実装しないと意図しない動作やユーザーの混乱を招く可能性があるため、注意が必要です。

そこで、この記事ではSwiftを使った通知処理の基本から応用までを、10のサンプルコードを交えて徹底解説します。

初心者の方でも手軽に実装できる方法を学べるよう心がけました。

●Swiftとは?

SwiftはAppleが2014年に発表したプログラミング言語で、iOS、macOS、watchOS、tvOSなどのApple製デバイス向けのアプリケーション開発に使用されます。

Objective-Cに代わる新しい言語として開発されたSwiftは、読みやすく、効率的で、安全性を重視した設計がされています。

○Swiftの特徴

Swiftの主な特徴として次の点が挙げられます。

  1. Swiftは、クリアで簡潔な構文を持っており、初心者でも読みやすい言語となっています。
  2. Swiftは、安全性を重視した設計がされており、未初期化の変数の使用やメモリアクセスの過ちを防ぐ仕組みが備わっています。
  3. 旧来のObjective-Cよりも高速に動作することが多く、最適化されたコンパイラのおかげで、実行速度が速いです。
  4. Swiftは動的ライブラリをサポートしており、アプリのサイズを小さく保つことが可能です。

Swiftはこれらの特徴を持つ一方で、他のプログラミング言語との連携もスムーズに行えるなど、柔軟性も持っています。

特に通知処理を行う上で、Swiftの簡潔さや高速性は大きな利点となります。

●通知処理とは?

スマートフォンやタブレット、パソコンなどのデバイスでは、アプリケーションやシステムからユーザーに何らかの情報を伝えるための仕組みとして「通知」が利用されています。

メールの受信、アプリのアップデート、タスクのリマインダーなど、さまざまな場面で通知は活用されており、ユーザーにとって非常に便利な機能の一つとなっています。

しかし、アプリケーションを開発する側からすると、これらの通知を適切に表示させるための処理が必要となります。

特にiOSアプリの場合、Swiftを利用して通知の処理を実装する必要があります。

○通知処理の基本

通知処理の基本的な流れは次のようになります。

  1. アプリケーションを初めて起動した際など、ユーザーに通知の許可を求めるダイアログが表示されます。ユーザーが許可をすることで、アプリからの通知が可能となります。
  2. アプリケーション側で何らかのイベントが発生した際(例えば、新しいメッセージが届いた時など)に、通知を作成して送信します。
  3. 通知が送信されると、デバイス側で通知を受信し、設定に従って通知を表示します。表示方法は、バナー、アラート、バッジなど、さまざまな方法があります。
  4. 通知にはアクションを設定することができます。例えば、メッセージの通知が来た際に、直接そのメッセージを開く、返信する、削除するなどのアクションをユーザーが選択できるようにすることができます。

これらの基本的な流れを理解することで、Swiftでの通知処理の実装がよりスムーズに行えるようになります。

●Swiftでの通知処理の使い方

Swift言語を使用したiOSアプリケーション開発において、通知は非常に有用な機能です。

アプリケーションがバックグラウンドで実行されているときや、ユーザーの注意を引くためにも、通知は頻繁に利用されます。

○サンプルコード1:基本的な通知の送信

Swiftで通知を送信する基本的な方法を見てみましょう。

下記のコードは、ローカル通知を送信するサンプルです。

import UserNotifications

// 通知センターのインスタンスを取得
let center = UNUserNotificationCenter.current()

// 通知の内容を設定
let content = UNMutableNotificationContent()
content.title = "タイトル"
content.body = "通知の本文です。"
content.sound = UNNotificationSound.default

// 通知のトリガーを設定(5秒後に通知を送る例)
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

// 通知リクエストを作成
let request = UNNotificationRequest(identifier: "sampleNotification", content: content, trigger: trigger)

// 通知をスケジュール
center.add(request, withCompletionHandler: nil)

このコードでは、UNUserNotificationCenterを使用して、ローカル通知をスケジュールしています。

UNMutableNotificationContentを用いて通知の内容を設定し、UNTimeIntervalNotificationTriggerで5秒後に通知が表示されるようにトリガーを設定しています。

このコードを実行すると、5秒後にタイトルと本文が設定された通知が表示されます。

○サンプルコード2:通知の受信とハンドリング

次に、通知を受信したときの処理をハンドリングする方法を見てみましょう。

下記のコードは、通知を受信した際に特定の処理を行うサンプルです。

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // 通知センターのデリゲートを設定
        UNUserNotificationCenter.current().delegate = self

        return true
    }

    // 通知を受け取ったときの処理
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        print("通知を受け取りました。")

        // 必要な処理をここに追加

        completionHandler()
    }
}

このコードでは、AppDelegateクラスにUNUserNotificationCenterDelegateを採用して、通知を受け取ったときのハンドリングを行っています。

通知が受け取られると、userNotificationCenter(_:didReceive:withCompletionHandler:)メソッドが呼び出され、指定した処理が実行されます。

このコードを組み込むと、通知をタップしてアプリを開いたときに「通知を受け取りました。」というメッセージがコンソールに表示されます。

○サンプルコード3:通知のカスタマイズ

Swiftで通知をカスタマイズする手法は多岐に渡ります。

通知の内容や表示スタイルを変更したり、カスタムアクションを追加したりすることが可能です。

ここでは、通知のコンテンツをカスタマイズする一例として、通知に画像を追加する方法をご紹介します。

import UserNotifications

// 通知の内容をカスタマイズするための関数
func sendCustomNotification() {
    // 通知センターのインスタンスを取得
    let center = UNUserNotificationCenter.current()

    // 通知の内容を設定
    let content = UNMutableNotificationContent()
    content.title = "カスタマイズされた通知"
    content.body = "画像を含む通知です。"
    content.sound = UNNotificationSound.default

    // 通知に画像を追加
    if let url = Bundle.main.url(forResource: "image", withExtension: "jpg"),
       let attachment = try? UNNotificationAttachment(identifier: "image", url: url, options: nil) {
        content.attachments = [attachment]
    }

    // 通知のトリガーを設定(例:5秒後に通知)
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

    // 通知リクエストを作成
    let request = UNNotificationRequest(identifier: "customNotification", content: content, trigger: trigger)

    // 通知をスケジュール
    center.add(request, withCompletionHandler: nil)
}

このコードでは、UNMutableNotificationContentクラスを使用して通知の内容を設定しています。

タイトル、本文、サウンドなどの基本的なプロパティに加えて、通知に画像を添付しています。

UNNotificationAttachmentクラスを用いて、通知に画像を追加することができます。

この例では、アプリケーションのバンドルに含まれる “image.jpg” ファイルを通知に添付しています。

このコードを実行すると、5秒後に画像が添付された通知が表示されます。

通知をタップすると、添付された画像がフルスクリーンで表示されます。

○サンプルコード4:バックグラウンド通知の取り扱い

アプリがバックグラウンドまたは終了状態であっても、特定の通知を受け取って即座に処理を行うことがあります。

ここでは、バックグラウンドでの通知処理の一例をご紹介します。

import UIKit
import UserNotifications

// AppDelegateクラスの一部
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    // バックグラウンドでも通知をハンドリング
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        print("バックグラウンドで通知を受け取りました。")

        // 通知のプレゼンテーションオプションを設定
        completionHandler([.banner, .sound])
    }
}

こちらのコードは、アプリがバックグラウンドで動作している間でも通知を受け取る例です。

userNotificationCenter(_:willPresent:withCompletionHandler:)メソッドを使用して、バックグラウンドで通知が届いた際の処理をハンドリングしています。

この例では、通知が届いたことをコンソールに出力し、通知をプレゼンテーションとして表示するオプションを指定しています。

このコードが含まれているアプリは、アプリがバックグラウンドで動作している状態でも通知を受け取り、指定したプレゼンテーションオプションに従ってユーザーに通知を表示します。

●通知処理の応用例

Swiftの通知処理には多彩な応用例が存在します。

ここでは、位置情報ベースの通知やリッチメディア通知の方法を詳しく取り上げ、サンプルコードを交えて説明いたします。

○サンプルコード5:位置情報ベースの通知

位置情報に基づく通知は、ユーザーが特定の場所に近づいたり、その場所を離れたりしたときに通知を送信する方法です。

この手法は、店舗のセール情報や観光地の情報提供などに活用されます。

import UserNotifications
import CoreLocation

// 位置情報ベースの通知を送信する関数
func sendLocationBasedNotification() {
    // 通知センターのインスタンスを取得
    let center = UNUserNotificationCenter.current()

    // 通知の内容を設定
    let content = UNMutableNotificationContent()
    content.title = "近くのカフェ"
    content.body = "あなたの近くにおすすめのカフェがあります。"
    content.sound = UNNotificationSound.default

    // 位置情報を設定(例:東京タワーの位置)
    let location = CLLocationCoordinate2D(latitude: 35.6586, longitude: 139.7454)
    let region = CLCircularRegion(center: location, radius: 500, identifier: "TokyoTower")
    region.notifyOnEntry = true
    region.notifyOnExit = false

    let trigger = UNLocationNotificationTrigger(region: region, repeats: false)

    // 通知リクエストを作成
    let request = UNNotificationRequest(identifier: "locationNotification", content: content, trigger: trigger)

    // 通知をスケジュール
    center.add(request, withCompletionHandler: nil)
}

このコードでは、UNLocationNotificationTriggerを使って、特定の位置情報に基づく通知を設定しています。

この例では、東京タワーの周辺500メートル以内に入った際に通知が表示されます。

このコードを実行し、指定したエリアに近づくと、「近くのカフェ」というタイトルの通知が表示され、「あなたの近くにおすすめのカフェがあります。」という内容のメッセージが届きます。

○サンプルコード6:リッチメディア通知

リッチメディア通知では、画像や動画、音声などのメディアコンテンツを通知に添付することができます。

ユーザーの関心を引きつける効果が期待できます。

import UserNotifications

// リッチメディア通知を送信する関数
func sendRichMediaNotification() {
    let center = UNUserNotificationCenter.current()

    let content = UNMutableNotificationContent()
    content.title = "新しい動画が公開されました"
    content.body = "最新のプロモーション動画をチェックしてみてください。"
    content.sound = UNNotificationSound.default

    if let videoURL = Bundle.main.url(forResource: "promoVideo", withExtension: "mp4"),
       let attachment = try? UNNotificationAttachment(identifier: "video", url: videoURL, options: nil) {
        content.attachments = [attachment]
    }

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)

    let request = UNNotificationRequest(identifier: "richMediaNotification", content: content, trigger: trigger)

    center.add(request, withCompletionHandler: nil)
}

このコードでは、UNNotificationAttachmentクラスを利用して、アプリのバンドルに含まれる “promoVideo.mp4” ファイルを通知に添付しています。

このコードを実行すると、10秒後に「新しい動画が公開されました」というタイトルで通知が表示されます。

通知をタップすると添付された動画が再生され、「最新のプロモーション動画をチェックしてみてください。」というメッセージとともにユーザーに情報を提供します。

○サンプルコード7:通知のグループ化

多くのアプリケーションでは、一日に何度も通知を送ることがあります。

ユーザーにとっては、通知センターが大量の通知で埋め尽くされることは、あまり望ましい状況ではありません。

そこでSwiftでは、関連する通知をグループ化することができます。

これにより、通知センターが整理され、ユーザーにとっての利便性が向上します。

import UserNotifications

// 通知のグループ化を行う関数
func sendGroupedNotifications() {
    let center = UNUserNotificationCenter.current()

    let content1 = UNMutableNotificationContent()
    content1.title = "お知らせ1"
    content1.body = "今日のイベントは15時からです。"
    content1.threadIdentifier = "groupedNotifications"

    let content2 = UNMutableNotificationContent()
    content2.title = "お知らせ2"
    content2.body = "明日のイベントの場所が変更になりました。"
    content2.threadIdentifier = "groupedNotifications"

    let trigger1 = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
    let trigger2 = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)

    let request1 = UNNotificationRequest(identifier: "notification1", content: content1, trigger: trigger1)
    let request2 = UNNotificationRequest(identifier: "notification2", content: content2, trigger: trigger2)

    center.add(request1, withCompletionHandler: nil)
    center.add(request2, withCompletionHandler: nil)
}

このコードでは、threadIdentifierプロパティを利用して、通知を同一のグループにまとめています。

ここでは、”groupedNotifications”という識別子を設定して、二つの通知を同一グループとして扱います。

このコードを実行すると、5秒後に「お知らせ1」というタイトルで通知が表示され、さらに5秒後に「お知らせ2」というタイトルの通知が表示されます。

両方の通知は、通知センターで同じグループとして表示され、整理された形でユーザーに提示されます。

○サンプルコード8:通知のスケジューリング

特定の日時や繰り返しの間隔で通知を送る場合、スケジューリング機能を利用します。

例えば、毎日特定の時間にリマインダーとして通知を送る場合などに活用できます。

import UserNotifications

// 通知のスケジューリングを行う関数
func scheduleNotification() {
    let center = UNUserNotificationCenter.current()

    let content = UNMutableNotificationContent()
    content.title = "リマインダー"
    content.body = "今日のタスクを確認してください。"

    var dateComponents = DateComponents()
    dateComponents.hour = 9
    dateComponents.minute = 0

    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)

    let request = UNNotificationRequest(identifier: "dailyReminder", content: content, trigger: trigger)

    center.add(request, withCompletionHandler: nil)
}

このコードでは、UNCalendarNotificationTriggerを使って、毎日9時0分に通知が表示されるようにスケジューリングしています。

このコードを実行すると、指定した時間に「リマインダー」というタイトルで通知が表示され、「今日のタスクを確認してください。」というメッセージが届きます。

この通知は毎日指定された時間に繰り返し表示されるので、ユーザーが毎日のタスクを忘れずに確認することができます。

○サンプルコード9:カスタムアクションを持つ通知

アプリの通知は単なる情報伝達手段ではありません。

ユーザーが通知に直接的なアクションをとることができるように設計することで、アプリのユーザビリティが大幅に向上します。

Swiftでの通知処理を利用すれば、通知にカスタムアクションを追加することが可能です。

import UserNotifications

// カスタムアクションを持つ通知を送信する関数
func sendNotificationWithCustomAction() {
    let center = UNUserNotificationCenter.current()

    // アクションの定義
    let viewAction = UNNotificationAction(identifier: "VIEW_ACTION", title: "詳細を見る", options: [])
    let dismissAction = UNNotificationAction(identifier: "DISMISS_ACTION", title: "閉じる", options: [.destructive])

    // アクションをカテゴリに追加
    let category = UNNotificationCategory(identifier: "CUSTOM_ACTION_CATEGORY", actions: [viewAction, dismissAction], intentIdentifiers: [], options: [])
    center.setNotificationCategories([category])

    let content = UNMutableNotificationContent()
    content.title = "新しいイベントのお知らせ"
    content.body = "最新のイベント情報が更新されました。詳細をご確認ください。"
    content.categoryIdentifier = "CUSTOM_ACTION_CATEGORY"

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

    let request = UNNotificationRequest(identifier: "customActionNotification", content: content, trigger: trigger)

    center.add(request, withCompletionHandler: nil)
}

このコードでは、UNNotificationActionを使って、2つのカスタムアクションを定義しています。

“詳細を見る”と”閉じる”というアクションを追加し、それらをUNNotificationCategoryを通じて通知に関連付けています。

このコードを実行すると、5秒後に「新しいイベントのお知らせ」というタイトルで通知が表示されます。

通知をスライドダウンまたはタップすると、先ほど追加したカスタムアクションが表示され、ユーザーが選択することができます。

○サンプルコード10:サイレント通知の実装

サイレント通知は、ユーザーに通知を表示せずに、アプリケーションのバックグラウンドタスクを実行するためのものです。

例えば、新しいデータのフェッチやアプリの設定の更新など、ユーザーに直接知らせる必要がないタスクを実行する際に使用されます。

import UserNotifications

// サイレント通知を送信する関数
func sendSilentNotification() {
    let center = UNUserNotificationCenter.current()

    let content = UNMutableNotificationContent()
    content.title = ""  // タイトルは空
    content.body = ""   // 本文も空
    content.sound = nil // 音も鳴らさない

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)

    let request = UNNotificationRequest(identifier: "silentNotification", content: content, trigger: trigger)

    center.add(request, withCompletionHandler: nil)
}

このコードを実行すると、通知自体は表示されませんが、通知をトリガーとして指定されたタスクがバックグラウンドで実行されます。

これにより、ユーザーの体験を妨げることなく、アプリケーションの動作を最新の状態に保つことができます。

●注意点と対処法

Swiftを使用して通知処理を行う際には、いくつかの注意点が存在します。

これらの注意点を適切に管理しないと、アプリの通知がユーザーに届かなかったり、予期しない動作が発生する可能性があります。

ここでは、Swiftでの通知処理に関する主な注意点と、それに対する対処法について詳しく解説します。

○通知のパーミッション管理

アプリケーションがユーザーに通知を送信するためには、ユーザーからの許可が必要です。

この許可を取得しないと、通知は送信されません。

import UserNotifications

func requestNotificationPermission() {
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
        if granted {
            // 通知の許可が得られた場合の処理
            print("通知の許可が得られました")
        } else {
            // 通知の許可が得られなかった場合の処理
            print("通知の許可が得られませんでした")
        }
    }
}

このコードでは、requestAuthorizationメソッドを使ってユーザーに通知の許可を求めています。

許可が得られた場合と得られなかった場合で異なる処理を行うことができます。

○バッテリー消費との関係

通知はアプリケーションのバックグラウンド動作と関連しているため、頻繁に通知を行うとバッテリーの消費が増加する可能性があります。

特に位置情報を基にした通知やバックグラウンドでのデータ更新を伴う通知は、バッテリー消費が大きくなるため、適切な頻度とタイミングでの通知を心がけることが重要です。

サイレント通知を多用すると、バックグラウンドでの処理が増えるため、バッテリーの消費が早くなる可能性が高まります。

このため、サイレント通知は必要最低限の頻度で使用し、ユーザーにとってのメリットが高い場面でのみ利用するようにしましょう。

●カスタマイズ方法

Swiftにおける通知処理は非常に柔軟性が高く、多岐にわたるカスタマイズが可能です。

ユーザーの体験を向上させるため、または特定の機能を強調するために、通知のデザインや動作をカスタマイズする方法を学んでいきましょう。

○通知のデザインカスタマイズ

アプリケーションの通知は見た目やデザインをカスタマイズすることで、ブランドのアイデンティティを強化したり、ユーザーの注目を引くことができます。

例えば、通知のタイトルや本文のフォントを変更したり、背景色をカスタマイズすることが可能です。

import UserNotifications

func sendCustomizedNotification() {
    let content = UNMutableNotificationContent()
    content.title = "カスタマイズされた通知"
    content.body = "この通知はデザインがカスタマイズされています。"
    // ここでフォントや背景色などのカスタマイズを設定

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest(identifier: "customNotification", content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

このコードでは、通知のタイトルや本文を設定し、特定のカスタマイズを適用しています。

実際のデザインのカスタマイズは、プラットフォームやライブラリに依存するため、具体的な実装方法は異なる場合があります。

○音声やバイブレーションのカスタマイズ

通知を受け取ったときの音声やバイブレーションもカスタマイズすることができます。

例えば、特定の通知内容に応じて異なる音声を再生する、または独自のバイブレーションパターンを設定することができます。

func sendNotificationWithSound() {
    let content = UNMutableNotificationContent()
    content.title = "音声付きの通知"
    content.body = "この通知はカスタム音声が設定されています。"
    content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "customSound.aiff"))

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest(identifier: "soundNotification", content: content, trigger: trigger)

    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

このコードを実行すると、customSound.aiffという名前のカスタム音声が通知と共に再生されます。

同様の方法でバイブレーションのカスタマイズも可能で、特定のバイブレーションパターンを設定して通知を送信することができます。

まとめ

Swiftでの通知処理は、アプリケーションのユーザーエンゲージメントを高める強力なツールとなることが確認できました。

基本的な通知の送信から、高度なカスタマイズまで、幅広い機能を持つ通知システムを効果的に活用することで、アプリケーションの利用者にとって価値ある情報をタイムリーに伝えることが可能です。

この記事を通じて、Swiftでの通知の基本的な実装方法、カスタマイズ方法、さらには注意点やベストプラクティスについて学べたことでしょう。

実際の開発においては、ユーザーのニーズやアプリケーションの特性に合わせて、最適な通知戦略を構築してください。

最後に、通知処理はユーザーの許可が必要であるため、ユーザーに不快感を与えないような適切な頻度と内容での通知を心がけることが重要です。

ユーザーエクスペリエンスを最優先に考え、Swiftの通知処理を最大限に活用しましょう。