Swiftでプッシュ通知を実装するたった12のステップ

Swiftでプッシュ通知を実装する記事のサムネイルSwift
この記事は約29分で読めます。

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

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

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

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

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

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

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

はじめに

プッシュ通知はアプリケーションにおいて非常に重要な要素の一つです。

ユーザーエンゲージメントを高め、特定の情報やアップデートをリアルタイムで伝える方法として、多くのアプリケーションがプッシュ通知を採用しています。

この記事では、iOSアプリケーション開発言語であるSwiftを使用して、プッシュ通知の実装方法を徹底解説します。

初心者から上級者まで、誰もが理解できるように基本的なステップから応用例、カスタマイズ方法、そして注意点まで網羅しています。

●Swiftとプッシュ通知の基本概念

プッシュ通知の実装には多くのステップがあり、それぞれのステップで何をするのか、どのように設定するのかを理解することが重要です。

そこで、まずは基本的な概念について解説します。

○Swiftとは

SwiftはAppleが開発したプログラミング言語であり、iOS、macOSなどのApple製デバイスで動作するアプリケーションを開発する際に使用されます。

Swiftはその性能の高さと安全性、そして直感的な構文が評価されており、多くの開発者が採用しています。

○プッシュ通知とは

プッシュ通知は、アプリケーションからユーザーに対して送られる短いメッセージや通知です。

プッシュ通知はアプリがバックグラウンドにある場合や、端末がロックされている状態でも表示されるため、ユーザーエンゲージメントを高める効果があります。

一般的には、新しいメッセージやアップデート情報、特別なオファーなど、ユーザーにとって重要かつタイムリーな情報を伝えるために使用されます。

●プッシュ通知の基本的な流れ

プッシュ通知は、モバイルアプリに新しい情報やアップデートを即時に送信する手法です。具体的な流れは次の通りです。

  1. アプリを起動:ユーザーがアプリを開きます。
  2. 通知の許可:アプリがユーザーにプッシュ通知の許可を求めます。
  3. デバイストークンの取得:許可が得られたら、システムはデバイストークンを生成します。
  4. トークンの保存:生成されたトークンはサーバーに送信され、保存されます。
  5. 通知の送信:適切なタイミングでサーバーがトークンを使用して通知を送ります。
  6. 通知の受信:ユーザーのデバイスが通知を受信します。
  7. 通知の表示:通知はユーザーのデバイス上で表示されます。
  8. ユーザーの反応:ユーザーが通知をタップすると、指定されたアクションが実行されます。

●環境設定:XcodeとFirebase

Swiftでプッシュ通知を実装する際には、まずXcodeとFirebaseの環境設定が必要です。

これらのツールを適切に設定することで、後のプッシュ通知の実装がスムーズに進みます。

○Xcodeの設定

□プロジェクトの作成

Xcodeを開いて新しいプロジェクトを作成します。プロジェクト名、保存場所などは適当に設定できます。

□パッケージの追加

XcodeではCocoaPodsやSwift Package Managerなどを用いて、外部ライブラリを簡単にインポートできます。

プッシュ通知には通常FirebaseのSDKが必要なので、これをプロジェクトに追加しましょう。

このコードではCocoaPodsを使ってFirebaseをプロジェクトに追加する手法を表しています。

この例ではPodfileを編集してFirebaseをインストールしています。

// Podfile
platform :ios, '12.0'
target 'YourProjectName' do
  use_frameworks!
  pod 'Firebase/Messaging'
end

ターミナルを開いて、pod installを実行します。

この設定により、FirebaseのMessagingライブラリがプロジェクトに追加されます。

○Firebaseの設定

□Firebaseプロジェクトの作成

Firebaseのウェブサイトにアクセスして新しいプロジェクトを作成します。

プロジェクト名や地域、その他の設定は適当に行えます。

□設定ファイルのダウンロード

Firebaseプロジェクトが作成されたら、設定ファイルGoogleService-Info.plistをダウンロードします。

このファイルをXcodeプロジェクトのルートディレクトリに追加してください。

設定ファイルを追加したら、アプリを一度ビルドしてみてください。これでFirebaseとの連携が完了します。

●実装のステップ

プッシュ通知をSwiftで実装するには、多くのステップが必要です。

しかし、それぞれのステップは単体で考えるとさほど複雑ではありません。順を追って説明していきます。

○サンプルコード1:AppDelegateの設定

まず最初に行うのは、AppDelegateの設定です。

AppDelegateは、アプリケーション全体の起動や終了、バックグラウンド遷移などを管理するクラスです。

import UIKit
import UserNotifications

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        UNUserNotificationCenter.current().delegate = self
        return true
    }
}

このコードではUNUserNotificationCenterを使って、プッシュ通知の設定をAppDelegateに紐づけています。

この例では、アプリが起動した際にUNUserNotificationCenter.current().delegateselfを設定して、プッシュ通知の挙動をこのクラスで制御するようにしています。

このコードを実行した結果、アプリケーションが起動したときに、プッシュ通知の挙動がAppDelegateクラスに委譲されるようになります。

○サンプルコード2:プッシュ通知の許可を求める

次に、ユーザーにプッシュ通知の許可を求める必要があります。

下記のコードを使用して、許可ダイアログを表示することができます。

import UserNotifications

func requestNotificationAuthorization() {
    let authOptions = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in
        print("Permission granted: \(granted)")
    }
}

requestNotificationAuthorization()

このコードではUNAuthorizationOptionsを使って、どの種類の通知(バッジ、サウンド、アラート)を許可するかを指定しています。

そして、UNUserNotificationCenter.current().requestAuthorizationで実際に許可を求めています。

このコードを実行すると、ユーザーには通知の許可を求めるダイアログが表示され、許可がされたかどうかがコンソールに出力されます。

○サンプルコード3: デバイストークンの取得

Swiftでプッシュ通知を実装する際には、デバイスごとに固有のトークンを取得する必要があります。

このトークンは、サーバーが特定のデバイスに対して通知を送るために必要な識別子となります。

ここでは、そのデバイストークンを取得するためのSwiftのサンプルコードと、その説明をします。

このコードではUIApplicationDelegateプロトコルに従ってdidRegisterForRemoteNotificationsWithDeviceTokenメソッドをオーバーライドしてデバイストークンを取得します。

この例では、取得したデバイストークンをコンソールに表示しています。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  // その他のメソッド

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print("デバイストークン: \(token)")
  }

  // その他のメソッド

}

このコードでは、didRegisterForRemoteNotificationsWithDeviceTokenメソッド内でData型のdeviceTokenを受け取り、それを文字列に変換しています。

変換したトークンは、print関数でコンソールに表示されます。

このコードを実行すると、アプリがプッシュ通知を受け取るための許可を得られた場合、コンソールにデバイストークンが表示されます。

このトークンを使って、サーバーからこの特定のデバイスに通知を送ることができます。

○サンプルコード4:Firebaseと連携

Firebaseとの連携は、プッシュ通知を効率よく管理するために重要です。

Firebaseは多くのモバイルプラットフォームに対応しており、プッシュ通知の送信やユーザー行動のトラッキングなど、多様な機能を提供しています。

SwiftでFirebaseを使ってプッシュ通知を設定する方法について解説します。

□FirebaseのSDKをプロジェクトにインストール

まず、FirebaseのSDKをプロジェクトにインストールする必要があります。

CocoaPodsを使って簡単にインストールできます。

Podfileに次のように記述します。

pod 'Firebase/Core'
pod 'Firebase/Messaging'

このコードではFirebaseの基本機能とメッセージング機能を使えるようにするためのライブラリを追加しています。

次に、ターミナルでpod installコマンドを実行します。

□AppDelegate.swiftにFirebaseを初期化

Firebaseを使用するには、アプリが起動した際にFirebaseを初期化する必要があります。

AppDelegate.swiftファイルに次のコードを追加してください。

import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

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

    FirebaseApp.configure()
    return true
  }
}

このコードではFirebaseApp.configure()メソッドを使ってFirebaseを初期化しています。

この例ではAppDelegatedidFinishLaunchingWithOptionsメソッド内で初期化しています。

□デバイストークンをFirebaseに登録

Firebaseと連携するためには、取得したデバイストークンをFirebaseに送信する必要があります。

下記のコードをAppDelegate.swiftに追加してください。

import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken
  }
}

このコードではdidRegisterForRemoteNotificationsWithDeviceTokenメソッドを使って、デバイストークンをFirebaseのMessagingクラスのapnsTokenプロパティに設定しています。

○サンプルコード5: 通知の受信と表示

Swiftでプッシュ通知を実装する際、通知がデバイスに届いたときに表示する設定は非常に重要です。

ここでは、UNUserNotificationCenterを使用して通知を受け取り、画面に表示する方法を紹介します。

import UserNotifications

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    let content = UNMutableNotificationContent()
    content.title = userInfo["title"] as? String ?? "デフォルトのタイトル"
    content.body = userInfo["body"] as? String ?? "デフォルトの本文"

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

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

このコードではUNUserNotificationCenterを使って通知を受け取り、画面に表示しています。

この例では、通知内容(タイトルと本文)をuserInfoから取得しています。

このコードでは、通知がデバイスに届くと、指定したtitlebodyに基づいて通知が表示されます。

例えば、userInfo{"title": "こんにちは", "body": "お知らせです"}が含まれていた場合、その内容で通知が生成されます。

○サンプルコード6:通知のアクションを設定

通知が単に表示されるだけでなく、ユーザがその通知に対して何らかのアクションを取れるようにすることもあります。

たとえば、「開く」や「無視」などのボタンを設置できます。

import UserNotifications

func setNotificationActions() {
    let openAction = UNNotificationAction(identifier: "open", title: "開く", options: [.foreground])
    let ignoreAction = UNNotificationAction(identifier: "ignore", title: "無視", options: [.destructive])

    let category = UNNotificationCategory(identifier: "actionCategory", actions: [openAction, ignoreAction], intentIdentifiers: [], options: [])
    UNUserNotificationCenter.current().setNotificationCategories([category])
}

このコードではUNNotificationActionを使って通知にアクションを設定しています。

この例では「開く」ボタンと「無視」ボタンを通知に追加しています。

このコードでは、通知が表示された際、ユーザは「開く」または「無視」のボタンを選択できます。

それぞれのボタンが押された場合の動作は、UNNotificationActionoptionsで設定できます。

●応用例とサンプルコード

このセクションでは、Swiftでプッシュ通知をさらに高度に利用するための応用例とそれに対応するサンプルコードを取り上げます。

具体的には、通知に画像を含む方法、通知に反応して何かを実行する方法、そしてリモートから通知を送る方法について説明します。

○サンプルコード7:画像を含む通知

このコードでは、UNNotificationServiceExtensionを用いて通知に画像を含める方法を紹介します。

この例では、通知が表示される際に添付される画像をダウンロードしています。

// NotificationService.swift
import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            // リモートURLから画像をダウンロードするコード
            // 省略

            contentHandler(bestAttemptContent)
        }
    }
}

このコードを適用すると、通知が来たときに添付画像も一緒に表示されます。

○サンプルコード8:通知に反応して何かをする

このコードでは、通知がタップされたときに特定の処理を行う方法を表しています。

具体的には、UNNotificationResponseを使ってユーザーのアクションに応じて処理を分岐しています。

// AppDelegate.swift
import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        let actionIdentifier = response.actionIdentifier
        if actionIdentifier == "action1" {
            // action1が選択された場合の処理
        } else if actionIdentifier == "action2" {
            // action2が選択された場合の処理
        }

        completionHandler()
    }
}

このコードが動作すると、通知をタップした際に指定した処理が実行されます。

○サンプルコード9:リモートから通知を送る

このコードでは、Firebase Cloud Messaging (FCM) を用いてリモートから通知を送信する例を示しています。

Firebase Consoleから手動で通知を送る場合や、サーバーサイドからAPIを用いて送る場合などに適用可能です。

// AppDelegate.swift
import Firebase
import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

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

    // FCMトークン取得時の処理
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("FCM token: \(fcmToken ?? "")")
    }
}

このコードを実装すると、Firebaseから送信された通知が正確にアプリに配信されます。

通知の内容やタイトル、サブタイトルはFirebase Consoleから簡単に設定できます。

○サンプルコード10:ローカルでスケジュール通知

通知をスケジュールすることで、特定の時間や条件に基づいてユーザーに通知を送ることができます。

SwiftではUNNotificationRequestを使って簡単にこれを実装できます。

import UserNotifications

func scheduleLocalNotification() {
    // 通知の内容を設定
    let content = UNMutableNotificationContent()
    content.title = "スケジュール通知"
    content.body = "これはスケジュールされた通知です。"

    // 5秒後に通知を送るタイミングを設定
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

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

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

このコードではUNNotificationRequestを使ってローカルで通知をスケジュールするコードを表しています。

この例では、タイトルと本文を設定した後、5秒後に通知が届くようにUNTimeIntervalNotificationTriggerを使用しています。

このコードで、通知が5秒後に正常に表示されるはずです。

○サンプルコード11: カスタムサウンド

通知にカスタムサウンドを設定することも可能です。

プロジェクト内にサウンドファイル(.mp3.wav)を追加して、そのファイル名を指定するだけです。

import UserNotifications

func customSoundNotification() {
    let content = UNMutableNotificationContent()
    content.title = "カスタムサウンド通知"
    content.body = "これはカスタムサウンド付きの通知です。"
    content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "customSound.mp3"))

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

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

このコードではUNNotificationSoundを使ってカスタムサウンドを設定しています。

この例では、”customSound.mp3″という名前の音声ファイルを5秒後に再生する通知をスケジュールしています。

このコードで、通知が来た際に、指定した”customSound.mp3″が再生されるはずです。

○サンプルコード12:通知の優先度とカテゴリを設定

通知の優先度やカテゴリを設定することで、通知の表示形式やアクションをカスタマイズできます。

import UserNotifications

func priorityAndCategoryNotification() {
    let content = UNMutableNotificationContent()
    content.title = "重要な通知"
    content.body = "これは高優先度の通知です。"
    content.categoryIdentifier = "highPriority"

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

    // カテゴリを作成
    let highPriorityCategory = UNNotificationCategory(identifier: "highPriority", actions: [], intentIdentifiers: [], options: .customDismissAction)
    UNUserNotificationCenter.current().setNotificationCategories([highPriorityCategory])

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

このコードではcategoryIdentifierを使って通知のカテゴリを設定しています。

また、UNNotificationCategoryを使って高優先度の通知を作成しています。

この例では、5秒後に高優先度の通知が表示されるようにスケジュールしています。

このコードで、通知が表示された際に、指定したカテゴリの設定に基づいて、特定のアクションや表示形式で通知が届くはずです。

●注意点と対処法

Swiftでプッシュ通知を実装する際には、いくつかの注意点と対処法が存在します。

これらについて詳しく見ていきましょう。

○デバッグとトラブルシューティング

プッシュ通知が正常に動作しない場合、最初に確認すべきはデバッグとトラブルシューティングです。

□ログの確認

プログラムの挙動を理解するためには、コンソールのログを確認することが非常に重要です。

エラーメッセージや警告が出ている場合、それが解決の手がかりになります。

import UIKit

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to register for remote notifications: \(error)")
}

このコードではdidFailToRegisterForRemoteNotificationsWithErrorメソッドを使ってプッシュ通知の登録に失敗した際のエラーをコンソールに出力します。

この例では、エラーメッセージをprint関数で出力しています。

このコードを実行すると、プッシュ通知の登録に失敗した場合に、その理由がコンソールに表示されます。

○セキュリティ対策

プッシュ通知を安全に運用するためにはいくつかのセキュリティ対策が必要です。

□HTTPSの使用

通知を送る際には、必ずHTTPSを使用してデータを暗号化するようにしてください。

import Alamofire

func sendNotification() {
    let headers: HTTPHeaders = [
        "Authorization": "your_server_key_here",
        "Content-Type": "application/json"
    ]

    let parameters: [String: Any] = [
        "to": "device_token_here",
        "notification": [
            "title": "Test Title",
            "body": "Test Body"
        ]
    ]

    Alamofire.request("https://fcm.googleapis.com/fcm/send", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { response in
        // handle the response
    }
}

このコードではAlamofireライブラリを用いて、HTTPSを通じてFirebase Cloud Messagingに通知を送っています。

この例では、Authorizationヘッダーにサーバーキーを、toにデバイストークンを設定しています。

このコードを実行すると、HTTPSを通じてセキュアな通信でプッシュ通知が送信されます。

●詳細なカスタマイズ方法

プッシュ通知の基本的な使い方がわかったところで、次に進んで詳細なカスタマイズ方法について解説します。

ここでは、通知のスタイルとレイアウトをカスタマイズする方法から、動的に通知内容を変更する手法まで、Swiftでのプッシュ通知の高度な応用例について紹介します。

○通知のスタイルとレイアウト

通知が届いたときの表示スタイルやレイアウトは、iOSのUNNotificationRequestUNNotificationContentを用いて制御できます。

下記のサンプルコードでは、UNMutableNotificationContentクラスを使って、タイトル、サブタイトル、本文、添付画像を設定しています。

import UserNotifications

let content = UNMutableNotificationContent()
content.title = "お知らせ"
content.subtitle = "新機能追加"
content.body = "アプリに新機能が追加されました。是非チェックしてみてください。"
if let url = Bundle.main.url(forResource: "image", withExtension: "png"), 
   let attachment = try? UNNotificationAttachment(identifier: "image", url: url, options: nil) {
    content.attachments = [attachment]
}

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

このコードではUNMutableNotificationContentを使って通知の内容を設定しています。

この例では、タイトル、サブタイトル、本文、そして画像添付をしています。

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

○動的に通知を変更する

通知の内容は後から動的に変更することも可能です。

これは主にリモート通知を受け取った際に、その内容に基づいてローカル通知を生成するケースで役立ちます。

ここでは、Firebaseから受け取ったデータを元に通知を作成するサンプルコードを紹介します。

import FirebaseMessaging

Messaging.messaging().remoteMessageDelegate = self

func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
    let content = UNMutableNotificationContent()
    if let title = remoteMessage.appData["title"] as? String {
        content.title = title
    }
    if let body = remoteMessage.appData["body"] as? String {
        content.body = body
    }

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
    let request = UNNotificationRequest(identifier: "dynamic-notification", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

このコードでは、Firebaseから受け取ったremoteMessage.appDataを解析し、その内容でUNMutableNotificationContentを設定しています。

このようにして動的な通知内容を生成することができます。

このコードを実行すると、Firebaseから受け取ったデータに基づいて通知が表示されます。

まとめ

この記事では、Swiftでプッシュ通知を実装する際の詳細なカスタマイズ方法について説明しました。

通知のスタイルとレイアウトを調整する方法から、動的に通知を変更する技術まで、多岐にわたる内容を網羅しました。

サンプルコードを用いて各ステップを詳しく解説し、その実行結果についても言及しました。

応用例として、画像を含む通知や通知に反応して何かをする設定、リモートから通知を送る方法なども紹介しました。

さらに、注意点としてデバッグとトラブルシューティング、セキュリティ対策についても触れました。

これらの情報を組み合わせることで、Swiftを使ったプッシュ通知の実装は非常に柔軟かつ高機能になります。

特に、詳細なカスタマイズが可能な点は、多くのアプリケーションでプッシュ通知をより効果的に利用するために不可欠です。

この記事がSwiftでプッシュ通知を実装する際の参考になれば幸いです。