Fiddlerを使って開発中iPhoneアプリの通信先をローカルにするよ

# 前置き
つい最近、久しぶりにアプリ通信をしないとロクに確認できない開発があったもので、ちょっくら設定してやろうかと思ったらやたら困ったので備忘として。

内容はタイトルの通りなので、知ってる人（特にもう出来てる人）には多分に関係ない記事です。。

でも絶対に自分はまた同じことで悩むんだろうなぁ(ノД`)ｱﾁｬｰ、というのが見えてたので残しておくわけです。。

# 環境
Windows10
Fiddler（v4.6.20171.14978）
iPhone6（iOS10.3.2）


# iPhoneの通信をFiddlerからのぞいてみるよ
ここら辺は、[公式ドキュメント](http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureForiOS)も用意されてるし、結構いろんな方が書いていらっしゃるので割愛。
なお、自分が参考にしたのは@hikomaさんが投稿してくださった↓の記事（2つ目は1つ目の続き）

[iPhone から開発マシンの localhost にアクセスする（Windows）](http://qiita.com/hikoma/items/2c983a521ba2dae5972b)
[Fiddler で iPhone の Https 通信の中身を見る](http://qiita.com/hikoma/items/d8e1335a426ade199304)

もしこれで「出来た！(´▽｀)」って方は**おめでとう！この先は必要ないよ！**


# まぁ、出来なかったわけですよ自分はね(ノД`)・゜・。
・・・・と書くと語弊があるんだけど。。
どうなっていたかというと・・・・

| チェックリスト | ○ or × |
| :----------:  | :----: |
| SafariからのHTTP通信は見れた？ | **はい♪(´▽｀)** |
| SafariからのHTTPS通信はどう？ | うーん……まぁまぁ？(´・ω・`) |
| じゃあアプリの方は？ | ・・・・繋がらない(´；ω；`) |

という状況。
要は、**アプリからの通信が出来ず、ネットワークエラーになって死ぬ**状態。
Fiddlerの証明書を消しては入れ、消しては入れをしても当然ダメ。
あげく

ME「FiddlerのExtensionsに『CertMaker for iOS and Android』がない。
　　インストールがミスってるんじゃね・・・・！(; ･`д･´)」

と思ってアンインストールからのインストールをしてみたり、

ME「よく分からないときは再起動しちゃえばいいじゃなぁーい( ゜▽ 。；)」

とPCごと再起動してみたりしたけど、当然成果なんてモンはなかった・・・・orz


# 投げ出したいけど、これ仕事だからさ・・・・
ME「証明書もいれたのになんでさー・・・・(´・ω・｀)」
Google先生（以下、先生）「まぁまぁ、きっとちょっとしたことが抜けてるだけさ(^。^)y-.。o○」

と、心の会話でGoogle先生に慰めてもらいつつググる。
で、見つけたのが↓の記事。

[Fiddler not working with iOS 10.3 version](https://fiddler.ideas.aha.io/ideas/FID-I-156)

```plaintext:リンク先1コメ意訳
いや、なに試したのか分かんないし、何の話してんのかも微妙だけどさ・・・・。
iOSにある 設定アプリ＞一般＞情報＞証明書信頼設定で有効にしてみたかい？
ダイアログでるけど「続ける」選んだらいいよ
```

そ・・・
**それだーー！(； ﾟДﾟ)**
やってねぇよそんなこと！ていうか、そんなん初めて聴いたよ！

<img width="375" alt="IMG_2062.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78619/b03f2ade-a367-38cb-c621-b14dde1c5e4f.png">

そら見たことか！(ノД`)・゜・。
で、書いてあった通りにスライドバーをタップしてみる。

<img width="375" alt="IMG_2061.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78619/253208a9-62b5-fe70-0127-c19d976e498f.png">

ははーん、コレが言ってたダイアログか。
まぁ、それを目的にいれてるわけだから当然「続ける」をタップ( 一一)σ

<img width="375" alt="IMG_2063.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78619/d1f03c1c-05ff-1fed-f018-3cdb33c918b6.png">

これでちゃぁーんとSafari＋キャプチャが取れるようになった！

ME「さすがですね先生！尊敬しちゃうなぁ！(´▽｀)」
先生「いや、まぐれだよま☆ぐ☆れ、ﾌﾌｯ」

なんて心の会話を進めつつ、ウキウキでアプリを開く。

# 君は・・・・砕け散った・・・・
繋がんね・・・・(ノД`)・゜・。


や、キャプチャは取れてんだけどね・・・・

```
予期しないパケット形式のため、ハンドシェイクに失敗しました。（無慈悲）
```

て感じの結果なわけですよ。。

ME「コレ、観たいんですけど・・・・(´・ω・｀)」
Fiddler「そう言われてもねぇダンナ、無理なんですよ（ ´＿ゝ｀）」
ME「え・・・・でも観たい・・・・(´・ω・｀)」
Fiddler「ダンナぁ・・・・こっちも商売なんだ、出来ないものは出来ないんですよ（ ´,＿ゝ｀）ﾌﾟｯ」
ME「・・・・グ、ググ、グーグルせんせーいぃぃ！(((´；ω；｀))))」
先生「どーしたんだい、のび(ry」

先のウキウキがあったせいで、頭の中でしょーもない寸劇が始まっちゃったけど、とりあえず置いといてまたググる。

でもこれがなかなか見つかりませんで、、、
検索キーワードに「Fiddler」と入れてんのに、Fiddlerとは関係ないモノばかり出てくる状況で。。

![235.png](https://qiita-image-store.s3.amazonaws.com/0/78619/f0f84338-3f63-745d-3ceb-dbf351374373.png)

・・・・((((´；ω；｀)))))ｳｰ


# やりました！
でもそこはグーグル先生。
ちょっと意地悪だけど、

先生「しょうがないにゃあ・・・・ｺﾞｿｺﾞｿ」

と、最後にはちゃんと教えてくれる憎いアイツ。

[Fiddler is not showing HTTPS traffic](https://stackoverflow.com/questions/24944280/fiddler-is-not-showing-https-traffic)

**それを・・・・待っていたーーー！(ﾟ∀ﾟ)**

・・・・はい、冗談抜きに書くとですね。
何で通信出来ないんだろうと改めてみたとき、まず最初のトンネル開けるところで死んでるんですよみんな。
こっちがやりたい通信のだいぶ前、通信を確立するところで返り討ち。まさに門前払いだったわけです。
それが分かれば、当然みんなやりたいことは決まってるわけで。

**トンネルのところだけスルーしたい**

と考えるわけで。
なので「Fiddler tunnel to」とかでググってみた次第。
その結果、出てきたのが先のリンクでした。

```javascript:リンク先回答（抜粋）
if (oSession.HTTPMethodIs("CONNECT") && oSession.HostnameIs("BuggySite.com")) 
{ 
  oSession["https-DropSNIAlerts"] = "yup"; 
  FiddlerApplication.Log.LogString("Legacy compat applied for request to BuggySite.com"); 
}
```

このIF文を使えば、トンネルをスルーして通信することが出来るわけですよ。

ME     「こんなん用意したけど・・・・これで通れるよね？(´・ω・｀；)」
Fiddler「・・・・（ ´＿ゝ｀）」
ME     「・・・・(((´・ω・｀；))))」
Fiddler「・・・・へ、ダンナには敵わねぇなぁ・・・・（ ；´,＿ゝ｀）ﾌｯ」
ME     「・・・・！(´・▽・｀；)」

てなもんですよ。


# で、最終的には
・・・・の前に。

申し訳ない、わたくしウソをついておりまして・・・・(´・ω・｀)
やりたいことはタイトル＋αだったりして、、、(^-^;

旧）アプリの通信先をローカルにしたい
新）アプリの**元々はHTTPSな**通信先を**HTTPな**ローカルにしたい

こんな＋αまで叶えようとした結果、こんな子ができました↓

```javascript
if (oSession.HostnameIs("BuggySite.com")) {
    if (oSession.HTTPMethodIs("CONNECT")) {
        oSession["https-DropSNIAlerts"] = "yup";
        FiddlerApplication.Log.LogString("Legacy compat applied for request to BuggySite.com");
        return;
    }
    oSession.fullUrl = "http://Local.BuggySite.com" + oSession.PathAndQuery;
}
```

ログ出力は先人に敬意を表する気持ちで残しておいたよ。

で、無事にトンネルを抜けてやりたい通信が出来ました！(ﾟ∀ﾟ)ﾋｬｯﾊｰ

// や、実はこの後も悩んだんだけどさ、、、
// それはPJ固有の問題だから気にしないで・・・・(´・ω・｀；)



どこかの誰か（訳：数年後の自分）の役に立っていただければ幸いでございます。


# 余談
## Fiddlerスクリプトが変わってた
前置きで「久しぶりに」と書いてましたが、本件のようにiPhoneの通信を書き換えて開発してたのって、実は数年前のことでして。
その頃の書き方とちょっと変わってて地味に四苦八苦してましたσ(^-^;）

* ホスト書換
    * 旧）~oSession["X-OverrideHost"]
    * 新）oSession["x-overridehost"]

* ホスト判定
    * 旧）~oSession.host.indexOf('localhost') > -1
    * 新）oSession.HostnameIs("localhost")

いや、文明は知らない内に進んでいくものですな(-∀-)y-゜゜゜

## Fiddlerの検索結果が充実してた
Web系開発者なもんで、Fiddlerは普段の業務でちょくちょく使ってるものの、あくまで通信のキャプチャリングのみ。
こうやってスクリプトまでいじってやることが久しぶりだったので、すっかり忘れておりまして。。
なもんでFiddler関係でググってたんだけど、昔に比べて実用的な情報が日本語でも出てきてて吃驚しました( ﾟДﾟ)

前は

**Fiddlerすごい！**
**Fiddler使って！**

・・・・な記事ばかりで、実業務で困ってるからググってる身としては

**いやよっぽど詳細しってるから、いらないから(；´Д｀)**

と、泣く泣く英語サイトの荒波をおぼれながらも泳いだものです。。
（当時Fiddler本を読んだばかりで気が強かったのもあったけど）

いや、文明は知らない内に進んでいくものですな(-∀-)y-゜゜゜

## Windows10でのホットスポット化がスゲー楽
前はコマンドプロンプトから設定して、起動するにも

`netsh wlan start hostednetwork`

とか叩かないといけなかった（少なくとも自分は他の方法しらなんだ）のだけど、いまはもうGUIでちょちょいなんですよ奥さん( ・ω・)ﾉｼ

正直、Windows10になって初めて

**コイツ、スゲー便利じゃん！(੭ु･∀･)੭ु⁾⁾**

と思った瞬間でしたよ。

いや、文明は知らない内に・・・・もういいか(；・∀・)y-゜゜゜
ていうか・・・・取り残されてるだけか自分(；ﾟДﾟ)

そんな三十路の梅雨、皆さまどうお過ごしでありましょうか・・・・？
わたくしは呑んべんだらりと過ごして・・・・いけたらいいなぁ、と思ってる次第でございます(´･ω･｀)