スマホの中のWebページを、パソコンからデバッグ

パソコンのブラウザでF12を押すのと同じ感覚で、iOS・Androidの実機で開いているページをリモートデバッグ——ブラウザのタブも、アプリ内に埋め込まれたWebView / H5も。要素の検証、コンソールのエラー、ソースのブレークポイント、ネットワークリクエスト、Cookieとローカルストレージ。

  • アプリ内WebViewの通信を取得
  • スマホブラウザの通信を取得
  • 端末画面をパネルの横に表示
  • アプリの改修・再ビルド不要
AndroidのページをWebインスペクタでデバッグ:左に端末画面のミラーリング、右にDOMツリーとライブCSSのElementsパネル
左がライブの端末画面、右がElementsパネルと算出スタイル。ノードを選ぶと実機側でハイライトされます。

スマホのWebデバッグ、遠回りはもう不要

以下はスマホのページをデバッグする日常そのもの。左の列が、いつものやり方です。

やりたいこといつものやり方Webインスペクタなら
スマホでだけレイアウトが崩れる直し方を推測してビルドし直し、デプロイしてまた確認要素とCSSをその場で編集し、端末が即座に再描画するのを見る
真っ白な画面、押しても反応しないボタンスマホにコンソールがなく、alertやログを仕込むページが投げたとおりのエラーとログがConsoleに
どの行のJavaScriptがこのリクエストを出したのかキャプチャツールはリクエストしか見せず、呼び出し元は分からないSourcesでブレークポイントとステップ実行、変数もその場で確認
Cookieやローカルストレージの中身を確かめたいリクエストヘッダから推測する名前・値・ドメイン・有効期限・Secure・HttpOnly・SameSiteを一覧表示、編集も可能
アプリに埋め込まれたH5ページをデバッグする通信に埋もれ、そもそも接続する手段がない所属アプリごとに一覧表示。選べば普通のページと同じようにデバッグ
そもそもリモートデバッグを動かすまでプラットフォームごとの設定、奥に隠れた入口、細かな手順ダイアログひとつ:端末を選び、ページを選び、デバッグを押すだけ
通信とページの状態を突き合わせたいキャプチャツールとデバッガを別々に並べるひとつのツールで完結:復号済みのリクエストと、それを出したコード

簡易ビューアではなく、本物の開発者ツール

デスクトップで毎日使っているのと同じパネルが、スマホで動いているページにつながります。

Elements:見て、その場で直す

ページのライブDOMツリーに、算出スタイル・継承・ボックスモデル。値を変えれば端末が即座に再描画します。モバイルのレイアウト崩れを突き止める最短ルートです。

Console:エラーとライブREPL

ページが出したエラーとログのすべて。さらにプロンプトから、その端末のそのページの中で自分のJavaScriptを実行できます。alert()デバッグはもう不要です。

Sources:ブレークポイントとステップ実行

読み込まれたスクリプトとスタイルシートを辿り、ブレークポイントを置き、コールスタックをたどり、問題が起きたその瞬間の変数を確認できます。

Network:すべてのリクエストをウォーターフォールで

ステータス、種類、発生元、サイズ、タイミング、キャッシュ状態をリクエストごとに表示。リクエスト数、転送量、DOMContentLoaded、総ロード時間の集計も。

Storage:Cookie・ローカル・セッション

ドメインごとのCookieに有効期限、Secure、HttpOnly、SameSite。localStorageとsessionStorageも隣に並び、ログイン状態の不具合を解くのが一番速い場所です。

端末の画面を、あなたの画面に

Androidではライブのページ画面がパネルの横に映り、マウスでクリックやスクロールができます。スマホとキーボードを持ち替えず、1画面で検証と操作が完結します。

実際の画面

実機につないで撮った、そのままの画面です。

Android端末のページのリクエストをステータス・種類・発生元・サイズ・タイミングとともに表示するNetworkパネル
ページが出したすべてのリクエストをウォーターフォールで。ステータス、種類、発生元、サイズ、タイミング、キャッシュヒット、下部にはロードの集計。
iPhoneで開いたページのリソースをドメインと種類ごとに一覧するWebインスペクタのNetworkパネル
iOS:iPhoneで開いたページも同じビュー。ドメインと種類ごとのリソース、転送サイズとタイミング付き。
iPhoneで開いたサイトのCookieを値・ドメイン・有効期限・Secure・HttpOnly・SameSite列で表示するStorageパネル
端末上のページのCookie、localStorage、sessionStorage。すべてのフラグが見え、編集もできます。

デバッグできる対象

スマホ、タブレット、エミュレータとシミュレータ、そしてこのPCのブラウザ。

このPCiOSAndroid
ブラウザのタブ
アプリ内のページ(WebView / WKWebView / H5)
エミュレータ/シミュレータ
要素とスタイルをライブで検証・編集
Console、ブレークポイント、ステップ実行
ページ単位のネットワークウォーターフォール
Cookie / localStorage / sessionStorage
端末画面をパネルの横に表示
証明書もプロキシ設定も不要

はじめる前の、一度きりの準備

下の3つは並列です。自分が調べたい対象のものだけ、一度やれば済みます。

iOS端末

ケーブルでつなぎ、ロックを解除したままに。Safariは「設定 → Safari → 詳細 → Webインスペクタ」、Chromeは「Chrome設定 → コンテンツの設定 → Webインスペクタ」をオン。

Android端末

ケーブルでつなぎ、開発者向けオプションでUSBデバッグをオン。エミュレータはケーブルなしでも自動で見つかります。

パソコンのブラウザ

--remote-debugging-port=9222 を付けてChromeまたはEdgeを起動し、ページ一覧で更新を押します。

アプリ内のページも調べる? もうひとつだけ

ブラウザのタブだけなら不要です。自分のアプリ:Androidは setWebContentsDebuggingEnabled(true) を一度呼ぶ、iOS 16.4以降はWKWebViewに isInspectable = true を設定。他人のアプリ、またはコードを変えたくない場合:「アプリ内のページも含める」にチェックすると、起動中のアプリ内のページも一覧に出ます——AndroidはRoot必須、iOSは開発署名のアプリのみ。

準備が済めば、毎回やるのはこれだけ

新規キャプチャ → ターゲット(このPC / iOS / Android)→ 方式「Webインスペクタ」→ 更新 → ページを選ぶ → 「Inspect」。ブラウザに完全な開発者ツールが開きます。いくつでも同時に開けます。

Trace Eagleの新規キャプチャ画面でAndroidとWebインスペクタを選び、接続端末のデバッグ可能なページを一覧している様子
Androidの手順:端末を選び、アプリ内H5が必要なら「アプリ内のページも含める」にチェック、ページを選んでデバッグ。
Trace Eagleの新規キャプチャ画面でiOSとWebインスペクタを選び、接続したiPhoneのデバッグ可能なページを一覧している様子
iOSの手順:同じ3項目に加えて、端末のロック解除と設定でのWebインスペクタ有効化のリマインド。

アプリの中に隠れたページも

今のアプリは半分ネイティブ、半分Web。厄介なバグはたいてい埋め込みのH5ページにあり、そこは普通のツールでは何も見えません。

所属アプリごとに整理

ページ一覧はアプリ単位。アプリ内の決済ページとブラウザのタブが一目で区別でき、狙ったページだけに接続できます。

チェックひとつ

「アプリ内のページも含める」にチェックすると、起動中のアプリの中で動いているページが一覧に加わります。外せばブラウザのタブだけに戻ります。

何も残さない

アプリの再ビルドも署名も、端末への常駐ツールのインストールも不要。セッションが終われば、端末は元どおりです。

パケットキャプチャと組み合わせて

ここでページをデバッグしつつ、同じツールで同じアプリの通信をキャプチャ。証明書ピンニングやプロキシを無視するアプリでもHTTPSを復号します。

スマホのWebデバッグ:よくある質問

スマホで「要素を検証」するには?

スマホをUSBでPCにつなぎ、Trace Eagleで新規キャプチャ → iOSまたはAndroid → 方式「Webインスペクタ」を選び、ページを選んでデバッグを押します。デスクトップに完全なElementsパネルが開き、端末のページのライブDOMとCSSが表示されます。ここで値を変えれば、スマホ側の表示が即座に変わります。

アプリを改造せずにAndroid WebViewをデバッグできますか?

できます。すでにデバッグを許可しているWebViewはそのまま一覧に出ます。公開していないアプリでも「アプリ内のページも含める」にチェックすれば、起動中のアプリ内のページが一覧に加わります。これにはroot化された端末が必要ですが、アプリの再ビルドや再パッケージ、恒久的なインストールは一切ありません。

iPhoneやiPadのWebページはどうデバッグしますか?

端末を接続してロックを解除し、設定 → Safari → 詳細 → Webインスペクタ(またはChrome設定 → コンテンツ設定 → Webインスペクタ)を有効にします。あとはTrace Eagleで端末とページを選び、デバッグを押すだけ。Elements、Console、Sources、Network、Storage、Layersなどを備えた完全なWebインスペクタがデスクトップのブラウザに開きます。

chrome://inspect と同じものですか?

同じ役割をこなし、さらに広くカバーします。ブラウザ内蔵のリモートデバッグはAndroid上のChromiumターゲットだけですが、ここではiOS・Android・ローカルブラウザが同じ選択画面に並び、ページはアプリごとに整理され、アプリ内H5はチェックひとつで追加でき、しかも同じアプリのHTTPS通信を復号できるキャプチャ機能がすぐ隣にあります。

脱獄やroot化は必要ですか?

通常のデバッグには不要です。ブラウザのタブや、すでにデバッグを許可しているアプリなら、素の端末で動きます。root化されたAndroid端末が必要なのは「サードパーティアプリ内のページも一覧に加える」オプションだけで、iOSではどのアプリを含められるかはシステムが決めます。

証明書やプロキシ、アプリへのSDK追加は必要ですか?

どれも不要です。実機リモートデバッグはUSB接続を経由するため、プロキシ設定も、端末へのルート証明書のインストールも、アプリへのSDKやライブラリの追加も要りません。

パケットキャプチャとは何が違いますか?

キャプチャは「ネットワークに何が流れたか」に答えます。リクエスト、レスポンス、ヘッダ、ボディを復号して見せます。Webインスペクタは「ページで何が起きたか」に答えます。DOM、スタイル、Consoleのエラー、どのスクリプトがそのリクエストを出したか、その前にCookieやストレージに何が入っていたか。Trace Eagleは両方を備えているので、ツールを切り替えずに行き来できます。

デバッグ画面はどのブラウザで開きますか?

AndroidとローカルブラウザのセッションはChrome、Edge、Braveで開きます(Trace Eagleが自動で起動します)。iOSのセッションはどのブラウザでも動作します。

エミュレータやシミュレータでも使えますか?

使えます。Androidエミュレータはケーブルなしでも通常は自動検出され、PC上のiOSシミュレータも認識されます。手順は実機とまったく同じです。

Webインスペクタは無料ですか?

無料です。Trace Eagleの他の機能と同じく完全無料で、macOS・Windows・Linuxで使え、機能制限もありません。

2分後には、スマホのそのページをデバッグしています