プッシュ通知は、アプリが閉じられていても、サーバーがモバイルデバイスに送信するメッセージです。Google Firebase、2024によると、プッシュ通知は専門サービス—AndroidではFCM、iOSではAPNS—を通じて処理され、同時に数百万のデバイスへのリアルタイム配信をサポートします。現代のモバイルアプリにおいて、ユーザー体験の不可欠の一部となっています。
まとめ
プッシュ通知とは、アプリサーバーがユーザーの明示的なリクエストなしにデバイスに送信する短いメッセージです。バナー、アイコンバッジ、または音声で表示され、ユーザーの注目をアプリに向け、重要なイベントを通知します。
プッシュ通知は、タイトル、メッセージ本文、およびオプションのペイロードデータで構成されます。SMSとは異なり、プッシュ通知はユーザーに無料で、クラウドサービスインフラ—AndroidではFCM、iOSではAPNS—を通じて配信されます。プッシュ通知の主な目的は、エンゲージメントの向上、イベントの通知、ならびにユーザーをアプリに戻すことです。
使用統計によると、適切に設定されたプッシュ通知は、アプリのリテンションを30–60%向上させます。しかし、通知頻度が過剰になると、ユーザーの60%以上が通知を無効にすることになります。
プッシュシステムは3つのコンポーネントで構成されます:アプリサーバー、プラットフォームサービス(FCM/APNS)、およびデバイス上のクライアントアプリケーション。サーバーがプラットフォームサービスにリクエストを送り、サービスがOSとの持続接続を通じてターゲットデバイスに通知を配信します。
プッシュ通知の配信メカニズムは、デバイスとプラットフォームサービスの間の持続接続に基づいています。OSは暗号化されたコミュニケーションチャネルを維持し、すべてのプッシュメッセージがこのチャネルを通ります。
初回起動時に、アプリが通知送信の許可をリクエストし、FCMまたはAPNSから固有のデバイストークンを取得します。このトークンは最大4KBの文字列で、アプリインスタンスを固有に識別します。アプリを再インストールするか、デバイスをバックアップから復元すると、トークンは変更されます。
class FirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
showNotification(message.notification)
}
}
アプリサーバーがFCM APIまたはAPNS APIにHTTPリクエストを送信し、ターゲットトークン、タイトル、本文、追加データを指定します。プラットフォームサービスは、配信ステータス(成功、無効なトークン、レート制限超過)を返します。
fetch("https://fcm.googleapis.com/fcm/send", {
method: "POST",
headers: {
"Authorization": "key=AIzaSy...",
"Content-Type": "application/json"
},
body: JSON.stringify({
to: "device_token_here",
notification: {
title: "新しいメッセージ",
body: "新しい通知があります!"
}
})
})
FCMとAPNSの選択は、ターゲットプラットフォームに依存します。FCMはAndroidとiOSをサポートし、APNSはAppleエコシステムのみをサポートします。クロスプラットフォームのモバイルアプリ開発に重要な主な違いを検討しましょう。
FCMはGoogleのサービスで、Google Play Services上で動作します。自動表示される通知と、アプリが自己処理するデータ通知の2つの配信スキームをサポートしています。FCMは無料で、送信できるメッセージ数に制限はありません。
APNSはAppleのサービスで、最大10MBのマルチメディア添付(画像、動画、音声)をサポートしています。APNSを通じた送信には、TLS証明書または認証キーが必要です。APNSは、単一デバイスへの送信頻度を制限しており、分間のメッセージ数が150を超えるとレート制限が動作します。
| 特徴 | FCM | APNS |
|---|---|---|
| プラットフォーム | Android, iOS, Web | iOS, macOS, watchOS |
| 要件 | Google Play Services | Apple Developer Program |
| メディア | 最大4KB (データ) | 最大10MB (添付) |
| 優先度 | 標準/高 | 即時/省電 |
| 費用 | 無料 | 無料 (アカウント必要) |
プッシュ通知は、表示方法と目的によって分類されます。タイプを理解することで、各ユーザーインタラクションシナリオに対して適切な策略を選ぶことができます。
最も一般的なタイプ—表示される通知で、タイトルと本文を含みます。OSが自動的にノーティフィケーションシェード、ロック画面、バナーに表示します。開発者は音、バイブレーション、アイコンバッジ、および直接アクション(返信、開く、非表示)用のアクションボタンを設定できます。
データ通知は、視覚的な表示なしにペイロードだけを含みます。アプリがバックグラウンドで処理し、データを同期し、キャッシュを更新し、ダウンロードを開始します。Androidではデータ通知は確実に配信されますが、iOSではアプリがアクティブなときか、background fetchを通じてのみ配信されます。
現代のモバイルOSは、画像、GIF、動画、音声を含むリッチおよびメディア通知をサポートしています。iOSではUNNotificationAttachmentを通じて実装され、AndroidではBigPictureStyleとInboxStyleを通じてシステムシェードの通知表示をカスタマイズできます。
サイレント通知は ユーザーに表示されず、バックグラウンド同期に使用されます。iOSでは、アプリを開く前のデータ更新などのタスクに高い優先度を持ちます。Androidでは、最低優先度のデータ通知として処理されます。
プッシュ通知の設定には、インフラ、サーバー、クライアントコードのレベルでの作業が必要です。クロスプラットフォームのモバイルプロジェクトでの典型的なプロセスを見ていきましょう。
Androidでは、Firebase Consoleでプロジェクトを作成し、google-services.jsonをプロジェクトに追加し、FirebaseMessagingServiceを構成する必要があります。デバイストークンは、FirebaseInstanceIdまたはFirebaseMessaging.getInstance().tokenを通じて取得し、初回起動時または変更時にAPIを通じてサーバーに送信されます。
iOSでは、Apple Developer Programへの加入、Developer PortalでのPush証明書またはAPNSキーの作成、XcodeでのPush Notifications機能の有効化が必要です。通知登録はUIApplication.shared.registerForRemoteNotificationsを通じて行い、AppDelegateでdeviceTokenを受け取ります。
import UIKit
import UserNotifications
@main
class AppDelegate: UIResponder,
UIApplicationDelegate {
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
let token = deviceToken
.map { String.format("%02x", $0) }
.joined()
// サーバーにトークンを送信する
}
}
サーバーサイドでは、プッシュ通知はREST APIまたはAdmin SDKを通じて送信されます。FCMはFirebase Admin SDK(Node.js、Java、Python、Go対応)を使用し、APNSはpisherライブラリ(Javaはpushy、Node.jsはapn2)を使用します。トークンは最終更新日時のタイムスタンプとともにデータベースに保存することをおすすめします。
プッシュ通知のセキュリティは機密データが通過する可能性があるため、重要です。両プラットフォームとも基本的な保護機構を提供していますが、開発者はこれらを正しく使用する必要があります。
プッシュ通知のペイロードには、ユーザーの個人データ(名前、取引金額、メッセージリンク)が含まれることがあります。FCM/APNSとデバイスの間の通信チャネルが暗号化されていても、第三者のソフトウェアが通知をインターセプトすると、アプリレベルでデータが盗取される可能性があります。サーバー上でAES-256を使用して機密度の高いペイロードを暗号化し、iOSではKeychain、AndroidではEncryptedSharedPreferencesに保存された鍵を使用してデバイス上で暗号を解出することをおすすめします。
デバイストークンはセッション識別子であり、デバイスがハッキングされたり、トラフィックが盗取されたりすると悪用される可能性があります。アプリサーバーは送信前にトークンを検証する必要があります:データベースで確認し、非アクティブなトークンをトラックし、InvalidTokenエラーが纚る場合は削除します。FCMとAPNSは無効なトークンにInvalidRegistrationステータスを返します—これを無視しないでください。
頻度制御がなければ、プッシュ通知はユーザーをイライラさせ、リテンションを低下させるスパムツールになりかねません。サーバー上で制限を設定しましょう:単一ユーザーに対して時間当1回以上の通知を送らない、同じメッセージを少なくとも回以上送らない。取引通知(注文確認、パスワード変更)の場合は、重要な情報を含むため、制限を高めに設定できます—時間当たり回まで。攻撃者がサーバーを通じてマス通知を配信できないように、API送信レベルでレート制限を使用します。
よくある質問
はい、できますが、AndroidでAPNSへの直接接続はサポートされていません—Google Play Servicesのないデバイスは、Huawei Mobile Services (HMS)やカスタムWebSocket接続などの代替手段を使用します。ただし、FCMは無料で信頼性が高いため、多くのアプリで標準となっています。
FCMとAPNSは、最終通知をそれぞれのサーバーに保存し、接続が復旧した時に配信します。各デバイスは、各アプリからの最終通知のみを保存するため、長時間ネットワークが無い場合、中間のメッセージは失われます。
最もよくある原因は、Push証明書の期限切れ (1年有効)、無効なデバイストークン、設定で通知が無効になっている、または省電モードが有効になっていることです。Apple Developer Consoleで証明書を確認し、アプリがUNUserNotificationCenterを通じて許可をリクエストしていることを確認してください。
Androidでは、Intentを通じた開続トラッキングとともにNotificationCompat.BuilderでPendingIntentを使用します。iOSでは、UNUserNotificationCenterDelegate.userNotificationCenter(_:didReceive:withCompletionHandler:)メソッドを使用します。FCMは、送信された各通知の配信と開続に関するレポートを提供しています。
少しだけです—プッシュ通知は常時接続を維持しません。OSは全アプリで共通のシステムチャネルを使用するため、総電力消費が最小限に抑えられます。頻繁な送信(5分おき)は、デバイスをスリープモードから起動するため、より多くの電力を消費します。iOSのサイレント通知は、受信データを処理するためにアプリがバックグラウンドで起動するため、より多くのバッテリーを消費します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。