RORK LABEN
EVENT — 本日9月9日、Apple が「Surprise and Shine」と題したイベントを開きます。日本時間では9月10日の未明2時からですEXPECT — iPhone 18 Pro と Pro Max、折りたたみ機、2nm プロセスの A20 Pro チップ、そして iOS 27 以下の配信日発表が見込まれていますWAIT — この記事を書いている時点ではまだ開催前です。噂の段階で書いたものと発表後に書いたものが混ざると、読む側には区別がつきませんMAX — Rork Max がネイティブ Swift を生成する以上、Apple の動きは他人事ではありません。標準の Rork は React Native、という線引きは繰り返し確認したいところですSIMULATOR — Rork Max はクラウド上の Mac でコンパイルし、ブラウザ内で動くストリーミングの iOS シミュレータで確認できます。Xcode も Mac の実機も要りませんSEASON — OS が新しくなる時期は、自動生成の足場がいちばん揺れます。便利さを謳う記事ほど、この揺れに触れないと不誠実になると感じていますEVENT — 本日9月9日、Apple が「Surprise and Shine」と題したイベントを開きます。日本時間では9月10日の未明2時からですEXPECT — iPhone 18 Pro と Pro Max、折りたたみ機、2nm プロセスの A20 Pro チップ、そして iOS 27 以下の配信日発表が見込まれていますWAIT — この記事を書いている時点ではまだ開催前です。噂の段階で書いたものと発表後に書いたものが混ざると、読む側には区別がつきませんMAX — Rork Max がネイティブ Swift を生成する以上、Apple の動きは他人事ではありません。標準の Rork は React Native、という線引きは繰り返し確認したいところですSIMULATOR — Rork Max はクラウド上の Mac でコンパイルし、ブラウザ内で動くストリーミングの iOS シミュレータで確認できます。Xcode も Mac の実機も要りませんSEASON — OS が新しくなる時期は、自動生成の足場がいちばん揺れます。便利さを謳う記事ほど、この揺れに触れないと不誠実になると感じています
記事一覧/開発ツール
開発ツール/2026-08-16上級

App Store 2.5.2 に触れる実装を、提出前にリポジトリから洗い出す

リモートから届いた値でアプリの機能が変わる実装は、審査ガイドライン 2.5.2 の対象になり得ます。境界の引き方と、提出前にコードから機械的に洗い出す手順をまとめました。

App Store88審査10Expo203React Native236リモート設定3

プレミアム記事

リモート設定に新しいキーを足すとき、決まって手が止まる場所があります。

「この値でアプリの見た目が変わるのは良い。では、この値で画面そのものが差し替わるのはどうなのか」。運用している壁紙アプリは、カタログもテキストもサーバー側から配っています。配信で変えられる範囲が広いほど運用は楽になりますが、広げすぎた先に審査があります。

2026年3月、Apple が Replit と Vibecode の App Store 上での更新を止めた件が報じられました。根拠として挙げられたのが、審査ガイドライン 2.5.2 です。生成したコードをアプリの中で実行できる設計が問題になった、という整理がされています(Apple Blocks Updates for AI Vibe Coding Apps in App Store)。

Rork で作ったアプリを出す側から見ると、これは他人事ではありません。AI にコードを書かせること自体は何も禁じられていませんが、書かれたコードをアプリの中で走らせる導線が残っていると、対象になり得ます。しかも、その導線は自分で意図して作った覚えがなくても入り込みます。

以下では、その導線をコードから機械的に洗い出す手順をまとめます。実際に動かしたスクリプトと、走らせて分かった誤検知の出方まで含めています。

2.5.2 が見ているのは配信経路ではなく、機能が変わるかどうか

まず条文を正確に押さえておきます。2.5.2 は、アプリが「そのアプリ(および他のアプリ)の機能を導入または変更するコードをダウンロード・インストール・実行すること」を禁じています(App Review Guidelines)。

ここで読み違えやすいのが主語です。禁じられているのは「コードをダウンロードすること」そのものではありません。禁じられているのは、それによって機能が導入・変更されることです。

この読み方が正しいことは、例外規定の形から逆算できます。WebKit の中で動く JavaScript は、この条項の下で認められています。教育目的でコードを実行させるアプリも、条件付きで認められています。もし「リモートから届いたコードを実行するのが一律に駄目」だったなら、これらの例外は成立しません。

私自身、最初はここを取り違えていました。「サーバーから何かを取ってくる処理は全部危ない」と思って設計していた時期があります。実際の線はもっと具体的なところに引かれています。

リモートから届くものアプリの側で起きること2.5.2 の観点
壁紙カタログの JSON一覧の中身が変わるデータの差し替え。機能は変わらない
Remote Config のしきい値すでに実装済みの分岐の入り方が変わるレビュー済みの機能の範囲内
EAS Update の JS バンドル実装が新しいものに入れ替わる解釈実行層の更新。認められた運用
式を表す文字列を eval に渡すその場で新しい処理が生まれる機能の導入にあたる
リモート URL からの動的 import審査時に存在しなかった実装が動く機能の導入にあたる

3行目と4行目を並べたときの違和感が、この条項の要点です。EAS Update は JS バンドルを丸ごと入れ替えます。差し替わるコードの量でいえば、eval に文字列を1行渡すのとは比べものになりません。それでも前者は成立していて、後者が問題になります。

境界は「コードがどこから来たか」ではなく、「レビューされたときの機能の範囲を超えるか」に引かれています。 OTA 更新は、レビュー済みのアプリと同じ目的・同じ機能を保ったまま実装を差し替える運用として扱われます。一方 eval は、審査時点で誰も見ていない処理を実行時に生み出す口を開けたままにします。バイト数の問題ではなく、範囲が閉じているかどうかの問題です。

この見方を持っておくと、判断が速くなります。新しい実装を入れるとき、「これは配信か、それとも生成か」と自問すれば、たいていその場で答えが出ます。

境界の外に出やすい6つの実装

洗い出しの対象を先に決めます。個人開発の規模で実際に混入し得るのは、次の6種類でした。上の3つは提出前に消すべきもの、下の3つは用途を説明できるなら残せるものとして分けています。

  1. eval(...) — 文字列をそのままコードとして実行します
  2. new Function(...)eval と同じ扱いです。式評価ライブラリを自作すると入りがちです
  3. import("https://...") — 実行時にリモートのモジュールを読み込みます
  4. injectedJavaScript — WebView に注入する JS。定数なら問題ありませんが、サーバーから受け取った文字列だと話が変わります
  5. source={{ html: ... }} — 任意の HTML を描画する経路です
  6. リモート値から画面実装を選ぶマップ — components[remote.screen] のような形です

4〜6を「消すべき」に入れていないのは、これらが正当な実装として広く使われているからです。ヘルプ画面を WebView で出すのも、リモート値でタブの並びを変えるのも普通の設計です。問題になるのは、そこに流し込まれる値の出どころが外部で、かつ内容が事前に決まっていない場合だけです。

だからこの6つは「見つけたら消す」ではなく「見つけたら出どころを辿る」ためのリストとして扱います。

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

この記事の続きを読む

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

この記事で得られること
自分のアプリのどの実装が審査の 2.5.2 に触れうるのかを、提出前にコードから切り分けられるようになる
リモートで変えてよいもの(データ・設定)と変えてはいけないもの(機能そのもの)の線を、自分の設計に引けるようになる
リジェクトを受けてから慌てて実装を削る事態を避けられるようになり、審査が長引いている時期でも公開日の見通しを保てる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-09-04
EAS の secret は「アプリに入れない」設定ではありません — 接頭辞と可視性を別々に決める
EXPO_PUBLIC_ の接頭辞は成果物に入るかを決め、EAS の可視性は誰が読めるかを決めます。二つを重ねたときに OTA 更新でだけ値が消える筋道と、出荷前に自分の手で確かめる手順をまとめました。
開発ツール2026-09-01
expo-paste-input で画像を貼り付けられる入力欄を作り、消える file:// を documents へ逃がす
チャット入力に画像やGIFを貼り付けられるようにする expo-paste-input の実装手順です。onPaste が返す file:// は一時ファイルで、送信までの間に消えることがあります。保存先を移す実装と、実機で確かめる順番をまとめました。
開発ツール2026-08-31
画面ロックから3分後、expo-audio の環境音は静かに止まっていました
expo-audio の音が画面ロックで止まる原因を、ビルド設定・オーディオセッション・ロック画面連携の三層に分けて切り分けます。Android で約3分後に止まるのは、ドキュメントに書かれた止まり方です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます