2020/3/17にリリースされたGitHubモバイルアプリ

## GitHubが3/17にAndroidとiOS向けの公式モバイルアプリをリリース
最近までテスト配信され、ようやくリリースされました。
このアプリはコードの編集はできませんが、Issueの管理やプルリクエストのマージなどができるアプリです。
エンジニアのほとんどがお世話になっている`GitHub`が一体どんなライブラリを使用して開発したのか気になりました。


iOSの設定アプリにOSSのライセンスが表記されていたので調査してみました。


- 初期画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/29d71df3-b8f6-eb23-cd7d-37d260774fba.png" width="30%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/84b83d56-802a-ecb5-d0dd-5e601d07688b.png" width="30%">

- ログイン後

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/4167a680-c2da-6659-c38b-0c4cade640f9.png" width="30%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/5fa34d8d-c87d-00a5-d03e-080da2997657.png" width="30%">

- 謝辞: Acknowledgements

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/c53242a5-1397-caac-c1e0-2aaae06bb1f4.png" width="30%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/10460921-6851-68d6-b51e-3cf18eda8999.png" width="30%">

## 一覧

- Alamofire
- AlamofireNetworkActivityIndicator
- Apollo
- CocoaLumberjack
- ContextMenu
- DropdownTitleView
- Firebase
    - Crashlytics
    - Fabric
    - FirebaseAnalyticsInterop
    - FirebaseCore
    - FirebaseCoreDiagnostics
    - FirebaseCoreDiagnosticsInterop
    - FirebaseInstanceID
    - FirebaseMessaging
    - GoogleDataTransport
    - GoogleDataTransportCCTSupport
    - GoogleUtilites
    - nanopb
- FLEX
- Fuzi
- Protobuf
- R.swift
    - R.swift.Library
- SDWebImage
- SDWebImageSVGCoder
- SnapKit
- SnapshotTesting
- SQLite.swift
- SVGKit
- TUSafariActivity
- Valet

### ライブラリについて
#### [Alamofire](https://github.com/Alamofire/Alamofire)
ど定番のHTTP通信ライブラリ 

- [AlamofireとSwiftyJSONでAPIを叩くチュートリアル](https://qiita.com/yutat93/items/1b6dfe34fa8537cf3329)

#### [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator)
Alamofireが提供しているインジケータライブラリ


```swift
NetworkActivityIndicatorManager.shared.isEnabled = true
```

- [ネットワークインジケータをAlamofireNetworkActivityIndicatorで表示して幸せになろう](https://qiita.com/nnsnodnb/items/af0857432ab0a648c715)

#### [Apollo](https://github.com/apollographql/apollo-ios)
GraphQL APIと通信できるライブラリ

- [GraphQL とは？REST API の代替になる？](https://rightcode.co.jp/blog/information-technology/graphql-alternative-rest-api)


#### [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)
ログフレームワーク
`NSLog`よりも高速らしい...

- [ログ出力ライブラリのCocoaLumberjackを使う](https://qiita.com/yuch_i/items/b25ddb6ceb788777c83b)


#### [ContextMenu](https://github.com/GitHawkApp/ContextMenu)
ポップアップのようなコンテキストメニューの表示できるライブラリ
Starはちょっと少なめ


#### [DropdownTitleView](https://github.com/GitHawkApp/DropdownTitleView)
UINavigationItemを加工できるライブラリ
Starはちょっと少なめ


#### [Firebase](https://firebase.google.com/?hl=ja)
Googleのなんでも提供してくれる優秀ツール


#### [FLEX](https://github.com/Flipboard/FLEX)
iOS開発用のアプリ内デバッグツール

<img src="https://user-images.githubusercontent.com/8371943/70185687-e842c800-16af-11ea-8ef9-9e071380a462.gif" width="30%">

- [FLEXをSwiftで使ってみる](https://qiita.com/hideji2/items/c7e7658d3a82f6b7c096)


#### [Fuzi](https://github.com/cezheng/Fuzi)
XML/HTMLのパーサライブラリ
Webページからの情報を取得、分析するために使っているのでしょう

- [軽くて、素早くて、 Swift の XML/HTML パーサー](https://qiita.com/cezheng/items/36316336bf4070f0c98b)

#### [Protobuf](https://github.com/apple/swift-protobuf)
GoogleのProtocol Buffer（ "protobuf"）オブジェクトシリアライズツールをappleが提供

- [Swiftでプロトコルバッファを使う](https://qiita.com/pelican/items/0df8084e0a0f6f183636)

#### [R.swift](https://github.com/mac-cain13/R.swift)
コード補完でリソースファイルにアクセスすることができる超便利ライブラリ

```swift:Before
let icon = UIImage(named: "settings-icon")
let font = UIFont(name: "San Francisco", size: 42)
let color = UIColor(named: "indicator highlight")
let viewController = CustomViewController(nibName: "CustomView", bundle: nil)
let string = String(format: NSLocalizedString("welcome.withName", comment: ""), locale: NSLocale.current, "Arthur Dent")
```

```swift:After
let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let color = R.color.indicatorHighlight()
let viewController = CustomViewController(nib: R.nib.customView)
let string = R.string.localizable.welcomeWithName("Arthur Dent")
```

#### [SDWebImage](https://github.com/SDWebImage/SDWebImage)
かなり昔から使われている定番画像キャッシュライブラリ

- [Swiftの有名画像キャッシュライブラリを比較してみた
](https://qiita.com/H_Crane/items/422811dfc18ae919f8a4)

#### [SDWebImageSVGCoder](https://github.com/SDWebImage/SDWebImageSVGCoder)
SDWebImageのSVGファイル対応プラグイン


#### [SnapKit](https://github.com/SnapKit/SnapKit)
AutoLayoutをソースコードで記述できる一番人気のライブラリ

- [SnapKitを使ってみた。](https://qiita.com/Miya49_p0/items/5c5b498e90eca9bdbe42)

#### [SnapshotTesting](https://github.com/pointfreeco/swift-snapshot-testing)
スナップショットテストライブラリ
View以外もテストできるみたい
これをつかってデグレを検知をしているのでしょう


#### [SVGKit](https://github.com/SVGKit/SVGKit)
SVGファイルを使えるようにするライブラリ
iOS13からガッツリSVG対応されるようになったので今後は使用することないかも...

#### [SQLite.swift](https://github.com/stephencelis/SQLite.swift)
データベースSQLiteのライブラリ


#### [TUSafariActivity](https://github.com/davbeck/TUSafariActivity)
「Safariで開く」を簡単に実行できるライブラリ

```swift
let URL =  NSURL（string：" http://google.com "）！
let activity =  TUSafariActivity（）
let activityViewController =  UIActivityViewController（activityItems：[URL]、applicationActivities：[activity]）
```

#### [Valet](https://github.com/square/Valet)
キーチェーンを簡単に操作できるライブラリ


## 感想
アプリを使用してみて、かなりシンプルでappleが提供しているようなアプリデザインと思った。
UIがシンプルということでUI関係のライブラリが多くない。
しかし、もともとのサービスがWebサービスということからネットワーク関連のライブラリが７割ほどでした。

意外だったのが、かなりマイナーなライブラリを使っているところですね。正直、`TUSafariActivity`は普通に実装できる軽量ライブラリですし、Starもかなり少ない。それをあえて導入していたのが驚きでした。

対象OSが12.2~ということでUIKitで開発されたのは間違い無いだろう。
でもUIをみるとデフォルトで提供されているUIパーツだらけなので、今後SwiftUIに移行するを検討しているのでは無いかと予想する。

とにかくライブラリをよくみる私にとっては最高のモバイルアプリである。

## 今後の予定
ライブラリ説明の充実