RORK LABEN
FREETRY — Rorkが「Rork Maxを期間限定で無料で試せるようにした」とXで告知しました。$200/月のプランに、費用を先に払わずに触れる機会ですONESHOT — Rork MaxはiPhone・Watch・iPad・TV・Vision Pro向けのアプリをほぼワンショットで生成すると謳い、ARと3Dを使うものまで対象に挙げていますXCODE — 「Xcodeを置き換えるWebサイト」を掲げ、実機インストールは1クリック、App Store提出は2クリック。裏側はSwiftとClaude Code、OpusですPAPERLINE — Rorkはアプリビルダーの Paperline を買収し、エンジニアリング人材の獲得に向けて今後も買収を続ける方針を示していますSKILLS — GitHubのapp-store-connect-cli-skillsが7月9日に更新。提出まわりの開発者ツールに手が入り続けていますMARKET — Gartnerは2026年末までに新規アプリの75%がローコードまたはノーコードで作られると見込んでいます。2020年は25%未満でしたFREETRY — Rorkが「Rork Maxを期間限定で無料で試せるようにした」とXで告知しました。$200/月のプランに、費用を先に払わずに触れる機会ですONESHOT — Rork MaxはiPhone・Watch・iPad・TV・Vision Pro向けのアプリをほぼワンショットで生成すると謳い、ARと3Dを使うものまで対象に挙げていますXCODE — 「Xcodeを置き換えるWebサイト」を掲げ、実機インストールは1クリック、App Store提出は2クリック。裏側はSwiftとClaude Code、OpusですPAPERLINE — Rorkはアプリビルダーの Paperline を買収し、エンジニアリング人材の獲得に向けて今後も買収を続ける方針を示していますSKILLS — GitHubのapp-store-connect-cli-skillsが7月9日に更新。提出まわりの開発者ツールに手が入り続けていますMARKET — Gartnerは2026年末までに新規アプリの75%がローコードまたはノーコードで作られると見込んでいます。2020年は25%未満でした
記事一覧/開発ツール
開発ツール/2026-07-18上級

AR で置いたものが翌朝には消えている — ARWorldMap による配置の永続化とリローカライズ設計

Rork Max が生成する AR アプリは、置いた 3D オブジェクトがアプリ再起動で消えます。ARWorldMap の保存タイミング、カスタムアンカーの符号化、リローカライズ待ちの見せ方、成立しない時の逃げ道までを設計として整理しました。

Rork Max229ARKit2ARWorldMapSwift48個人開発186

プレミアム記事

Rork Max に「床に家具を置ける AR アプリ」と伝えると、驚くほど素直に動くものが出てきます。ARKit の初期化も、平面検出も、タップした位置へのモデル配置も、こちらが Swift を一行も書かないうちに揃います。

問題は、その次に起きました。

配置を終えてアプリを閉じ、翌朝もう一度開くと、置いたはずのものが一つ残らず消えていたのです。バグではありません。ARKit のセッションは、既定では何も記憶しないまま終わります。私自身、個人開発で壁紙アプリを長く運用してきて「保存し忘れ」の類にはそれなりに敏感なつもりでしたが、AR では保存すべき対象そのものが直感と違っていました。座標を保存するだけでは足りないのです。

ここでは、その「足りない部分」を ARWorldMap で埋める設計を、順を追って組み立てます。

座標を保存しても配置が戻らない理由

最初に手が伸びるのは、タップ位置の simd_float4x4 を JSON にして保存する方法です。これは動きません。理由は、AR の座標系そのものが毎回作り直されるからです。

ARKit のワールド座標の原点は、セッション開始時のデバイス位置に置かれます。昨日は部屋の入口で起動し、今日はソファの前で起動したなら、同じ数値が指す実世界の場所は数メートル単位でずれます。座標は、それを解釈する地図とセットでなければ意味を持ちません。

その地図にあたるのが ARWorldMap です。中身は大きく 3 つに分かれます。

要素内容保存されるか
特徴点群カメラが認識した空間の点の集合(rawFeaturePoints)される
アンカーARAnchor の一覧(変換行列と識別子)される
3D モデル表示している家具のメッシュ・マテリアルされない

3 行目が肝心です。ARWorldMap は「どこに」を記憶しますが、「何を」は記憶しません。復元後にアンカーだけが蘇り、画面には何も出ないという状態に、私は最初まさに一晩溶かしました。

アンカーに意味を持たせる

そこで、アンカーを継承して自前の情報を載せます。ARWorldMap のアーカイブはアンカーも一緒に符号化するため、NSSecureCoding を正しく実装すれば、モデルの識別子が地図と一緒に運ばれます。

final class FurnitureAnchor: ARAnchor {
    // 復元時にどのモデルを再生成するかを決める鍵
    let catalogID: String
    let placedAt: Date
 
    init(catalogID: String, transform: simd_float4x4) {
        self.catalogID = catalogID
        self.placedAt = Date()
        super.init(name: "furniture", transform: transform)
    }
 
    // ARKit がセッション内でアンカーを複製する際に必ず呼ばれる。
    // ここを実装し忘れると、復元前に情報が消える。
    required init(anchor: ARAnchor) {
        let other = anchor as! FurnitureAnchor
        self.catalogID = other.catalogID
        self.placedAt = other.placedAt
        super.init(anchor: other)
    }
 
    override class var supportsSecureCoding: Bool { true }
 
    required init?(coder: NSCoder) {
        guard let id = coder.decodeObject(of: NSString.self, forKey: "catalogID") as String? else {
            return nil  // 旧バージョンの地図は復元せず捨てる
        }
        self.catalogID = id
        self.placedAt = coder.decodeObject(of: NSDate.self, forKey: "placedAt") as Date? ?? Date()
        super.init(coder: coder)
    }
 
    override func encode(with coder: NSCoder) {
        super.encode(with: coder)
        coder.encode(catalogID as NSString, forKey: "catalogID")
        coder.encode(placedAt as NSDate, forKey: "placedAt")
    }
}

Rork Max が生成したコードにこの層を足すとき、私は init(anchor:) を必ず先に確認します。ここが未実装だと、セッション中は正常に見えるのに、保存された地図の中身だけが空になります。実機で 1 度アプリを閉じるまで気づけない種類の落とし穴で、生成コードのレビューで最も見落としやすい箇所だと感じています。回避策は単純で、保存の直後に一度だけ読み戻し、catalogID が残っているかを確かめることです。

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

この記事の続きを読む

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

この記事で得られること
AR の配置が再起動で消える原因を特定し、ARWorldMap の保存・復元を 60 行程度の実装で組み込めるようになる
mappingStatus と NSSecureCoding の 2 つの落とし穴を先回りし、復元時のクラッシュとデータ消失を回避できる
リローカライズが 30 秒待っても成立しない場面の逃げ道を持ち、AR 機能の離脱率を設計で下げられる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-07-16
Rork Max 生成コードの再生成ゾーン設計 — 手を入れるほど失われる「作り直せる自由」を残す
Rork Max の生成コードには「捨てて作り直せる」という見えない資産が乗っています。手を入れるたびに静かに失効するその資産を、台帳とCI検査で管理する設計を、個人開発の実運用からまとめます。
開発ツール2026-07-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
開発ツール2026-07-11
Rork Max で App Clip を実装する — QR を読んだ瞬間にアプリの核だけを届ける設計メモ
Rork Max が出力するネイティブ Swift を土台に、App Clip の15MB制約・起動URLの受け取り・親アプリへの状態引き継ぎまでを実装ベースで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →