RORK LABEN
NATIVE — Rork Max は純粋な Swift と SwiftUI を生成するため、AR や LiDAR、Metal を使った 3D、ウィジェット、Dynamic Island、Live Activities、HealthKit、NFC、Core ML まで手が届きますCHOICE — 逆にいえば、こうした Apple 固有の機能を使わないアプリならクロスプラットフォームの通常の Rork で足ります。Max を選ぶ理由はこの一点に集約されますPLAY — 8月31日から、Google Play の新規アプリと既存アプリの更新は対象 API レベル36(Android 16)が必要になります。残り9日ですPLAY — 更新を出さない既存アプリでも、より新しい Android を載せた端末の新規ユーザーへ配信を続けるには対象 API レベル35 以上が要ります。見落とすと新規インストールだけが止まりますGRACE — Play Console の延長フォームから申請すれば11月1日まで猶予されます。自動ではないため、8月31日までに申請そのものを済ませておく必要がありますEXPO — expo prebuild がネイティブディレクトリを破棄して再生成するのが既定になりました。手を入れている場合は no-clean を渡します。API 36 対応の最中は事故になりやすい箇所ですNATIVE — Rork Max は純粋な Swift と SwiftUI を生成するため、AR や LiDAR、Metal を使った 3D、ウィジェット、Dynamic Island、Live Activities、HealthKit、NFC、Core ML まで手が届きますCHOICE — 逆にいえば、こうした Apple 固有の機能を使わないアプリならクロスプラットフォームの通常の Rork で足ります。Max を選ぶ理由はこの一点に集約されますPLAY — 8月31日から、Google Play の新規アプリと既存アプリの更新は対象 API レベル36(Android 16)が必要になります。残り9日ですPLAY — 更新を出さない既存アプリでも、より新しい Android を載せた端末の新規ユーザーへ配信を続けるには対象 API レベル35 以上が要ります。見落とすと新規インストールだけが止まりますGRACE — Play Console の延長フォームから申請すれば11月1日まで猶予されます。自動ではないため、8月31日までに申請そのものを済ませておく必要がありますEXPO — expo prebuild がネイティブディレクトリを破棄して再生成するのが既定になりました。手を入れている場合は no-clean を渡します。API 36 対応の最中は事故になりやすい箇所です
記事一覧/開発ツール
開発ツール/2026-07-08上級

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

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

Rork Max233Core Locationジオフェンスregion monitoringSwift48iOS109

プレミアム記事

位置情報に連動して通知を出す小さな機能を、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-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
開発ツール2026-07-11
Rork Max で App Clip を実装する — QR を読んだ瞬間にアプリの核だけを届ける設計メモ
Rork Maxが出力するネイティブSwiftを土台に、App Clipを実装する設計メモです。15MB制約を守るターゲット分割、NSUserActivityでの起動URL受け取り、apple-app-site-associationの設定、親アプリへの状態引き継ぎまでを実装ベースで整理します。
開発ツール2026-07-06
Rork Max のアプリ機能を Apple Intelligence に開く — App Intents Assistant Schemas の設計と、収まらない機能の逃がし方
Rork Max が生成した Swift アプリの操作を Apple Intelligence から呼べるようにする App Intents Assistant Schemas の設計を、固定スキーマへの当てはめ方・収まらない機能の逃がし方・実機での確認手順まで含めて実装ノートとしてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →