RORK LABEN
MAX — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できます。公開にローカルMacは不要ですSIMULATOR — ブラウザ内のストリーミングシミュレータで操作感を試せ、QRを読めばTestFlightなしで実機に直接インストールできますNATIVE — SwiftUI・ARKit・HealthKit・HomeKit・Core ML・Metalなど、React Nativeでは届かない領域までカバーしますSEED — Rorkは2026年4月にLeft Lane Capital主導で$15Mのシードを調達し、Peak XVやa16z Speedrunが参加しましたGROWTH — 月間743,000訪問・成長率85%と報じられ、AIモバイルアプリ構築の裾野が広がっていますNOCODE — Gartnerは2026年末までに新規アプリの75%がローコード/ノーコードで作られると予測していますMAX — Rork Maxはコード署名やプロビジョニングを肩代わりし、2クリックでApp Storeへ申請できます。公開にローカルMacは不要ですSIMULATOR — ブラウザ内のストリーミングシミュレータで操作感を試せ、QRを読めばTestFlightなしで実機に直接インストールできますNATIVE — SwiftUI・ARKit・HealthKit・HomeKit・Core ML・Metalなど、React Nativeでは届かない領域までカバーしますSEED — Rorkは2026年4月にLeft Lane Capital主導で$15Mのシードを調達し、Peak XVやa16z Speedrunが参加しましたGROWTH — 月間743,000訪問・成長率85%と報じられ、AIモバイルアプリ構築の裾野が広がっていますNOCODE — Gartnerは2026年末までに新規アプリの75%がローコード/ノーコードで作られると予測しています
記事一覧/開発ツール
開発ツール/2026-07-11上級

端末の時計は動かせる — 日替わり機能とトライアル判定を時刻操作から守る設計

端末の時計を進めるだけで日替わり特典を先取りできてしまう——壁紙アプリのログで見つけた実例を起点に、壁時計・単調時計・サーバー時刻の3層で時刻源を使い分け、時計の巻き戻しにも耐える日替わりロジックとトライアル判定の設計をまとめました。

Rork501アプリ開発76設計7時刻同期サブスクリプション62

プレミアム記事

日替わりで壁紙を1枚配信する機能のログを眺めていて、妙な行があることに気づきました。同じ端末が、1日のうちに「今日の壁紙」を3回受け取っています。

原因は単純でした。端末の設定で日付を1日進めると、アプリは素直に「日付が変わった」と判断して翌日分を配ってしまう。戻してまた進めれば、何枚でも先取りできます。

悪意と呼ぶほどのものではないのだと思います。ただ、この挙動を放置したまま「7日連続ログインで特典」や「無料トライアル期限」を同じ時計の上に載せると、影響はチケットの先取りでは済まなくなります。個人開発で複数のアプリを運用してきた経験から、端末時刻を信用しない設計を最初から入れておくことの価値を、私は強く感じております。

Rork で生成したアプリも例外ではありません。生成されたコードの日付処理は Date.now()new Date() を素直に使っており、端末の設定変更にそのまま追従します。今回は、この前提を踏まえた時刻まわりの設計をまとめていきます。

端末時刻がずれる4つの経路と、そのとき壊れるもの

まず、端末の壁時計(wall clock)が「正しい現在時刻」から離れる経路を整理しておきます。

経路ずれ幅の目安壊れやすい機能
ユーザーの手動変更数分〜数年(意図的)日替わり特典、連続ログイン、期限つきクーポン
タイムゾーン移動・DST±1〜14時間「今日」の境界判定、通知のスケジュール
NTP 同期の失敗・遅延数秒〜数分署名検証のタイムスタンプ照合、ログの並び順
電池切れ・初期化直後数日〜数年(過去方向)証明書検証、キャッシュの有効期限判定

運用中のアプリで計測してみると、サーバー時刻との乖離が5分を超える端末は全体の1%弱で常に存在していました。24時間以上ずれた端末も、月に数十台の規模で観測されます。ゼロにはなりません。ずれた端末は常にいる、という前提で設計する必要があります。

意図的な変更に限っていえば、動機の大半は「待ち時間のスキップ」です。日替わり配布、リワード広告のクールダウン、体力回復。時間で価値を区切る機能を持つアプリほど、時計は動かされます。

時刻の3層モデル — 壁時計・単調時計・サーバー時刻

対策の骨格は、用途ごとに時刻源を使い分けることです。私は次の3層で考えるようにしております。

時刻源取得方法性質向く用途
壁時計Date.now()ユーザーが自由に動かせる。表示用としては正しい画面への時刻表示、ローカル通知の発火時刻
単調時計performance.now()(プロセス内)起動からの経過時間。巻き戻らないが、再起動でリセット処理時間の計測、セッション内のクールダウン
サーバー時刻API 応答の Date ヘッダ等改ざん不可。ただしオフライン時は取れない日替わり判定、期限判定、特典付与

ポイントは「壁時計が悪者なのではない」ということです。ユーザーへの表示や、端末の生活時間に合わせるローカル通知には、壁時計こそが正解です。壊れるのは、価値の付与や期限の判定を壁時計に任せたときだけです。

単調時計は中間の存在です。React Native の performance.now() はプロセス内では巻き戻りませんが、アプリを完全終了すればリセットされます。「セッション内で60秒に1回まで」のような短いクールダウンには十分で、日をまたぐ判定には使えません。

つまり、日替わりや期限のような「日をまたぐ価値の判定」は、サーバー時刻に寄せるしかない。次はその実装です。

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

この記事の続きを読む

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

この記事で得られること
壁時計・単調時計・サーバー時刻の3層モデルと、機能ごとにどの時刻源を選ぶかをまとめた判断表
Cloudflare Worker の Date ヘッダを利用したサーバー時刻オフセット管理と、Expo でそのまま動く時刻プロバイダの実装
時計を巻き戻した端末でも壊れない日替わり判定の書き方と、ローカル実装の無料トライアルを避けるべき理由
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-04-21
Rork で作ったアプリに『ちゃんとした設定画面』を実装する — 通知・購読管理・法定表示の実装ガイド
Rork で作ったアプリの設定画面を実用レベルに仕上げる実装パターンを、通知・購読プラン管理・法定表示・サポート導線の観点から、実コードとともに丁寧に解説します。
開発ツール2026-07-07
どの生成でこの不具合が入ったのか — Rork アプリに生成来歴を刻む長期運用設計
AI ビルダーで同じ画面を何度も作り直していると、ある日現れた不具合がどの生成で入ったのか追えなくなります。ビルドスタンプ・生成台帳・テレメトリ埋め込みの3層で生成来歴を残し、リグレッションを世代単位で絞り込む設計をまとめました。
開発ツール2026-06-28
設定画面を1枚のスキーマから組み立て、複数アプリで使い回す
設定画面をアプリごとに手作業で作ると、運用するアプリが増えるほど破綻します。宣言的なスキーマから画面を組み立て、複数アプリで共通の土台を共有する設計を、動くコードとともに整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →