◉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-07-08上級

Rork Max のジオフェンスが20件で頭打ちになる問題を、動的再登録で解く

Rork Max が生成したネイティブ Swift のアプリで、登録したはずのジオフェンスが途中から反応しなくなる——その多くは iOS の「1アプリ20件」という上限に静かにぶつかっています。近い順に20件だけを登録し直す動的再登録の設計と、そのまま組み込める Swift の実装をまとめます。

Rork Max235Core Locationジオフェンスregion monitoringSwift48iOS114

✦ プレミアム記事

位置情報に連動して通知を出す小さな機能を、Dolice で個人開発しているアプリに足そうとしたときのことです。「この場所に着いたら、その場所向けの静かな一枚を表示する」——それだけの仕組みのために、全国のスポットを30件ほどジオフェンスとして登録しました。

手元の iPhone で近所の数件は正しく反応します。ところが、登録順で後ろのほうにあるスポットは、実際にその場所へ足を運んでも沈黙したままでした。ログには何のエラーも出ません。Rork Max が生成した CLLocationManager のコードは、見た目にはどこも壊れていない。

原因は、コードではなく iOS 側の上限でした。region monitoring は1つのアプリにつき20件までしか監視できません。 21件目以降は例外も警告も出さず、ただ静かに無視されます。ここでは、その上限を前提にした「近い順に20件だけを登録し直す」設計と、Rork Max の生成物に足すための実装をまとめます。

21件目が沈黙する理由

CLLocationManager の region monitoring(startMonitoring(for:))には、Apple が明記している制約があります。監視できるリージョンは 1アプリあたり最大20件。この上限を超えて登録しようとしても、startMonitoring(for:) はクラッシュしませんし、false を返すわけでもありません。20件を超えた分は monitoredRegions に加わらないだけで、didEnterRegion は永遠に呼ばれない状態になります。

つまり症状はこうです。

登録した順番monitoredRegions に入るかdidEnterRegion が呼ばれるか
1〜20件目入る呼ばれる
21件目以降入らない(無言)呼ばれない

Rork Max に「10個の場所でジオフェンス通知を出したい」と伝えると、素直に for ループで全件を startMonitoring(for:) に渡すコードを書いてくれます。10件なら問題は起きません。上限に気づかないまま登録数が増えていったとき、初めて「後半だけ反応しない」という再現性の低い不具合として表面化します。

私自身、この切り分けにいちばん時間を溶かしたのは「ログにエラーが出ない」ことでした。Core Location は上限超過を失敗として扱わないため、print を仕込んでも「登録した」というログだけが並びます。まず確認すべきは、登録処理の直後に manager.monitoredRegions.count を出力することです。ここが21以上にならず、20で頭打ちになっていれば、原因はコードのバグではなく上限だと確定できます。

for region in regions {
    manager.startMonitoring(for: region)
}
// 登録したつもりの件数と、実際に監視されている件数を必ず突き合わせる
print("要求: \(regions.count) 件 / 実際に監視中: \(manager.monitoredRegions.count) 件")

要求: 30 件 / 実際に監視中: 20 件 と出た瞬間に、話は「なぜ反応しないのか」から「どの20件を選ぶべきか」に変わります。

上限を消すのではなく、賢く使い回す

20件という上限は、アプリの設定では引き上げられません。増やす方向の解決策は存在しないので、設計を「多数のジオフェンスを、常に近い20件だけ実際に監視する」という形に変えます。論理的なジオフェンスの集合はアプリ側に好きなだけ持っておき、CLLocationManager に渡すのは、そのうちユーザーの現在地に近い順で20件だけ。ユーザーが移動したら、20件の顔ぶれを入れ替える。この「動的再登録」が核心です。

問題は、いつ入れ替えるかです。ここで startMonitoringSignificantLocationChanges()(大幅な位置変更の監視)を使います。これは region monitoring とは別の仕組みで、おおよそ 500m 程度の移動、かつ数分に一度という粗い粒度で位置更新を通知します。粒度が粗いぶん消費電力が小さく、アプリが終了していても OS がアプリを起こして更新を届けます。ジオフェンスそのものの精度(半径100m前後)には粗すぎますが、「20件を入れ替える頻度」としてはちょうどよい粒度です。

流れを整理すると、次のようになります。

役割使う API粒度・特性
実際の到着判定region monitoring半径100m前後・最大20件
20件を入れ替える引き金significant location change約500m・低消費電力・終了後も起動
全ジオフェンスの保持自前のストア(配列やDB)件数無制限

「精度の高い監視は少数だけに絞り、その入れ替えは粗くて省電力な監視に任せる」という二段構えです。全国に数百のスポットを持っていても、実際に CLLocationManager へ載るのは常に手元の20件だけになります。

✦

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

この記事の続きを読む

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

この記事で得られること
✦登録したジオフェンスが21件目から静かに無視される仕組みを理解し、症状が「バグ」ではなく iOS の設計上の上限であることを切り分けられるようになります
✦ユーザーの現在地に近い20件だけを常に登録し直す動的再登録マネージャを、Rork Max の生成コードに薄く足せる形で手に入れられます
✦significant location change・didDetermineState・Always 権限など、実機でしか露見しない落とし穴をどこで自分の手で埋めるかがわかります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-04-05
Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで
Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。
⬡ 開発ツール2026-05-16
Rork Max 製 iOS アプリの Firebase CocoaPods を Swift Package Manager へ移行した実録——2026年10月の廃止前に対応した手順と3つの落とし穴
Firebase Apple SDK の CocoaPods 配信が2026年10月に停止します。Rork Max 製 iOS アプリ4本を Swift Package Manager へ移行した実体験をもとに、手順・落とし穴・Dropbox競合コピー問題の解決策を詳細に解説します。
⬡ 開発ツール2026-05-01
Rork アプリに Notification Service Extension を後付けする — 画像付き通知・暗号化ペイロード復号・動的書き換えの実装メモ
Rork で作った iOS アプリに Notification Service Extension を後付けし、画像付き通知・E2E暗号化ペイロードの復号・APNs ペイロードの動的書き換えを本番品質で動かすまでの設計と、実際に踏んだ落とし穴を、動作する Swift コードとともにまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます