◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-06-22上級

毎朝違う一言を出す日替わりリマインダーが、ある日から鳴らなくなる——iOSの保留64件という見えない上限

Rork(Expo)で作った日替わりリマインダーが、しばらく経つと無言で止まる原因はiOSの保留通知64件上限です。固定文言のカレンダートリガーと、日替わりコンテンツのローリング再スケジュールを動くコードで設計し、サマータイムや複数リマインダー併用でも狂わない通知を組みます。

Rork577expo-notifications7ローカル通知3React Native238iOS114

✦ プレミアム記事

「毎朝8時に、その日の一言を届ける」。日替わりの引き寄せアプリにそんな機能を足したとき、私は素直に当日から30日分を一気にスケジュールしました。シミュレータでは完璧に動きます。ところが本番に出してしばらくすると、ユーザーから「最初の数日は鳴ったのに、その後止まった」という声が届くようになりました。

原因はコードのバグではありません。iOSが保留中のローカル通知を64件までしか抱えてくれないという、公式チュートリアルではほとんど触れられない上限でした。30日分どころか、朝と夜の二本立てにしていたら1か月分すら積めません。超えた分はエラーも出さず、静かに捨てられます。

ここからは、日替わりリマインダーを「鳴り続ける」設計に組み直す手順を、expo-notifications の動くコードで具体的に追っていきます。基礎的なセットアップ自体はローカル通知の基本実装ガイドに譲り、ここでは上限との付き合い方だけに集中します。

iOSが保留する通知は64件まで——超えた分は黙って捨てられる

Appleのローカル通知には、アプリごとに未発火(pending)の通知を最大64件しか保持しないという制限があります。65件目以降を scheduleNotificationAsync で積もうとしても、例外は飛びません。iOSは「発火時刻が最も早い64件」を残し、それ以外を保留リストから落とします。

ここで厄介なのが、repeats: true の繰り返し通知は1枠で1件として数えられる点です。「毎日8時」を繰り返しトリガーで組めば、消費するのはたった1枠です。ところが「毎日違う本文」をやりたくなると繰り返しが使えず、日付ごとに個別の通知を積むことになり、あっという間に64の壁に当たります。

つまり判断の分岐はシンプルです。

  • 文言が毎日同じでいい → 繰り返しトリガー1枚。上限はまず気にしなくていい
  • 文言を毎日変えたい → 個別スケジュール。64枠の予算管理が必須

私自身、この切り分けを最初に決めずに作り始めて遠回りをしました。先に「このリマインダーは固定文言か、日替わりか」を1つずつ分類しておくと、設計が一気に楽になります。

まず現状を観測する——いま自分が何件積んでいるか

設計を変える前に、計測です。getAllScheduledNotificationsAsync は現在保留中の通知配列を返すので、起動時にログを出すだけで「いま何枠使っているか」が見えます。

import * as Notifications from 'expo-notifications';
 
// 起動時に一度呼ぶ。本番では __DEV__ ガードしてログ量を抑える
export async function inspectPendingNotifications(): Promise<number> {
  const pending = await Notifications.getAllScheduledNotificationsAsync();
  if (__DEV__) {
    console.log(`[notif] pending=${pending.length}/64`);
    pending.forEach((n) => {
      // trigger の中身は型がプラットフォームで異なるので緩く出す
      console.log('  -', n.identifier, JSON.stringify(n.trigger));
    });
  }
  return pending.length;
}

pending.length が60を超えていたら、もう危険水域です。私は本番アプリでこの数値を起動ごとに内部メトリクスへ送るようにして、「気づいたら上限に張り付いていた」を未然に防いでいます。数字を見ずに通知を積むのは、残量メーターを見ずに燃料を入れ続けるのと同じです。

✦

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

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦毎朝違う一言を出すリマインダーがある日から鳴らなくなる——iOSの保留64件上限という見えない壁を理解し、回避する設計を手に入れられます
✦固定文言のカレンダートリガー1枚で済む場合と、日替わりコンテンツにローリング再スケジュールが要る場合を、動くコードで判断できるようになります
✦サマータイム・タイムゾーン移動・朝夜の二本立てでも時刻が狂わない通知設計に、自分のアプリを作り替えられます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

⬡ 開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、iOS と Android の引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
⬡ 開発ツール2026-05-28
Rork アプリで iOS の BGTaskScheduler.submit が Error Code=1 で失敗するときの切り分け手順
BGTaskScheduler.submit が Error Code=1 を返すとき、原因は 6 種類に収まります。Code=1 と Code=3 の読み分け、Expo 構成に固有の identifier、ウィジェット拡張から submit してしまう落とし穴、getPendingTaskRequests による自己確認まで整理しました。
⬡ 開発ツール2026-05-26
iOSのフォアグラウンド通知が表示されない — expo-notifications のハマりどころと対処
iOS実機でアプリが前面にあるときだけプッシュ通知が表示されない問題を、expo-notifications の setNotificationHandler の正しい書き方と iOS 14 以降の表示プロパティの違いから整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます