すべての記事
EAS Update を入れたのに『直したはずのバグ』が消えないとき — OTA が静かに届かない原因と運用メモ
EAS Update を導入しても OTA が一部のユーザーに届かないことがあります。runtimeVersion のドリフト、配信したのに採用されない更新、安全なロールバックの選び方を、Rork アプリの運用で実際に効いた計装とともに整理します。
発熱と省電力モードに合わせて、重い処理を静かに落とす設計
ProcessInfoのthermalStateと省電力モードを監視し、発熱時やバッテリー残量が少ないときに重い処理を段階的に落とす設計です。品質レベルを一箇所で決めて各機能をティアに従わせる実装、実機での確認方法までをSwiftのコードとともに整理します。
呼吸の波に合わせて静かに震える、瞑想アプリの触覚をCoreHapticsで作る
expo-haptics の決まった振動では呼吸の「波」が作れません。CoreHaptics の連続イベントとパラメータカーブを Expo ネイティブモジュールから呼び出し、4-7-8 呼吸に同期した触覚を作る実装を、Swift と TypeScript のコードとともに整理します。
オフラインで書いた投稿が、復帰した瞬間にもう一つ増える——再送に強い送信アウトボックスの設計
オフラインで書いた投稿が復帰時に二重登録される問題を防ぐ、送信アウトボックスの設計です。生成時に一度だけ決める冪等キー、SQLiteへの永続化、一時IDの付け替え、毒メッセージの隔離までを、動くTypeScriptコードとともに組み立てます。再送だけでは安全にならない理由から説明します。
「視差効果を減らす」をオンにした人に、アニメーションをどう返すか — Expo で Reduce Motion を尊重する層を作る
iOS の「視差効果を減らす」/ Android の「アニメーションを削除」をオンにした利用者に、アニメーションをどう出し分けるか。AccessibilityInfo と Reanimated の ReduceMotion を組み合わせ、消すのではなく「穏やかな代替」を返す実装層を作ります。
ゲーミフィケーションでDAUは増えたのに継続率が動かなかった — Rork運用で効いた設計の立て直し
ポイント・バッジ・リーダーボードを入れるとDAUは上がりますが、継続率は別物です。サーバー権威のポイント台帳、燃え尽きないストリーク、新規を萎えさせないリーグ設計まで、Rork運用で効いた立て直しを実装コード付きで整理します。
価格が一部の端末だけ「¥1234」になる——Expo の Intl を信用しきらないフォーマット層の作り方
同じコードなのに、ある端末では「¥1,234」、別の端末では「¥1234」。Expo / Hermes の Intl は端末とOSのロケールデータに依存して出力が変わります。通貨・数値・日付・タイムゾーンを1ファイルに集約し、Intl が欠ける端末へ安全に後退するフォーマット層の設計を、動くコードで整理しました。
アプリスイッチャーに個人的な画面が残る——背景へ回した瞬間のスナップショットを隠す設計
Rork が生成した React Native アプリをホームに戻すと、iOS はその瞬間の画面をアプリスイッチャー用に撮影してディスクに保存します。手記や個人的な入力画面はそこに残り、第三者の目に触れます。iOS の目隠しオーバーレイ(inactive で出す理由)、Android の FLAG_SECURE、機密画面だけに絞る方法、スクショ検知までを動くコードで示します。
壊れたキャッシュで毎回起動時に落ちるアプリ——ユーザーが自力で抜け出せる「セーフモード起動」を設計する
永続化したキャッシュが壊れて起動のたびに同じ場所で落ちると、ユーザーには再インストールしか残りません。アプリ自身が早期クラッシュの連続を数え、対話可能になって初めて起動を確定し、危険な状態だけを段階的にリセットするセーフモードを、Expo(React Native)の実装で設計します。
毎朝違う一言を出す日替わりリマインダーが、ある日から鳴らなくなる——iOSの保留64件という見えない上限
Rork(Expo)で作った日替わりリマインダーが、しばらく経つと無言で止まる原因はiOSの保留通知64件上限です。固定文言のカレンダートリガーと、日替わりコンテンツのローリング再スケジュールを動くコードで設計し、サマータイムや複数リマインダー併用でも狂わない通知を組みます。
Rork(Expo)のトーストは、重なっても読み上げられても崩れない設計にする
Rork が生成した React Native アプリにトースト通知を足すとき、単純な実装は『同時に2つ出ると重なる』『スクリーンリーダーに無視される』『ノッチやホームインジケータに隠れる』の3点で破綻します。ルート1か所に置くキュー設計、本体の再レンダーから切り離すアニメーション、AccessibilityInfo による読み上げ、セーフエリア対応までを動くコードで示します。
無印 Rork と Rork Max を1つのバックエンドで支える — 旧バイナリを壊さない API レスポンス契約の設計
無印 Rork(React Native / Expo)と Rork Max(ネイティブ Swift)が同じ Cloudflare Workers バックエンドを叩く構成では、強制アップデートできない旧バイナリを壊さないことが設計の中心になります。レスポンスを封筒型にして加算のみで育て、能力フラグでクライアント差を吸収し、古いバージョンを安全に畳むまでを実装で示します。