slack iosアプリで使われているライブラリ群をとりあえず眺めてみる(2015年6月時点)

ここ2,3ヶ月くらい見ない間にiOSのライブラリがすごい進化を遂げているような気がしたので、キャッチアップとして、個人的にUXがステキだと思っているslackさんがどんなライブラリを使いっているか、覗いてみようと思いました。
(参照元：https://slack.com/libs/ios )

下記に、出来る限り(妄想で)アプリのどの部分に該当するかと一緒に挙げていこうと思います。

# 2015年6月時点 追加分

## [AFNetworkActivityLogger](https://github.com/AFNetworking/AFNetworkActivityLogger) 
######(Latest Commit:Feb 15, 2015)

AFNetworkingのエクステンションで、GET/POSTなどのリクエストのログをコンソールに吐き出してくれるもの。Androidみたく、ログレベルも設定できるよう。

## [SDWebImage](https://github.com/rs/SDWebImage) 
######(Latest Commit:Jun 25, 2015)

非同期で画像を取得してきてくれるUIImageViewのカテゴリ。キャッシュやリトライの設定もできる。さらに、UIButtonにも対応してます。

SDWebImageの内部仕様やカスタマイズについては wantedlyの方の資料が詳しいです。[iOS 通信のパフォーマンス改善 ・ iOSオールスターズ登壇資料](http://www.slideshare.net/susieyy/ios-ios-44665266)

# [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) 
######(Latest Commit:May 1, 2015)

Flipboard製 gifアニメーションエンジン。

- 複数のgifを同時に、デスクトップのブラウザと遜色ないレベルで再生できる
- フレームレートを操作できる
- メモリ使用量を考慮したつくり
etc...

結構細部までこだわったつくりのようです。

## [onepassword-app-extension](https://github.com/AgileBits/onepassword-app-extension) 
######(Latest Commit:Jun 26, 2015)

様々なパスワードを安全にCRUDできるサービス [1Password](https://agilebits.com/onepassword)と連携するためのエクステンション。

結構少ないコード量で実装できるようですし、ベンダーが出しているものなので、安心して使えますね。

## [GBVersionTracking](https://github.com/lmirosevic/GBVersionTracking) 
######(Latest Commit:Feb 11, 2015)

ユーザがどのversionを過去インストールしたかをトラックできるライブラリ。
インストールしたバージョン一覧とかも見れるらしいので、各バージョンに応じた対応をするには持って来いですね。

※ 個人的にはこちらも利用させてもらっています: [SRGAppVerWatcher](https://github.com/soragoto/SRGAppVerWatcher)

## [UICKeyChainStore](https://github.com/kishikawakatsumi/UICKeyChainStore) 
######(Latest Commit:Jun 17, 2015)

結構とっつきにくいKeyChainStoreをNSUserDefaultsを使う感覚でアクセスできるようにしてくれるライブラリ。touchIDや、iOS8から対応となったShared Web Credentialsもサポートしているすぐれものです。

※ [Swift版](https://github.com/kishikawakatsumi/KeychainAccess)も用意されているようです(凄い！)

## [MMWormhole](https://github.com/mutualmobile/MMWormhole) 
######(Latest Commit:Jun 3, 2015)

iOS8以降, OSX10.10以降に追加された、アプリ間での連携をしやすくするApp Extensionsという仕組みを使って、データやコマンドを相互に送受信するためのライブラリ。
githubのreadmeでは、watchOSとの連携デモがみれるのでイメージつきやすいです。
※ 確かに、slackさんapple watchサポートしてますもんね。

## [Tweaks](https://github.com/facebook/Tweaks)
######(Latest Commit:Jun 17, 2015)

iOSアプリの開発段階で、細かなチューニングを設定画面のパラメータ変更だけで実現できるようにするライブラリ。facebook製。例えば、アニメーションの定数値や色やテキストなどをチューニングできます。

※ 使ってみたブログはこちらが参考になるかと思います
http://hrk-ys.blogspot.jp/2014/05/title.html

## [FLEX](https://github.com/Flipboard/FLEX) 
######(Latest Commit:May 26, 2015)

これまたデバッグ系のライブラリ、Flipboard製。
アプリ上でViewを移動したり、Viewのどこを選択しているかを色で表現したり、色々できるすぐれものです。言葉で説明するよりデモを見てもらったほうが早いです。

![](https://camo.githubusercontent.com/9986601c5e4306f7935032465911c0f70596e046/687474703a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f62617369632d766965772d6578706c6f726174696f6e2e676966)

## [OMGHTTPURLRQ](https://github.com/mxcl/OMGHTTPURLRQ) 
######(Latest Commit:Jun 23, 2015)

HTTPメソッドのための、NSMutableURLRequestを簡単に作る事ができるライブラリ。

```
NSMutableURLRequest *rq = [OMGHTTPURLRQ GET:@"http://api.com":@{@"key": @"value"}];
```

こんな感じでリクエストを作ったり、multipart/form-data用のリクエストを作ったり、端末のユーザエージェントをワンライナーで取得できたりします。
(ユーザエージェント取得には `pod OMGHTTPURLRQ/UserAgent`が必要)

## [PSPDFThreadSafeMutableDictionary](https://gist.github.com/steipete/5928916) 
######(Latest Commit:Dec 6, 2013)

スレッドセーフなMutableDictionaryのスニペット。作者としては、

>通常はNSCacheを使うでしょうが、手動で細かに破棄するオブジェクトを管理したい場合には有用でしょう。但し、getter/setter用に使っていて、enumerationの場合はスレッドセーフではないので、別スレッドから呼ぶとエクセプションを吐くよ。

とのこと。内部では[スピンロック](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF)という手法でスレッドセーフを実現しています。

画像以外でクリティカルな情報を持ったデータをスレッドセーフで扱いたい場合にいいのかもしれません(画像なら前述のSDWebImageが大抵の場合は適しているのかなと)。


## [SlackTextViewController](https://github.com/slackhq/SlackTextViewController) 
######(Latest Commit:Jun 10, 2015)

slack製、いわゆるslackのようなUIを提供するライブラリ。autolauout対応してますし、予め登録しておけばオートコンプリートもできます。しかもiOS7以降対応。超実用的です。

![](https://github.com/slackhq/SlackTextViewController/blob/master/Screenshots/slacktextviewcontroller_demo.gif?raw=true)

※ これほどの機能を企業がオープンソースにするってすごくいい文化だなぁと個人的には思いました。日本のベンチャーのこういうOSSだしてるのかな...今後調べてみたいです。それと蛇足ですが、同じような機能を作る機会があって、早くこの記事をアップデートしてれば...と後悔先に立たず状態でした。

## [DZNEmptyDataSet](https://github.com/dzenbot/DZNEmptyDataSet)
######(Latest Commit:Jun 18, 2015)

UITableViewやUICollectionViewでデータが無いときに表示するviewを簡単に組み込めるようにする、UIScrollViewのカテゴリ。

利用箇所はこういうところかなと。
![Screen Shot 2015-06-26 at 18.53.20.png](https://qiita-image-store.s3.amazonaws.com/0/46489/7ccf83b7-6c10-48f3-3a98-dfaca7d584f8.png)

## [DZNPhotoPickerController](https://github.com/dzenbot/DZNPhotoPickerController) 
######(Latest Commit:May 7, 2015)

500px, Flickr, Instagram, Google, Bing & Getty Imagesといった画像提供サービスから写真を検索してピックアップすることができるライブラリ。
検索ワードのオートコンプリートができたり、画像をクロップできたり、凄い完成度です。

動画:
https://vimeo.com/user3409970/dznphotopickercontroller

## [DZNSegmentedControl](https://github.com/dzenbot/DZNSegmentedControl) 
######(Latest Commit:May 25, 2015)

UISegmentedControlの代替になるようなライブラリで、とくにユーザ数/一覧を表示するような場合に適しているようです。

![](https://camo.githubusercontent.com/7611fc3359c05c4406d8d61e31f5f15dc05be695/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f752f323435323135312f5065726d616c696e6b2f445a4e5365676d656e746564436f6e74726f6c2e676966)

※ この作者のライブラリ3つも取り入れられてる...もしや中の人では。


# 以下、2月時点で導入されていたライブラリ
(打ち消し線のあるものは記事更新時に削除されていたもの)

## [SVWebViewController](https://github.com/TransitApp/SVWebViewController) 
######(Latest Commit:Jan 15, 2015)

アプリ内に簡単にWEBVIEWを組み込めるライブラリ。
進む/戻る/リフレッシュボタンもついてて、Landscapeモードにも対応、iPadもサポートということで、単にwebView表示したいときはほんとに便利そう。

[利用箇所] まさに利用ライブラリの画面がSVWebViewControllerなんじゃないかと。一般的な著作権情報ってベタ書きされているだけなのに対し、開閉出来る仕組みになっていて、かなり読みやすい。開発者に愛される細やかな対応。恐れいります。

![IMG_3766.PNG](https://qiita-image-store.s3.amazonaws.com/0/46489/5593c11d-5c00-aa78-aff5-a7b9c9ed3d60.png)

## [YRDropdownView](https://github.com/onemightyroar/YRDropdownView)
######(Latest Commit:Oct 14, 2013)

スタイリッシュなアラートやワーニングを表示するライブラリ。

[利用箇所] 画像アップロード時のローディング表示？
![Screen Shot 2015-02-18 at 22.44.09.png](https://qiita-image-store.s3.amazonaws.com/0/46489/62c7a824-4b34-52be-0342-65ab1871a482.png)


## ~~[MOScrollView](https://github.com/plancalculus/MOScrollView)~~
######(Latest Commit:Jan 24, 2014)

setContentOffsetを任意のタイミング/長さでアニメーション付きで発生させることができるらしい。

[利用箇所] 要調査

## ~~[Toast](https://github.com/scalessec/Toast)~~
######(Latest Commit:Nov 16, 2014)

Androidでいうトーストの機能をiOSで実現するためのライブラリ。

[利用箇所] 要調査

## ~~[AFHTTPClient+ProxyQueue](https://github.com/jamztang/AFNetworking-ProxyQueue)~~
######(Latest Commit:Dec 22, 2012)

AFNetworkingで、複数のオペレーションキューを持てるようにしたライブラリ。
例えば、ダウンロードなど時間がかかる処理を、

`[[YourHTTPClient sharedClient] proxyQueueNamed:@"downloadQueue"] enqueueHTTPRequestOperation:downloadOperation];`

こんなふうに別のキューで処理できるみたい。中で dispatch_group_async を使っているようです。

[利用箇所] 画像ダウンロードしつつも、テキストは打てるようになってる(Commentの部分)ので、そんなときとか。

![Screen Shot 2015-02-19 at 16.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/46489/f5b6a8f3-5174-e7e7-e7c4-2548d5b3c38c.png)


## ~~[EGOTableViewPullRefresh](https://github.com/enormego/EGOTableViewPullRefresh)~~
######(Latest Commit:Nov 2, 2013)

Tweetie 2に似たpull to refreshだそう。

[利用箇所] 見当たらない...どこだ。

## ~~[WDActivityIndicator](https://github.com/sprint84/WDActivityIndicator)~~
######(Latest Commit:Mar 13, 2013)

かっこいいローディング。
![Screen Shot 2015-02-18 at 23.28.34.png](https://qiita-image-store.s3.amazonaws.com/0/46489/dc2f0d92-53bc-9edb-56f4-c5a6d7e73531.png)

[利用箇所] うーんどこだろう...

## [GCPlaceholderTextView](https://github.com/gcamp/GCPlaceholderTextView)
######(Latest Commit:Mar 4, 2014)

プレースホルダーつきのTextView。TextViewにはプレースホルダーのプロパティがないので。

[利用箇所] よく見るテキストをうつ画面でしょ。ちょっとずれてる気はしますが。

![Screen Shot 2015-02-18 at 23.34.08.png](https://qiita-image-store.s3.amazonaws.com/0/46489/68ed605a-5f40-337d-1e12-b2738ab34f2b.png)

## ~~[ZKRevealingTableViewCell](https://github.com/alexzielenski/ZKRevealingTableViewCell)~~
######(Latest Commit:Feb 4, 2014)

tableViewのセルを横(左右対応)にスライドすると、バネのアニメーションつきでスライドできるライブラリ。

[利用箇所] 右のスライドドロワー > Filesって色々あると思うんですが、その下にYour Filesとか All Filesとかあるとおもうんですが、そこはすべて同じ作り。
![Screen Shot 2015-02-18 at 23.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/46489/775cea4a-25c2-6766-d698-323de212400a.png)

## [PDKeychainBindingsController](https://github.com/carlbrown/PDKeychainBindingsController)
######(Latest Commit:Aug 30, 2014)

NSUserDefaultsの感じでKeychainを利用できるライブラリ。というかViewController。

[利用箇所] 要セキュアな箇所じゃないかと。


## [YLProgressBar](https://github.com/yannickl/YLProgressBar)
######(Latest Commit:Feb 15, 2015)

かっこいいプログレスバー。

[利用箇所] 前述だけど画像アップ時とか。
![Screen Shot 2015-02-18 at 22.44.09.png](https://qiita-image-store.s3.amazonaws.com/0/46489/62c7a824-4b34-52be-0342-65ab1871a482.png)

## ~~[YIInnerShadowView](https://github.com/inamiy/YIInnerShadowView)~~
######(Latest Commit:Jul 7, 2014)

インナーシャドウをUIViewに簡単に付与できるライブラリ。

[利用箇所] 不明。


## [OLImageView](https://github.com/ondalabs/OLImageView)
######(Latest Commit:Sep 27, 2014)

UIImageViewの感じで、gitアニメを表示できるライブラリ。AFNetworkingのシリアライザも用意されているので連携できて便利かも。

[利用箇所] 不明。

## ~~[AKSegmentedControl](https://github.com/alikaragoz/AKSegmentedControl)~~
######(Latest Commit:Feb 10, 2014)

カスタマイズできるセグメントコントロール。
セグメントコントロール、かゆいところに手がとどかなかったりしますからね。

[利用箇所] 不明。

## ~~[Harpy](https://github.com/ArtSabintsev/Harpy)~~
######(Latest Commit:Jan 25, 2015)

アプリに新しいversionが出ていたら、その旨をユーザに通知するためのライブラリ。

[利用箇所] 明確。


## [Mixpanel](https://github.com/mixpanel/mixpanel-iphone)
######(Latest Commit:Feb 6, 2015)

ユーザトラッキングのためのツール。push通知機能までつかってるのかなぁ。。

[利用箇所] 不明。

## [ODIN](https://code.google.com/p/odinmobile/)
######(Latest Commit:-)

Open Device Identification Number、ユーザの端末を識別するidとなる、文字列を生成してくれるライブラリ。マックアドレスをシードに与えると、適当な数字を生成してくれるみたい。mixpanelの中でも使われているぽい。

[利用箇所] 不明。

## [NSData+Base64](https://github.com/l4u/NSData-Base64)
######(Latest Commit:Oct 17, 2013)

Base64エンコードができるNSDataのカテゴリ。
今は[Base64](https://github.com/nicklockwood/Base64)というライブラリに引き継がれているようです。が、*ios7やmac os9以降はもはや不要* との記載も。今後は必要なさそうですね。

[利用箇所] 至る所ではないかと。

## [HPGrowingTextView](https://github.com/HansPinckaers/GrowingTextView)
######(Latest Commit:Dec 18, 2013)

SMSアプリライクなUITextViewを提供してくれるライブラリ。キーボードの上にピタッとくっつき、複数行にも対応していて、行数によって自動で縦に伸縮されます。

[利用箇所] テキストを入力する箇所
![Screen Shot 2015-02-18 at 23.34.08.png](https://qiita-image-store.s3.amazonaws.com/0/46489/68ed605a-5f40-337d-1e12-b2738ab34f2b.png)


## ~~[UIResponder+KeyboardCache](https://github.com/mbrandonw/UIResponder-KeyboardCache)~~
######(Latest Commit:Aug 13, 2012)

キーボードを初回に開く際、少しラグが発生しますが、それを回避するためのworkaround。
こんな細やかなUX改善が大事なんですね。

[利用箇所] キーボード表示時。


## [FDTake](https://github.com/fulldecent/FDTake)
######(Latest Commit:Dec 16, 2014)

写真を取る/ライブラリから選択のview一式を提供してくれるライブラリ。言語も複数対応しているみたいなので、多言語対応アプリ開発者さんにとっては、手間が省けて嬉しいかも。

[利用箇所] こういうやつですね。drop boxとか、最後に撮られた画像とかがあって、多少拡張されてます。
![Screen Shot 2015-02-19 at 16.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/46489/46c8e321-bd4d-01d5-019c-8b3f3ce62e97.png)


## [SocketRocket](https://github.com/square/SocketRocket)
######(Latest Commit:Feb 18, 2015)

アプリからwebソケット通信を実現できるライブラリ。
チャットアプリの場合は必須でしょうか。ちょっと触ってみたいな。。

webソケット通信に関しては、下記がよくまとまっているなと思いました。
[フレクトのHeroku Lab WebSocket通信のメリットを考える](http://blog.flect.co.jp/labo/2014/04/websocket-8124.html)

[利用箇所] メッセージングの箇所じゃないかと。

## [AFNetworking](https://github.com/AFNetworking/AFNetworking)
######(Latest Commit:Feb 15, 2015)

おなじみ、AFNetworking。HTTP通信する際に使いますね。作者のmattさんは、swiftでも同様のライブラリ[Alamofile](https://github.com/Alamofire/Alamofire)を開発されていますね。日本が大好きでお寿司のネタはウニが好きだそう(ウソです妄想です)。

[利用箇所] 主にHTTP通信の発生する場所ではないかと。

## [BlocksKit](https://github.com/zwaldowski/BlocksKit)
######(Latest Commit:Nov 5, 2014)

手数の多くなりがちなdelegateよりもすぐにクロージャでかけるようにしてくれるライブラリ。

[利用箇所] UIAlertviewのdelegateとかactionsheetのdelegateとかかなぁと。

## [DACircularProgress](https://github.com/danielamitay/DACircularProgress)
######(Latest Commit:Feb 12, 2015)

円形のプログレス表示をしてくれるライブラリ。

[利用箇所] 画像ダウンロード時かな。

![Screen Shot 2015-02-19 at 16.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/46489/f5b6a8f3-5174-e7e7-e7c4-2548d5b3c38c.png)

## [FastImageCache](https://github.com/path/FastImageCache)
######(Latest Commit:Oct 15, 2014)

Pathが提供する、スクロール時に画像表示をスムーズにしてくれるライブラリ。
最近だと[WebP](https://github.com/seanooi/iOS-WebP)が流行っているらしいですね。。時代の流れって凄まじいです。

[利用箇所] 各チャンネルのタイムラインで画像表示の際かな。


## ~~[KLSwitch](https://github.com/KieranLafferty/KLSwitch)~~
######(Latest Commit:Aug 7, 2013)

iOS5以上で動く、iOS7っぽいスイッチを提供するライブラリ。

[利用箇所] 現在slackはiOS7以降対応になっているので、稼働していないのではないかと。


## ~~[Lockbox](https://github.com/granoff/Lockbox)~~
######(Latest Commit:Oct 31, 2014)

キーチェーンに簡単にアクセスできるライブラリ。前述の PDKeychainBindingsControllerよりも格納できる型が多く、使いやすそうです。

[利用箇所] パスワード入力画面とかかな。

## ~~[MBProgressHUD](https://github.com/jdg/MBProgressHUD)~~
######(Latest Commit:Feb 8, 2015)

かっこいいプログレス表示をしてくれるライブラリ。

[利用箇所] 不明。


## [Mantle](https://github.com/Mantle/Mantle)
######(Latest Commit:Jan 17, 2015)

JSONで取得したデータをモデルオブジェクトとして簡単に扱えるようにしてくれるライブラリ。
CoreDataにも対応しているようです。

CoreData連携の詳細はこちらを参考に。
[JSON<->NSManagedObjectのマッピングを簡単に！Mantleを使ってCore Dataのソースコードをシンプルにする](http://qiita.com/asakahara/items/307638c1396286afb3f3)

[利用箇所] 不明。

## [Reachability](https://github.com/tonymillion/Reachability)
######(Latest Commit:Feb 2, 2015)

通信の可否を教えてくれるライブラリ。
Apple公式でもサポートされているようですが、githubの方をとりあえず。

[利用箇所] 通信可否判定の箇所とか。

## ~~[SBJson](https://github.com/stig/json-framework)~~
######(Latest Commit:Apr 17, 2014)

iOSのデファクトJSONパーサ/ジェネレータライブラリ。

[利用箇所] APIが絡む箇所じゃないかと。


## [TTTAttributedLabel](https://github.com/TTTAttributedLabel/TTTAttributedLabel)
######(Latest Commit:Feb 17, 2015)

UILabelにリンクをつけたり、装飾したりできるライブラリ。

[利用箇所] 各チャンネルのタイムライン。リンクが青くなってますよね。

![Screen Shot 2015-02-19 at 17.20.10.png](https://qiita-image-store.s3.amazonaws.com/0/46489/c4c28ce9-8128-e8a7-df68-aaa86959207e.png)

## [UIWebView-Markdown](https://github.com/Huddle/UIWebView-Markdown)
######(Latest Commit:May 2, 2013)

HTMLの代わりにマークダウンを読み込むことのできるwebViewカテゴリ。

[利用箇所] 前述の利用ライブラリ一覧画面とかかな。

![IMG_3766.PNG](https://qiita-image-store.s3.amazonaws.com/0/46489/5593c11d-5c00-aa78-aff5-a7b9c9ed3d60.png)

## [WYPopoverController](https://github.com/nicolaschengdev/WYPopoverController)
######(Latest Commit:Apr 26, 2014)

iPhoneでiPadみたいなポップオーバー(吹き出し)を表示してくれるライブラリ。

[利用箇所] 不明。

## ~~[libextobjc](https://github.com/jspahrsummers/libextobjc)~~
######(Latest Commit:Nov 7, 2014)

blocksでselfを参照したいときなどに使えそうなライブラリ。

使い方に関してはこちらが詳しそうです。
[Zero4Racer PRO Developer's Blog libextobjc の @weakify と @strongify について](http://www.zero4racer.com/blog/1192) 

[利用箇所] 不明

## [sundown](https://github.com/vmg/sundown)
######(Latest Commit:Nov 29, 2012)

マークダウンプロセッサライブラリ。

[利用箇所] [公式のヘルプ](https://slack.zendesk.com/hc/en-us/articles/202288908-How-can-I-add-formatting-to-my-messages-)によると、>をつけると、block quoteできるとか、**でかこむとboldになるとありますが、アプリではそのように処理されていないみたいです。

## [CocoaPods](http://cocoapods.org/)
######(Latest Commit:-)

iOS・OSXのサードパーティライブラリ管理ツール。

[利用箇所] ライブラリの管理。

## [JTSImageViewController](https://github.com/jaredsinclair/JTSImageViewController)
######(Latest Commit:Feb 7, 2015)

画像プレビュー用のViewController。ダブルタップでズームするとか、フリックで画像を閉じるとか、画像プレビューのためのオールインワンライブラリ。

[利用箇所] この画面でしょう。

![Screen Shot 2015-02-19 at 17.50.32.png](https://qiita-image-store.s3.amazonaws.com/0/46489/4f8a136d-3adc-5b09-45f6-81565b868148.png)


いやー長かった。。とりあえず通してみたのでアップします。
どんなおっきなアプリに見えてもちっさいパーツの積み重ねですね。
そしてフリーで提供してくれている、世界中の開発者に感謝です。勉強になりました。