iOSアプリエンジニアにとって欠かせないルーチンの一つに「使えるライブラリのリサーチ」があるのではないでしょうか。
ライブラリに依存しすぎるのも良くないですが、上手く使いこなすと実装コストを大幅に削減でき1人月で開発できる機能レベルを向上することもできます。
今回は、Github Trending Repositoriesからリサーチした使えそうなライブラリ&フレームワークをまとめてみました。
Networking系
Alamofire
AlamofireはHTTP通信を行うライブラリです。iOSには標準でNSURLSessionが用意されていますが, Alamofireを使うと簡潔にHTTPリクエストを記述することができます。サーバーサイドとRESTful APIで通信を行うといった場面で用いられStarbucksなど有名なアプリにも多数使われています。
カメラ系
WeScan
Swift製のドキュメントスキャナーです。自動的に紙のエッジを認識し、補正する画面も設けてあります。契約書のスキャンなど業務系アプリに活かせそうです。
UI系
Lottie iOS
Airbnbが開発するアニメーションを表示するライブラリです。Adobe After Affectで作成したアニメーションをjson形式で出力し、それを読み込みそのまま表示することができます。iOS (Swift)の他にもReact NativeやAndroid (Java/Kotlin)にも対応しており、同じアニメーションをクロスプラットフォームで動かすこともできます。

Aiolos
Floating Windowを実装するライブラリです。

Nantes
TTTAttributedLabelをSwift化したものになります。TTTAttributedLabelといえば、様々なiOSアプリケーションで使用を確認することができる有名なライブラリです.UILabelだけでは物足りないところをカバーしてくれます。

MultiProgressView
プロジェクトのExampleにもありますが、カテゴリ別の容量などを表示するなどUIProgressViewでは少し複雑になるものを簡単に実装できます。

SPLarkController
SPLarkControllerは表示中のViewControllerを上にスライドさせるアニメーションを実現できます。メニューやオプションの表示などに使えそうです。

AloeStackView
AloeStackViewは、あのAirbnbが開発・メンテナンスしているライブラリです。リスト表示をdelegateなどを使わずに簡単に作ることができます。設定などのリスト表示は項目数も少なく、UITableViewは少々複雑ですが、AloeStackViewを使うとシンプルに書くことができます。

DarkModeKit
ダークモードはiOS13以上から使うことができます。しかし、iPhone SEなどiOS13がインストールできない端末も多くあります。このライブラリはiOS11〜でもダークモードに対応することができるライブラリです。

CardParts
CardPartsはその名の通り、カード状のUIを実現するためのライブラリです。カードデザインに必須な様々なViewが含まれており、ほとんどコードを書くことなくカードUIを実現できます。



Cosmos
自分で作ると地味に難しいが、よくある5星の評価。これを簡単に表示できるライブラリです。

BulletinBoard
BulletinBoardはiOSのWi-Fiの共有やAirPodsのペアリング時などに下から出てくるダイアログを実現するライブラリです。UIPresentationControllerを使った複雑なコーディングをしなくとも簡単に書くことができます。

Utility系
BetterCodable
Swift 5.1で使えるようになった@propertyWrapperの機能を利用して作られたライブラリです。Codableを継承するクラスや構造体に対して、いちいちinit(from decoder: Decoder) throwsというようなイニシャライザを実装するなどのボイラープレートを書く必要がありません。
Starscream
WebSocket通信を簡単に行うことのできるライブラリです。下はDelegateを継承したクラスに実装したdidReceiveメソッド内のexampleです。複雑なWebSocket通信をかなりわかりやすく且つ簡潔に実装できそうですね。
func didReceive(event: WebSocketEvent, client: WebSocket) {
switch event {
case .connected(let headers):
isConnected = true
print("websocket is connected: \(headers)")
case .disconnected(let reason, let code):
isConnected = false
print("websocket is disconnected: \(reason) with code: \(code)")
case .text(let string):
print("Received text: \(string)")
case .binary(let data):
print("Received data: \(data.count)")
case .ping(_):
break
case .pong(_):
break
case .viablityChanged(_):
break
case .reconnectSuggested(_):
break
case .cancelled:
isConnected = false
case .error(let error):
isConnected = false
handleError(error)
}
}
コメント