RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-05-14中級

Android 13 以降で Rork アプリのプッシュ通知が届かない — POST_NOTIFICATIONS 権限の追加手順

Android 13(API 33)以降でプッシュ通知が届かない原因は、POST_NOTIFICATIONS 権限の追加漏れです。Rork 生成コードへの追加手順を Before/After で解説します。

Android43プッシュ通知19権限7POST_NOTIFICATIONSRork515トラブルシューティング77

プッシュ通知の実装が完了したはずなのに、Android 実機で通知がまったく届かない——そんな報告を受けて頭を抱えた経験のある方は、少なくないと思います。

個人開発でプッシュ通知を扱っていると、iOS では問題なく届くのに Android の新しい端末だけ沈黙する、という場面に何度か出会いました。原因の多くは、Android 13 で追加された通知権限の対応漏れです。

届かない通知は、存在しない通知と同じ。リテンション(継続率)に直結する機能だからこそ、ここは丁寧に潰しておきたいところです。

Android 13(API レベル 33)以降の端末では、通知を表示するために POST_NOTIFICATIONS という新しい権限のリクエストが必要になりました。Rork の AI 生成コードは非常に優秀ですが、この比較的新しい Android の仕様変更に対応しきれていないケースがあります。

Android 13 で何が変わったのか

Android 12 以前では、アプリをインストールするだけで通知の送受信が可能でした。ユーザーが明示的に拒否しない限り、通知は届いていたのです。

Android 13 からは opt-in 方式 に変わりました。アプリが初めて通知を送ろうとする前に、ユーザーに「通知を許可しますか?」というダイアログを表示し、許可を得る必要があります。

Android 12 以前: インストール → 通知が届く(自動許可)
Android 13 以降: インストール → 権限リクエスト → 許可 → 通知が届く

この変更が適用されたのは API 33 以降の端末です。ただし、アプリの targetSdkVersion が 32 以下の場合は一時的に旧挙動となりますが、Google Play の要件(2024年以降は targetSdk 34 以上)を満たすためには、必ず対応が必要になります。

Rork の生成コードでよくある漏れのパターン

Rork が生成するコードは expo-notifications を使って通知機能を実装します。しかし、以下のパターンで権限が漏れていることがあります。

パターン1: requestPermissionsAsync() の呼び出しがない、または iOS 向けの権限チェックのみで Android 向けの対応が抜けている

// ❌ iOS のみ考慮したコード(Android 13+ で通知が届かない)
const { status } = await Notifications.requestPermissionsAsync();
if (status !== 'granted') {
  alert('通知の許可が必要です');
  return;
}

パターン2: app.jsonpermissions 配列に POST_NOTIFICATIONS が含まれていない

// ❌ app.json に Android 権限の記述がない
{
  "expo": {
    "android": {
      "package": "com.yourapp.app"
    }
  }
}

いずれのケースも、iOS シミュレーターや Android 12 以前の実機でテストしている間は問題が現れないため、見落とされがちです。

app.json への POST_NOTIFICATIONS 権限追加

まず app.jsonPOST_NOTIFICATIONS 権限を追加します。

// ✅ 正しい app.json(Android 13 対応)
{
  "expo": {
    "android": {
      "package": "com.yourapp.app",
      "permissions": [
        "android.permission.POST_NOTIFICATIONS",
        "android.permission.VIBRATE",
        "android.permission.RECEIVE_BOOT_COMPLETED"
      ]
    },
    "plugins": [
      [
        "expo-notifications",
        {
          "icon": "./assets/notification-icon.png",
          "color": "#ffffff"
        }
      ]
    ]
  }
}

VIBRATERECEIVE_BOOT_COMPLETED は通知の動作に必要な権限です。一緒に追加しておくと安心です。

私自身は、通知や課金のように OS のバージョンで挙動が変わりやすい領域だけは、生成コードをそのまま信じずに一度自分の目で app.json を開いて確認するようにしています。数十秒の手間で、公開後に気づく事故をかなり減らせます。

権限リクエストのコードを修正する

次に、通知権限のリクエスト処理を修正します。Android 13 以降では、expo-notificationsrequestPermissionsAsync() が適切にダイアログを表示しますが、バージョンによっては追加の設定が必要です。

// ✅ Android 13+ に対応した権限リクエスト
import * as Notifications from 'expo-notifications';
import { Platform } from 'react-native';
 
async function registerForPushNotificationsAsync() {
  // Android の場合、通知チャンネルを先に作成する
  if (Platform.OS === 'android') {
    await Notifications.setNotificationChannelAsync('default', {
      name: 'Default',
      importance: Notifications.AndroidImportance.MAX,
      vibrationPattern: [0, 250, 250, 250],
      lightColor: '#FF231F7C',
    });
  }
 
  // 権限リクエスト(iOS / Android 13+ で共通)
  const { status: existingStatus } = await Notifications.getPermissionsAsync();
  let finalStatus = existingStatus;
 
  if (existingStatus !== 'granted') {
    const { status } = await Notifications.requestPermissionsAsync();
    finalStatus = status;
  }
 
  if (finalStatus !== 'granted') {
    console.warn('プッシュ通知の権限が取得できませんでした');
    return null;
  }
 
  // デバイストークンの取得(SDK 52 以降は projectId が必須)
  const token = await Notifications.getExpoPushTokenAsync({
    projectId: 'YOUR_EXPO_PROJECT_ID',
  });
 
  return token.data;
}

重要なのは、まず getPermissionsAsync() で現在の権限状態を確認してから、未決定の場合のみ requestPermissionsAsync() を呼び出す点です。すでに「許可」または「拒否」が決まっているのに何度もダイアログを表示しようとすると、設定済みの状態がそのまま返るだけになります。

EAS Build での注意点

app.json を変更したあとは、必ず EAS Build を再実行する必要があります。権限の設定は AndroidManifest.xml に反映されるものであり、OTA(Over the Air)アップデートでは変更できません。

# 開発用プレビュービルドで動作確認
eas build --platform android --profile preview
 
# 確認が取れたら本番ビルド
eas build --platform android --profile production

Android 13 の動作を確認したい場合は、API レベル 33 以上のエミュレーターか、Android 13 以降の実機でテストしてください。古いエミュレーターでは権限ダイアログが表示されず、問題を見落とすことがあります。

動作確認の手順

修正後は以下の順序で確認します。

  1. EAS Build(または npx expo run:android)で新しいビルドをインストール
  2. アプリを初回起動すると「通知を送信しますか?」ダイアログが表示されることを確認
  3. 「許可」を選択後、Expo Push Notification Tool からテスト送信
  4. 通知が届くことを確認

権限が実際に付与されたかどうかは、adb でも確認できます。ダイアログの結果を推測せず、OS 側の状態を直接読めるので、原因の切り分けが速くなります。

# 通知権限の付与状態を確認(granted=true なら許可済み)
adb shell dumpsys notification_manager | grep -A1 com.yourapp.app
 
# パッケージに宣言された権限一覧を確認(POST_NOTIFICATIONS があるか)
adb shell dumpsys package com.yourapp.app | grep POST_NOTIFICATIONS

2つ目のコマンドで POST_NOTIFICATIONS が出てこない場合は、app.json の変更がビルドに反映されていないサインです。EAS Build の再実行から見直してください。

もしダイアログが表示されない場合は、端末の「設定」→「アプリ」→ アプリ名 → 「通知」から手動で許可することで動作テスト自体は続行できます。ただし、実際のユーザーが設定画面まで辿り着くことは稀なので、コードの修正は必須です。

Expo SDK バージョンによる追加確認

expo-notifications のバージョンによって API の挙動が多少異なります。Rork が生成するプロジェクトは概ね Expo SDK 50〜55 の範囲ですが、SDK 52 以降では getExpoPushTokenAsync()projectId が必須になっています。

// SDK 52 以降は projectId が必須(ないとデバッグでは動くが本番で失敗する)
import Constants from 'expo-constants';
 
const token = await Notifications.getExpoPushTokenAsync({
  projectId: Constants.expoConfig?.extra?.eas?.projectId,
});

projectId が欠けていると、開発ビルドでは動くのに本番ビルドでトークン取得が失敗する、という紛らわしい症状が出ることがあります。合わせて確認してみてください。


Android の通知権限まわりは、OS のバージョンアップのたびに変化しています。POST_NOTIFICATIONS に限らず、今後も同様の変更が続く可能性があります。Rork の生成コードを信頼しつつも、通知・権限・課金まわりは特に変化が多い領域なので、定期的に公式ドキュメントを参照する習慣をつけておくと安心です。

関連する問題として、Rork アプリのプッシュ通知が届かない原因と解決方法や、EAS Update(OTA)の変更が反映されない場合の対処も参考になります。

実装の参考になれば幸いです。

シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-04-29
Rork で作った Android アプリの通知アイコンが白い四角になる問題の直し方
Rork や Expo で作った Android アプリのプッシュ通知アイコンが白い四角や謎のシルエットになる原因と、透過アイコンの正しい作り方・app.json の設定・キャッシュ起因の落とし穴までまとめて解説します。
開発ツール2026-04-23
Rork アプリで画像・動画をカメラロールに保存できない問題の完全解決ガイド
Rork で生成したアプリで画像・動画を iOS のカメラロール/Android のギャラリーに保存できない問題を、権限設定・expo-media-library の仕様・SDK 51+の変更点まで掘り下げて解決していきます。
開発ツール2026-05-19
Rork で AsyncStorage に大容量データを保存すると Android で CursorWindow エラーが出る原因と対処
Rork(React Native)で AsyncStorage に大きな JSON や画像メタデータを保存すると Android で発生する Row too big to fit into CursorWindow エラーの原因と、MMKV・SQLite・分割保存・圧縮など複数の現実的な対処をまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →