先日、手元の小さなアプリを一本、Rork Max の Swift 生成で作り直してみました。きっかけは単純で、ホーム画面のウィジェットと Live Activities をどうしても綺麗に出したかったからです。通常の Rork が生成する Expo アプリでも実現はできますが、拡張ターゲットを別言語で書き足す手間が毎回つきまといます。Swift をそのまま吐いてくれるなら、その往復が一段減るはずでした。
// SharedState.swift — App Group の UserDefaults 経由で Expo 側と同じ形を読むstruct AppSharedState: Codable { var schemaVersion: Int var isPremium: Bool var adsEnabled: Bool var streakCount: Int var lastSyncedAt: String}func loadSharedState() -> AppSharedState { let defaults = UserDefaults(suiteName: "group.net.dolice.sharedapp") guard let data = defaults?.data(forKey: "appSharedState"), let decoded = try? JSONDecoder().decode(AppSharedState.self, from: data) else { // 読めないときは既定値。ウィジェットを空白で固めないための保険 return AppSharedState(schemaVersion: 0, isPremium: false, adsEnabled: true, streakCount: 0, lastSyncedAt: "") } return decoded}
この契約レイヤーの肝は、schemaVersion を必ず持たせることです。Rork Max にウィジェットを再生成させると、受け取り側のコードが知らないうちに書き換わることがあります。バージョン番号を見て「自分が知らない新しい形が来たら既定値に落ちる」という防御を1行入れておくだけで、再生成のたびに起きる原因不明の空白表示を防げました。
Rork Max の訴求点である「Xcode なしで2クリック公開」は、初回の体験としては確かに鮮やかです。ただ、App Store の公開で実際に時間を食うのは、ビルドをアップロードする工程ではありません。スクリーンショットの多言語対応、プライバシー項目の申告、審査リジェクトへの再提出。これらは生成エンジンが肩代わりしてくれない領域です。
ですから「2クリック公開」は、初回提出の摩擦が減るという意味で受け取るのが正確です。公開後の更新・課金・広告の組み込みやすさこそが、実運用での評価を左右します。私が小さなアプリで Expo 版と Rork Max を並べて比較したときも、差がついたのは生成直後ではなく、3度目の更新を出すあたりからでした。