LoginSignup
5
2

More than 1 year has passed since last update.

Proxyman for iOS を使う!

Last updated at Posted at 2022-06-21

前回の記事が地味にじわじわヒッソリとLGTM頂いているのでここでもう一つ、iOS実機で使用する方法を実際に使用しながら検証し記事に起こしてみた。

最終的にわかったことで結論から言うと、
iOS上でMap/Breakpoint/Scriptingなどでプロキシできることを期待していたが、
実際はレスポンス内容を見たり、コピーしたりすることしかできなかった......
というサゲでした。

image.png
https://proxyman.io/ios

COMING SOON....
うーん、やられた。。
年間でライセンス更新しないといけないのでCOMING SOONとロックアイコン無くなってからライセンス更新したほうが良いと思う。。(2022/06/21現在)

じゃあなんで存在してるんだっていうと

  • 全てのトラフィック、ネットワークアクティビティを監視できる!
  • macOS版とシームレスにログ共有できる!

が今のところふれ込みのようで今後、デバッギングツールとしての発展を期待するしかなさそう。

目的が達成できなかったのが残念だが、とりあえずはレスポンス内容確認とかできるところまで記した内容を公開しておきます。。

iOSアプリのインストール

Proxyman for iOS は無料でインストール可能。
ただし、iOS上で機能をフルに使用する場合 有料ライセンスを購入する必要がある。

ライセンス更新

私のライセンスは3月に切れてしまっていたのでmacOSアプリの方でRenewする。
ライセンスキーってどこにあるか?
→ 登録メールアドレス宛に初回登録時に「[Proxyman] License Key」というタイトルで PXM- から始まるキー情報が来ていると思うのでそれをコピーしておく。

  1. Proxyman > License... ウインドウを開く
  2. Expiredしている旨のメッセージ横にある「Renew」ボタンを押す
  3. ライセンスキーを入力
  4. その後の決済処理を済ます

更新完了
q_proxyman_ios_0.png

設定してみる

自分のアプリの通信をキャプチャ可能にしておく

Proxyman for iOSを起動するとHome画面はこんな感じ。
q_proxyman_ios_1.png

Moreタブを選択して「Capture Traffic」をONにする

before after
q_proxyman_ios_2.png q_proxyman_ios_2-1.png

自分のアプリの通信がキャプチャされるか試す

  1. 自分のアプリを起動する
  2. 何か通信してみる
1 2
q_proxyman_ios_3.png q_proxyman_ios_3-1.png

因みに自分のアプリのソースはSwiftUIで以下のように中央に配置したボタンを押したら script.google.com 通して固定のJSONを返すマクロ実行するだけのサンプルアプリ

import SwiftUI

struct ContentView: View {
    var body: some View {
        Spacer(minLength: 100)
        VStack {
            HStack {
                Spacer(minLength: 100)
                Button("Send") {
                    let url = URL(string: "https://script.google.com/macros/s/<ID>/exec")!  // <ID>には72桁の任意のIDが入ります
                    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                        if let error = error {
                            print("Error: \(error.localizedDescription) \n")
                            return
                        }
                        
                        guard let data = data, let response = response as? HTTPURLResponse else {
                            print("No data or No response")
                            return
                        }

                        if response.statusCode == 200 {
                            let string = String(data: data, encoding: .utf8)
                            print(string)
                        } else {
                            // レスポンスのステータスコードが200でない場合などはサーバサイドエラー
                            print("サーバエラー ステータスコード: \(response.statusCode)\n")
                        }
                    }
                    task.resume()
                }
                Spacer(minLength: 100)
            }
        }
        Spacer(minLength: 100)
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Google Apps Scriptの方では↓のようなレスポンスを返すようにしている。

function doGet(e) {
  return ContentService.createTextOutput(JSON.stringify({'items': [{"id": "0", "name": "Zero"}, {"id": "1", "name": "One"}, {"id": "2", "name": "Two"}]}))
    .setMimeType(ContentService.MimeType.JSON);
}

証明書関連を設定しておく

これ系アプリの中でおそらく最も重要なステップ

項目 スクショ
1 More > Certificate に移動 q_proxyman_ios_4-1.png
2 ウォークスルー画面使って設定するか聞いてくる(選択肢ないけど) q_proxyman_ios_4-2.png
3 ウォークスルー画面1 q_proxyman_ios_4-3.png
4 ウォークスルー画面2
SSL証明書ダウンロードのため表示されているように「Allow」を選択してダウンロードする
q_proxyman_ios_4-4.png
5 ウォークスルー画面3
ダウンロードされたら表示されているようにインストールする
q_proxyman_ios_4-5.png
6 iOS設定 > 一般
最下部の「証明書信頼設定」 該当する証明書をONに

Get Startedして画面が戻る。
「All Good!」は押しても特にアクションはない。

レスポンス確認

macOS版とは異なり、プロセスごとのまとまりはない模様でHome画面でホストごとの一覧となっている。

暗号化を解く

まずはSSL証明書を有効化して、レスポンスを確認する

項目 スクショ
1 前述のサンプルアプリで通信を行うと script.googleusercontent.com がリストに出てくるので選択する。
2 認識はされているが、暗号化されていて内容が確認できない状態
3 選択すると、Request/Responseが確認できる。「View Body」を見るとSSLプロキシを有効化するメッセージが表示されているので有効化する
4 再度、サンプルアプリで通信を行うと正常にキャプチャされていることがわかる

今回は目的が達成できなかったのでここまで。
続きはProxyman for iOSで Map Local/Breakpoint/Scriptingに対応してから続きを書こうと思う。
無念。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2