RORK LABEN
PUBLISH — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できますSIMULATOR — ブラウザ内のストリーミングシミュレータで実機に近い操作感を試せ、QRでTestFlightなしに実機インストールできますMAX — Rork MaxはネイティブSwiftアプリを生成し、Claude Code・Claude Opus 4.6で駆動しますNATIVE — Rork MaxはAR/LiDAR・Metalの3D・ウィジェット・Live Activities・HealthKit・Core MLなどXcode相当の領域まで到達しますFUNDING — Rorkが$15Mを調達し、App Store起業家世代の後押しを掲げていますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200ですPUBLISH — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できますSIMULATOR — ブラウザ内のストリーミングシミュレータで実機に近い操作感を試せ、QRでTestFlightなしに実機インストールできますMAX — Rork MaxはネイティブSwiftアプリを生成し、Claude Code・Claude Opus 4.6で駆動しますNATIVE — Rork MaxはAR/LiDAR・Metalの3D・ウィジェット・Live Activities・HealthKit・Core MLなどXcode相当の領域まで到達しますFUNDING — Rorkが$15Mを調達し、App Store起業家世代の後押しを掲げていますPRICE — 料金は無料から用意され、有料プランは月$25から、Rork Maxは月$200です
記事一覧/開発ツール
開発ツール/2026-07-08上級

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

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

Rork Max217Core Locationジオフェンスregion monitoringSwift43iOS105

プレミアム記事

位置情報に連動して通知を出す小さな機能を、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/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-06
Rork Max のアプリ機能を Apple Intelligence に開く — App Intents Assistant Schemas の設計と、収まらない機能の逃がし方
Rork Max が生成した Swift アプリの操作を Apple Intelligence から呼べるようにする App Intents Assistant Schemas の設計を、固定スキーマへの当てはめ方・収まらない機能の逃がし方・実機での確認手順まで含めて実装ノートとしてまとめます。
開発ツール2026-07-04
Rork Max のアプリで、選んだ写真が次回起動時に消えている — PHPicker の限定アクセスで URL を握り続けようとする罠
Rork Max が生成したネイティブ Swift アプリで、PHPickerViewController で選んだ写真が再起動後に読めなくなる——限定アクセスの時代に URL や PHAsset を握り続けようとするのが原因でした。選んだ瞬間に自前ストレージへ実体をコピーする設計をまとめます。
開発ツール2026-07-04
Rork Max のアプリでアプリを起動せずに Live Activity を出す — push-to-start トークンが無言で取れない時の設計
Rork Max が生成したネイティブ Swift アプリで、アプリを一度も開かずにサーバから Live Activity を開始したい。ところが push-to-start トークンが観測できず無言で失敗する——その原因と、トークンを確実に取り切る観測レイヤーの実装をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →