他社製iOSアプリの実装の探り方

普段アプリ使っていて、これどうやって実装しているのだろう？とか思うことありますよね。
そういう時に、僕がちょくちょくやっている方法を紹介します。

# ベタな方法

## 開発者に聞く

当たり前ですが、知り合いに教えてくれそうな人がいたら、聞いてみるのが良いですよね。

## 記事・スライドを探す

最近は特集記事や勉強会スライドなどでよく設計や実装が紹介されていますよね。
検索に引っかかりにくかったりすることもあるので、普段からよく目を通しておいて、「そういえばあの時のスライドに書いてあった」みたいな感じで思いだして見直したりしてます。

記事例:
- [LINEのプラットフォームを支えるアーキテクチャと組織の作り方 #linedevday | マイナビニュース](http://news.mynavi.jp/articles/2015/04/30/linedevday2/)

スライド例:
- [Gunosy for Apple Watchができるまで](http://www.slideshare.net/YusukeKawanabe/2015-0527-applewatchpdf)

あと、雑誌検索も良いですね。
WEB+DBなどの連載でちょくちょく事例載ってたりするので(iOSよりサーバーサイドの話が多いですが)。

Spotlight検索で`kind:pdf`で種類を絞って、PDF購入したり自炊してOCRかけた本を串刺し検索出来ます。
(Kindle・iBooksは別途検索しなきゃいけなくて面倒)

![Screen Shot 2015-07-23 at 10.05.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/6bb2d5fa-5198-0210-3b89-b0dd3011744b.png)


# ライセンス一覧を見る

先日書いた[ライセンス - iOS版LINEアプリの使っているライブラリを調べた - Qiita](http://qiita.com/mono0926/items/cd8518fc7f8f220d6935)もその一例です。

普段からたまに見てますが、LINEのは見にくかったので整理ついでに記事化した感じです。

Slackのはかなり見やすくてありがたいです: [About This Version | Slack](https://slack.com/libs/ios)
あと最近見たのでは、Facebook Messengerのライセンス一覧が面白かったです(しかしとても量が多い)。

ライセンス一覧を見ることで、例えば、Slack・Facebook Messengerともにリアルタイム更新にはWebSocketを使っていて、ライブラリは[square/SocketRocket](https://github.com/square/SocketRocket)を採用していることなど分かりました。

本体アプリの設定画面周りにあることが多いですが、たまに設定アプリに隔離されていることもあります。

# ホームボタンダブルタップで画面を下に持ってくる機能でナビゲーションの構造が少し分かる

iPhone 6(Plus)では、ホームボタンダブルタップすると、画面全体が一時的に下に降りてきますが、通常その状態で画面遷移すると、画面全体が元の位置に戻ってしまいます。

画面遷移ではなく、ビューの移動などで画面遷移ぽく見せている場合は、戻らず下にズレた状態が維持されます。

例えば[Reeder](http://reederapp.com/ios/)は維持されるので、iOSの画面遷移の仕組みを使わず独自実装していることが分かります。
![Artboard 2.png](https://qiita-image-store.s3.amazonaws.com/0/19398/c3ecdcce-1f93-b222-791b-22f3210cbccd.png)

# PUSH通知を無効にしてもリアルタイム更新されるか確かめる

最近、特にリアルタイム更新部分の実装を探っています。
(サイレント)PUSH通知だけでも挙動的にはリアルタイム更新実現出来そうですが、一般的にどうしているのか調べたりしました。

特にメッセージアプリなどではPUSH通知無効時でもアプリ開いているとリアルタイムに更新されるものがほとんどだったので、やはり双方向通信処理を併用がセオリーぽいことが分かりました。

---

ここまでは実際にちょくちょく使っている方法です。
以下はポテンシャル感じつつ、まだ実際に役だったこと無いものです（´・ω・｀）

# Instrumentsツールで覗く

Instrumentsツール、実は一般のアプリにも接続出来たりします(　´･‿･｀)

Facebook Messengerに接続してみた例です。

ネットワーク:
![Screen Shot 2015-07-23 at 9.50.35 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/7c737cd6-dc9d-b90a-d8d0-cefd91959be7.png)

Core Animation:
![Artboard 1.png](https://qiita-image-store.s3.amazonaws.com/0/19398/17da5b4b-59bc-3b5a-dfef-c666117f5752.png)


# パケットキャプチャしてみる

通信系の実装のヒントになるかもしれません。
と思いつつ、まだ良い感じの情報得られず、実際には恩恵得られていません（´・ω・｀）

- [iOS - iPhone端末とかのパケットキャプチャ - Qiita](http://qiita.com/ionis_h/items/661a9a9d41cb1574e357)
- [Technical Q&A QA1176: Getting a Packet Trace](https://developer.apple.com/library/ios/qa/qa1176/_index.html)
- [Remote Packet Capture for iOS Devices - Use Your Loaf](http://useyourloaf.com/blog/2012/02/07/remote-packet-capture-for-ios-devices.html)

`tcpdump`したり、[Wireshark](https://www.wireshark.org)で覗いたり出来ます。

`tcpdump -n -i rvi0`でこんなのが見られます。

```
09:34:17.085854 IP 54.175.159.82.443 > 10.89.184.176.53844: Flags [P.], seq 4750:4947, ack 1064, win 64, options [nop,nop,TS val 2617757540 ecr 996623825], length 197
09:34:17.085995 IP 10.89.184.176.53844 > 54.175.159.82.443: Flags [.], ack 4947, win 4089, options [nop,nop,TS val 996631679 ecr 2617757540], length 0
09:34:17.197452 IP 10.89.184.176.53856 > 52.5.236.100.443: Flags [SEW], seq 863647785, win 65535, options [mss 1380,nop,wscale 5,nop,nop,TS val 996631788 ecr 0,sackOK,eol], length 0
```

`tcpdump -n -t -i rvi0 -q -A tcp`で、通信の中身も見れますが、SSL通信で暗号化されてたりであまり役に立たないです。
[debug - tcpdump + wireshark で https な通信を解読する - Qiita](http://qiita.com/ywatai@github/items/baddcf6988ec1f6ac014)の方法は自分のアプリじゃないと使えないですし（´・ω・｀）

---

他にも何かご存じでしたら教えてくださいヽ(・ω・｀）