◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-07-11上級

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

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

Rork577アプリ開発76設計10時刻同期サブスクリプション65

✦ プレミアム記事

日替わりで壁紙を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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-06-22
壊れたキャッシュで毎回起動時に落ちるアプリ——ユーザーが自力で抜け出せる「セーフモード起動」を設計する
永続化したキャッシュが壊れて起動のたびに同じ場所で落ちると、ユーザーには再インストールしか残りません。アプリ自身が早期クラッシュの連続を数え、対話可能になって初めて起動を確定し、危険な状態だけを段階的にリセットするセーフモードを、Expo(React Native)の実装で設計します。
⬡ 開発ツール2026-04-28
Family Sharing で IAP が消える4つのトリガー — Rork で子ども向けアプリの課金を安全に設計する
Family Sharing 経由の購入で IAP 収益が突然消える原因と、Rork で実装する StoreKit 2・Server Notifications V2 を組み合わせた安全な課金設計を、実コードとテスト手順まで網羅的に解説します。
⬡ 開発ツール2026-10-07
日本語の見出しだけ太字にならない — Android で fontWeight が効かないときの切り分けと直し方
Rork で作ったアプリで、iPhone では太字なのに Android では日本語の見出しが細いままになる症状の切り分け記事です。原因の見分け方、fontFamily を重みごとに分ける直し方、確認用コードを載せています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます