前回の記事が地味にじわじわヒッソリとLGTM頂いているのでここでもう一つ、iOS実機で使用する方法を実際に使用しながら検証し記事に起こしてみた。
最終的にわかったことで結論から言うと、
iOS上でMap/Breakpoint/Scriptingなどでプロキシできることを期待していたが、
実際はレスポンス内容を見たり、コピーしたりすることしかできなかった......
というサゲでした。
COMING SOON....
うーん、やられた。。
年間でライセンス更新しないといけないのでCOMING SOONとロックアイコン無くなってからライセンス更新したほうが良いと思う。。(2022/06/21現在)
じゃあなんで存在してるんだっていうと
- 全てのトラフィック、ネットワークアクティビティを監視できる!
- macOS版とシームレスにログ共有できる!
が今のところふれ込みのようで今後、デバッギングツールとしての発展を期待するしかなさそう。
目的が達成できなかったのが残念だが、とりあえずはレスポンス内容確認とかできるところまで記した内容を公開しておきます。。
iOSアプリのインストール
Proxyman for iOS は無料でインストール可能。
ただし、iOS上で機能をフルに使用する場合 有料ライセンスを購入する必要がある。
ライセンス更新
私のライセンスは3月に切れてしまっていたのでmacOSアプリの方でRenewする。
ライセンスキーってどこにあるか?
→ 登録メールアドレス宛に初回登録時に「[Proxyman] License Key」というタイトルで PXM-
から始まるキー情報が来ていると思うのでそれをコピーしておく。
- Proxyman > License... ウインドウを開く
- Expiredしている旨のメッセージ横にある「Renew」ボタンを押す
- ライセンスキーを入力
- その後の決済処理を済ます
設定してみる
自分のアプリの通信をキャプチャ可能にしておく
Proxyman for iOSを起動するとHome画面はこんな感じ。
Moreタブを選択して「Capture Traffic」をONにする
before | after |
---|---|
![]() |
![]() |
自分のアプリの通信がキャプチャされるか試す
- 自分のアプリを起動する
- 何か通信してみる
1 | 2 |
---|---|
![]() |
![]() |
因みに自分のアプリのソースは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);
}
証明書関連を設定しておく
これ系アプリの中でおそらく最も重要なステップ
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に対応してから続きを書こうと思う。
無念。