Notification Permissionとは、アプリがユーザーにプッシュ通知やローカル通知を送信するために必要な権限です。Android 13およびiOS 12以降、アプリはシステムダイアログを介して実行時にこの権限をリクエストする必要があります。Android Developers、2024によると、ユーザーの明示的な同意なしに、アプリはAndroid 13以上のデバイスで通知を表示できません。
重要なポイント
Notification Permissionは、アプリがユーザーに通知を送信する能力を制御するシステム権限です。Android 13以前は、すべてのアプリがリクエストなしで通知を表示できました — マニフェストで権限を宣言するだけで十分でした。しかし、スパムや迷惑な通知の増加に伴い、GoogleはiOSと同様の必須の実行時リクエストを導入しました。
iOSでは、通知権限はiOS 8以降必須であり、iOS 12から仮通知(プロビジョナル通知)が登場しました — 音なしで配信され、明示的なリクエストなしで通知センターに表示されるサイレント通知です。仮通知により、開発者は完全な権限をリクエストする前に、ユーザーに通知の価値を示すことができます。
Localytics(2024)によると、iOSユーザーの61%、Androidユーザーの55%がリクエスト後にプッシュ通知の受け取りに同意します。承認率はリクエストのコンテキストに直接依存します:最初の価値あるインタラクション後に権限を求めるアプリは、初回起動時に求めるアプリよりも40%多くの承認を得ています。
通知権限の進化は、プラットフォームがこの通信チャネルへのアプリのアクセスを段階的に制限してきたかを示しています。この進化を理解することは、開発者が異なるOSバージョンを適切に処理するのに役立ちます。
Android 13(2022)以前は、どのアプリでもユーザーの同意なしに通知を表示できました。Android 8.0(2017)は通知チャネルを導入し、Android 12(2021)は迷惑な通知の自動ブロックを追加し、そしてAndroid 13は実行時にPOST_NOTIFICATIONSをリクエストすることを必須にしました。targetSdkVersionが33未満のアプリの場合、システムは自動的に権限を付与しますが、Google Playは2023年8月以降、targetSdkVersionを33+に更新することを要求しています。
iOS 8(2014)はUIUserNotificationSettingsを介した必須の権限リクエストを導入しました。iOS 10(2016)はリッチ通知をサポートするUNUserNotificationCenterを発表しました。iOS 12(2018)は仮通知とグループ化通知を追加しました。iOS 15(2021)はフォーカスモードを導入し、アプリの権限に関係なく通知をブロックできます。App Tracking Transparency(iOS 14.5)は通知とは関係ありませんが、権限リクエストの全体的な文化にも影響を与えています。
現在、両方のプラットフォームで実行時のNotification Permissionリクエストが必要です。開発者はもはや通知の自動有効化に頼ることはできません。ユーザーはどのアプリが通知を送信できるかを完全に制御できます。Androidの通知チャネルとiOSの通知カテゴリにより、ユーザーは受け取るアラートの種類を細かく調整できます。
AndroidでのNotification Permissionは、マニフェストで宣言されたPOST_NOTIFICATIONS権限を介して有効になり、その後Android 13+の実行時リクエストが続きます。
Android 13+の場合、AndroidManifest.xmlでPOST_NOTIFICATIONS権限を宣言する必要があります。Android 12以下との下位互換性のため、権限はシステムによって自動的に付与されます — 追加の操作は必要ありません。
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
POST_NOTIFICATIONS権限のリクエストはActivity Result APIを介して実行されます。SDKバージョンを確認することが重要です:Android 12以下では、リクエストは不要です — 権限は自動的に付与されたとみなされます。
private val notificationPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
createNotificationChannel()
showPushNotification()
} else {
logPermissionDenied()
}
}
fun requestNotificationAccess() {
if (Build.version.SDK_INT <= Build.VERSION_CODES.S_V2) {
// Android 12以下 — 権限は自動的に付与されます
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
Android 8.0+では、アプリは最初の通知を送信する前にNotificationChannelを介して通知チャネルを作成する必要があります。チャネルにはIMPORTANCE_NONEからIMPORTANCE_HIGHまでの重要度レベルがあり、通知が音とバナーで表示されるかどうかを決定します。ユーザーがアプリの通知を無効にしている場合、設定で再び有効にされるまで新しいチャネルは効果がありません。メッセージ、広告、システムイベントなど、異なる種類のアラートに対して個別のチャネルを作成することをお勧めします。
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"メッセージ",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "新着メッセージ通知"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
iOSでのNotification PermissionはUNUserNotificationCenterを介してリクエストされます。Appleは2段階のアプローチを推奨しています:最初に仮通知をリクエストし、価値を示した後に完全な権限をリクエストします。
仮通知は、音やバナーなしで通知センターに表示されるサイレント通知です。これらはユーザーの明示的な同意を必要とせず、完全なリクエストの前に通知の価値をアプリが示すことを可能にします。複数の仮通知を受け取った後、ユーザーは通知自体のメニューから完全な通知を有効にできます。
import UserNotifications
func requestNotificationPermission() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
if let error = error {
print("Notification error: \(error.localizedDescription)")
return
}
if granted {
registerForRemoteNotifications()
} else {
handleDeniedPermission()
}
}
}
func requestProvisionalOnly() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.provisional, .alert, .badge, .sound]) { granted, error in
// 仮 — ユーザーはダイアログを表示しない
// 通知センターに音なしで通知が届く
registerForRemoteNotifications()
}
}
iOSでの現在のNotification Permissionステータスは、UNUserNotificationCenter.current().getNotificationSettingsを介して取得できます。ステータス.authorized、.denied、.provisional、または.notDeterminedにより、アプリは正しい動作を選択できます。最初の拒否後、システムダイアログは再度表示されません — UIApplication.openSettingsURLStringを介してユーザーを設定にリダイレクトする必要があります。Appleはまた、特定のシナリオに対して一時的な通知を提供する.ephemeralステータス(iOS 17+)の処理を推奨しています。
ベストプラクティスは、Notification Permissionのリクエストにおいて承認率を高め、ユーザー離脱を減らすことを目的としています。誤ったリクエストは、アプリが通知を送信する能力を奪うだけでなく、アプリのアンインストールにつながる可能性もあります。
最も一般的なアンチパターンは、アプリの初回起動時にNotification Permissionをリクエストすることです。ユーザーはまだアプリの価値を理解しておらず、拒否する可能性が非常に高いです。最適なタイミングは、ユーザーが最初の価値あるアクション(注文、メッセージ送信、更新の購読)を行った後です。ポストバリュープロンプトは承認率を65-75%に向上させます。
システムダイアログの前に、ユーザーが受け取る通知の例を示す独自の画面を表示します。テキストとアイコンを含む将来の通知のモックアップを表示します。ユーザーが通知が便利で邪魔にならないと分かれば、同意する可能性が高くなります。事前許可画面での通知プレビューは効果的な手法であり、変換率を35-50%向上させます。
iOSでプロアクティブに仮通知をリクエストすると、ユーザーの明示的な同意なしに通知を配信できます。ユーザーがこれらの通知に価値を見出せば、通知のコンテキストメニューから完全な通知を有効にできます。Appleはニュースアプリ、天気アプリ、および通知がトランザクションではなく情報提供である他のサービスに対してこのアプローチを推奨しています。Apple WWDC 2024によると、このアプローチは完全承認率を20-30%向上させます。
よくある質問
拒否後、システムダイアログは再度表示されません。通知を有効にする唯一の方法は、AndroidではIntent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)、iOSではUIApplication.openSettingsURLStringを介してユーザーをシステム設定にリダイレクトすることです。説明と遷移ボタンがある画面を表示します。
Android 12以下では、Notification Permissionは必要ありません — すべてのアプリがリクエストなしで通知を送信できます。ただし、ユーザーはいつでもシステム設定を介して通知を無効にできます。Android 13以降、targetSdkVersion 33+では実行時リクエストが必須です。
NotificationChannelは、Android 8.0で導入された通知カテゴリです。各チャネルには名前、説明、重要度レベル、グループがあります。ユーザーはアプリのすべての通知を無効にせずに個別のチャネルを無効にできます。たとえば、「新しいメッセージ」チャネルと「プロモーションメール」チャネルは別々に設定できます。
Android 13+では、POST_NOTIFICATIONSがない場合、NotificationManager.notifyの呼び出しはシステムによって無視されます。iOSでは、UNUserNotificationCenterの権限がない場合、通知は配信されません。例外:iOSのProvisional(音なし、通知センターのみ)およびAndroid 12-(権限不要)。
Androidでは、NotificationManagerCompat.areNotificationsEnabled()を使用します。iOSでは、UNUserNotificationCenter.current().getNotificationSettingsを呼び出し、authorizationStatusプロパティを確認します。Androidでは、追加でチャネルの重要度を確認します:NotificationChannel.getImportance()がIMPORTANCE_NONEであってはいけません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。