Objective-C
iOS
Swift

約2年のiOSアプリ開発で実際に使ったライブラリとそこから得られた知見

More than 3 years have passed since last update.

会社で約2年ほどiOSアプリを新規で開発してきた中で実際に用いたライブラリや検討したもの、または参考にして独自に作ったものなどを紹介します。


動画撮影・編集アプリ(開発言語: Objective-Cで用いたもの)

GPUImage

ド定番。カメラ処理やフィルターなど全般で活用。

KLCPopup

ポップアップのライブラリです。showTypeとdismissTypeを指定できるので自分好みなアニメーションを選択できます。

ReverseClip

動画の逆再生部分で用いています。

SDAVAssetExportSession

AVAssetExportSessionを使いやすくしたもの

iso-8601-date-formatter

NSDateFormatterのサブクラス。日時のフォーマットなどを扱う際に便利です。

SimpleKeychain

キーチェーンを扱うラッパーです。


女性向け美容アプリ(開発言語: Objective-C)で用いたもの

SSZipArchive

アプリが通信容量を削減するためニュース記事をZip形式で受け取っており、それを解凍するためにこちらのライブラリを使いました。パスコード付きのものも対応しています。

MBProgressHUD

言わずもがなの有名ライブラリ。

HUDのタイプを指定できます。個人的にはDLなどの進捗を表す際に使うと便利だと思います。

その他の用途ならSVProgressHUDが個人的に好きです。MBProgressHUDはコードも割と書かなきゃいけないので。

SDWebImage

こちらも言わずもがなですね。

簡単に非同期で画像ダウンロードもできキャッシュも上手くやってくれるライブラリ。

画像ダウンロードが完了するまでに表示するplaceHolder画像が設定できたりします。


以下参考にしたもの

NSDate-Extensions

アプリ内にアラームやカレンダーの機能があるので日付の計算や時間の計算を簡単にしたいという思いで、独自のNSDateのカテゴリを作るときに非常に参考になりました。

#define D_MINUTE    60

#define D_HOUR 3600
#define D_DAY 86400
#define D_WEEK 604800
#define D_YEAR 31556926

//例
+ (NSDate *) dateTomorrow;
+ (NSDate *) dateYesterday;
- (NSDate *) dateByAddingYears: (NSInteger) dYears;
- (NSDate *) dateBySubtractingYears: (NSInteger) dYears;

RDVCalendarView

カレンダーを作るときに参考にしました。こちらをそのまま使おうとするとページング対応してないので、月を変えるときにボタンでviewをリフレッシュするか、UISwipeGestureなどを使ってスワイプの際にCATransitionのアニメーションなどでそれらしくするかになってしまいます。ページングのUXを提供したい場合は普通にUICollectionViewで作るのがいいと思います。

【番外編】

iOS開発におけるウィンドウ「UIWindow」の知られざる活用方法とは?

アプリ内で様々なポップアップを出しているのですがその時にこちらの記事を参考にさせていただいた記憶があります。


GIFアプリ(開発言語: Objective-C)で用いたもの


  • 日本で流行っているGIFを閲覧できたり実際にカメラロールの動画をGifに変換できたりとにかくGIFつくしのアプリ

Gifの表示をUIImageViewの要領で扱うことのできるライブラリです.

FLAnimatedImage

YLGifImage

この2つのうちどちらを採用するかで悩みましたが、commit率やcontributorの数などからFLAnimatedImageを採用しました。

そもそもGifって何?iOSが提供しているUIImageViewのアニメーションってどういう仕組みだっけ?っていうのをこちらの記事が噛み砕いているのでオススメです。

Gifのスピードを変えたり逆再生やシャッフルなどの機能を実装する時に知識として非常に参考になりました。

http://engineering.flipboard.com/2014/05/animated-gif/

ZFModalTransitionAnimator

通常のModalやPushの画面遷移より少しリッチなアニメーションが実現できたりします。

このライブラリを使う際に

UIViewControllerTransitioningDelegate

UIViewControllerAnimatedTransitioning

について調べたことでカスタム画面遷移に強くなれた気がします。自分で好きなアニメーションを作りたいって方には中を見るのはオススメです。

GIFConverter

GIFを.MP4形式に変換してくれます。その際にスピードも調節できたりします。

ASValueTrackingSlider

UISliderの上にポップアップを付随させるライブラリ。相当便利でした。

CMPopTipViewとの組み合わせでカスタム作った方が汎用性はある気がします。

RNBlurModalView

お洒落。画像保存などした際に表示していました。

WYPopoverController

Popoverの表示に便利

YapGif

スターは少ないですが複数枚のUIImageからGifを作り出すのに結構便利

[参考]

iOS用のアニメーションgifライブラリYAPGif作った

AFNetworking

言わずもがなの有名通信系ライブラリ


以下参考にしたもの

RMPZoomTransitionAnimator

初期のUIでGifをタップしたら浮き上がらせて画面遷移するアニメーションを実装しており、当時このライブラリを参考にしてカスタムを作っていました。オススメです。

こちらも先に述べた

UIViewControllerTransitioningDelegate

UIViewControllerAnimatedTransitioning

を理解しておいたほうが読みやすいと思います。

WaterfallLayout

PinterstのようなUIを実現するのに採用。しっかり読めばUICollectionViewFlowLayoutの基礎が身につくんじゃないかと。


動画プラットフォームアプリ(開発言語: Swift)で用いたもの

気軽に動画投稿ができ他のユーザーとアプリ内でコミュニケーションがとれるアプリです。

SweetAlert

Swift製のお洒落なアラート。

タイプはSuccess,Error,Warning,Noneの他にCustomの画像も対応しています.

今まではポップアップやアラートを作る時にUIWindowを継承したBaseWindowを作ってさらにそれを継承した・・・って感じの構成にしてたのですがSweetAlertの中を見てからkeyWindowを取得してviewをはりつけてアニメーションさせるって構成に変えました。まあやってること自体はそんなに変わらないのですが。

KingFisher

Swiftで書かれた画像ダウンロードライブラリ。個人的にSDWebImageより使いやすいです。純正Swiftってところもいい。

SVProgressHUD

言わずもがなのHUDライブラリ。MBProgressHUDよりこっちの方がアプリデザインに合っていたから採用した。

PureLayout

AutoLayoutをシンプルなコードで書けるライブラリ。一度慣れると相当使いやすくオススメです。

使っているうちに頭の中で何となくviewの位置関係が想像できるようになります。

UITableViewAutomaticDimensionと合わせて使えば可変のCellなども簡単です。

    override func updateConstraints() {

if alreadySetupConstraints == false {

authorImage.autoSetDimensionsToSize(CGSizeMake(42, 42))
authorImage.autoPinEdgeToSuperviewEdge(.Top, withInset: 16)
authorImage.autoPinEdgeToSuperviewEdge(.Leading, withInset: 16)
authorImage.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 16, relation: .GreaterThanOrEqual)

authorLabel.autoPinEdgeToSuperviewEdge(.Top, withInset: 17.5)
authorLabel.autoPinEdge(.Leading, toEdge: .Trailing, ofView: commentIconImage, withOffset: 8)
authorLabel.autoPinEdge(.Trailing, toEdge: .Leading, ofView: dateLabel, withOffset: 7, relation: .GreaterThanOrEqual)

commentLabel.autoPinEdge(.Leading, toEdge: .Trailing, ofView: commentIconImage, withOffset: 10)
commentLabel.autoPinEdge(.Top, toEdge: .Bottom, ofView: authorLabel, withOffset: 7)
commentLabel.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 12, relation: .GreaterThanOrEqual)
commentLabel.autoPinEdgeToSuperviewEdge(.Trailing, withInset: 40)

commentIconImage.autoSetDimensionsToSize(CGSizeMake(12, 11))
commentIconImage.autoPinEdgeToSuperviewEdge(.Top, withInset: 21)
commentIconImage.autoPinEdge(.Leading, toEdge: .Trailing, ofView: authorImage, withOffset: 16)

dateLabel.autoPinEdgeToSuperviewEdge(.Right, withInset: 15)
dateLabel.autoPinEdge(.Top, toEdge: .Top, ofView: authorLabel)
alreadySetupConstraints = true
}
super.updateConstraints()
}

上記はUICollectionViewCell内の実装の例ですが.GreaterThanOrEqualのように可変ということを直感的に書けるのは個人的にわかりやすくて好きです。

他の候補

Cartography

SnapKit

TSMessage

画面上部への通知を簡単に実装できます。

デザイン変更などもファイルで用意されているTSMessagesDegaultDesign.jsonを編集するのみ。

LockSmith

キーチェーンを簡単に扱えるラッパー。

他の候補

KeychainAccess

JTSImageViewController

Slackアプリを使っているユーザーには馴染みがあるような画像拡大のアニメーションライブラリです。

筆者がSlack好きなので採用しました.

Alamofire

AFNetworkingのSwift版ですね。Boltsと組みわせて使っています。

Bolts

非同期処理を直列で書くことができるものです。

[参考記事]

Bolts-iOSのとっても簡単な使い方説明


以下参考にしたもの

SECoreTextView

ハッシュタグやリンク(https://〜)などにタップ判定をつけてアクションを起こすときの参考になりました。

NSRegularExpressionなどと組み合わせると独自のリンクが作れます。

[参考記事]

UITextViewでタップ可能なリンクをカスタマイズする

Chorister

Choristerは音楽ファイルを再生しながらキャッシュにいれるライブラリなのですが、アプリ内ではこちらを参考に動画ファイルを再生しながらキャッシュにいれるという実装をしました。

AVAssetResourceLoaderを使ったことがなかったため新鮮でした。

[参考記事]

iOSアプリでWeb上の音楽ファイルをHTTPストリーミング再生しながらキャッシュにも入れるライブラリ、Choristerとその実装

AVPlayerCaching

DXPopOver

CMPopTipViewに用途は近いです。Swiftに書き換えて使いました。

UIBezierPathの勉強がてら。


動画編集アプリ(開発言語: Swift)で用いたもの

CMPopTipView

UINavigationBarButtonIやUIButtonなどを押した際にミニポップアップを表示できる。

GPUImage

前述。


以下参考にしたもの

RAReorderableLayout

UICollectionViewのスクロール方向がVerticalのみでHorizontalはサポートされていなかったので実装には用いませんでしたが非常に参考になりました。

わりとヘビーなアプリなのですが、ライブラリはあまり用いておらずAVFoundation周りをゴリゴリって感じでした。

これについてはライブラリというより各APIとかの紹介したほうが良さそうって思いました。

余談ですが

firefox-iosのiOSアプリがソースコードを全て公開してるんですがSwiftの勉強に非常にオススメです。

凝った書き方だったりSwiftらしさを味わえるんじゃないかなーと。

public class KeyboardHelper: NSObject {

public var currentState: KeyboardState?

private var delegates = [WeakKeyboardDelegate]()

public class var defaultHelper: KeyboardHelper {
struct Singleton {
static let instance = KeyboardHelper()
}
return Singleton.instance
}

/**
* Starts monitoring the keyboard state.
*/

public func startObserving() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardDidShow:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "SELkeyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}

deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}

特にこのKeboardHelperなどの考えは非常に参考になりました。

詳しくは中を見てみてください。


ライブラリを探すコツ

① とりあえずGitHubの有名どころをStar順にざーっと上から見たら大体のものは抑えられるかと。

② COCOAPODS SEARCHを見る

Trending in open sourceのSwiftタグのものを見る

検索条件はtodayだったり, weeklyだったり選べます。

④ 参考にしたい動きなどを実現しているアプリの設定画面からライセンスを見る。

それなりの規模のアプリであれば割と使っているライブラリを載せています。

⑤ GitHubのCode検索

スクリーンショット 2016-04-14 10.46.52.png

ライブラリとは少し違いますが、使いたいAPIのメソッドなどで検索するとヒットするので実際に使い方を見たりするのも参考になります。


終わりに

自分で大体作れるようになってくるにしたがってUI系などはライブラリを使うことが少なくなったなという印象です。

昔のソースコード見るのがわりと面白かったです。命名方法などは特に変わっていませんが、インデントルール守ってなかったり同じ(ような)コード大量にあったり分離が微妙だったり、さすがに成長してるなーと実感できました。

ライブラリの使い方は分かっても、どういう風に作られているのかを理解しないと、応用が利かないエンジニアになってしまうと個人的に考えています。

ですので、最近は中を見てから自分なりに書き換えて使ったり(Objective-C製のものをSwiftへ)知らないAPIなどについては調べてから使うようにしています。勿論時間も勿体ないので規模感にもよりますが・・。

あるライブラリを使う → 次から同じようなライブラリを自分で作れるようになろう

くらいの気持ちでいたようないい気がします。