iOS エンジニアの星川(@star__hoshi)です。
弊社では、 Classi先生用 というアプリを2017年4月にリリースしました。学校の先生が素早く出席を取ることを目的とした iPad 向けアプリです。
2016年10月に開発を始めたため、アプリケーションのコードは全て Swift で書いています。
この記事では、どういうライブラリを利用して開発したのかを紹介していきます。
ライブラリ管理
Carthage と CocoaPods の両方を使っています。基本的に Carthage を使い、 Carthage 未対応の場合は CocoaPods を使うようにしています。
ライセンスの表記は自作の carthage_acknowledgements を使っているのですが、 LicensePlist に乗り換え予定です。 -> 移行しました。
利用しているライブラリ
ishkawa/APIKit
Type-safe な API クライアント。
まるでドキュメントを写したかのような定義 のように書けて、とても良いです。
Hearst-DD/ObjectMapper
JSON Parser です。APIKit + Himotoki という構成をよく見ますが、toJSON できる ObjectMapper を選択しました。
Swift4 になれば不要になりますね!
class User: Mappable {
var id: Int = 0
var familyName: String = ""
var givenName: String = ""
required init?(map: Map) { }
func mapping(map: Map) {
id <- map["id"]
familyName <- map["family_name"]
givenName <- map["given_name"]
}
}
SVProgressHUD/SVProgressHUD
読み込み中の Indicator を出したり消したり、簡単に操作できます。
SVProgressHUD.show()
SVProgressHUD.dismiss()
kishikawakatsumi/KeychainAccess
Keychain を使いやすくするライブラリ。型も指定できて使いやすいです。
Keychain()[data: "data"] = Data()
let data = Keychain()[data: "data"]
malcommac/SwiftDate
Date を扱いやすく出来ます。
Date() - 1.year
みたいに Ruby? っぽく書けて良いです。
radex/SwiftyUserDefaults
型を指定して簡単に UserDefaults を定義/読み込みできます。
extension DefaultsKeys {
static let loggedIn = DefaultsKey<Bool>("loggedIn")
}
if Defaults[.loggedIn] {
print("ログイン済み")
}
しかしこのくらいだったら Swift: UserDefaults Protocol などを参考に自力で書いてもいいなあ、と思っています。
onevcat/Kingfisher
画像表示ライブラリです。サーバにある画像の URL を渡すだけで非同期で取得してくれ、キャッシュも勝手にやってくれます。素晴らしい。
imageView.kf.setImage(with: URL(string: "https://example.com/1.png")!)
tomvanzummeren/TZStackView
iOS7, 8 でも StackView が使えるようになります。
UIStackView と互換性があり、サポート OS を iOS9 以上にしたタイミングですぐに切り替えられるようなインターフェースで作られています。
let tzStackView = TZStackView()
self.view.addSubview(tzStackView)
tzStackView.axis = .horizontal
tzStackView.distribution = .fillEqually
tzStackView.alignment = .fill
tzStackView.spacing = 1
skywinder/ActionSheetPicker-3.0
Picker ライブラリ。 Picker を表示する ということに集中したコードを書けるので、読んでもわかりやすいです。
ActionSheetStringPicker.show(
withTitle: "title",
rows: ["1", "2", "3", "4"],
initialSelection: 1,
doneBlock: { _, index, _ in
print(index)
},
cancel: nil,
origin: sender
)
しかし、開発があまり活発でなく Issue や PR も溜まっているため、今後の採用は慎重になった方がいいかもしれません。
SnapKit/SnapKit
AutoLayout を DSL で書けます。基本的に Storyboard で画面を作っていますが、たまにコードで View を書くのでその時に活躍します。
let box = UIView()
let container = UIView()
container.addSubview(box)
box.snp.makeConstraints { (make) -> Void in
make.size.equalTo(50)
make.center.equalTo(container)
}
SwiftyBeaver/SwiftyBeaver
ログライブラリ、というかログプラットフォームサービス。お金を払うとリモートのログも見ることができます。
SwiftyBeaver でアプリケーションログをメール送信しデバッグしやすい環境を作る のように使っています。
scalessec/Toast-Swift
Android のように Toast を表示できます。ダイアログほど重要ではないけど、さりげなく伝えたいことがある時に使っています。
view.makeToast("This is a piece of toast")
このライブラリにバグがあり PR を出したのですが1ヶ月経ってもマージされず... 採用には慎重になった方がいいかもしれません。
Quick/Quick, Quick/Nimble
テストフレームワーク。標準の UITest と違い rspec のように BDD で書くことができて、テストを書いていて楽しいです。
import Quick
import Nimble
class UserSpec: QuickSpec {
override func spec() {
let user = User()
describe("fullName") {
it("全角スペース区切りのフルネームを取得すること") {
expect(user.fullName).to(equal("苗字 名前"))
}
}
}
}
AliSoftware/OHHTTPStubs
API の返り値をモックできます。 Quick と合わせて 【Swift】Quick + OHHTTPStubs で API のテストを書いていく のようにして使っています。
mac-cain13/R.swift
Storyboard 名や Localizable などをプロパティとして取得できる、つまりたいぽを無くせるライブラリです。
R.string.localizable.okButton()
R.nib.hogeTableViewCell.name
便利なのですが、ビルドのたびに処理が走り重いのと、プロパティ名が長いので使わない方向に切り替えたいです。
realm/SwiftLint
Lint ツール。とても良いのですが、ビルドのたびに全ファイル舐めていて重そうな気がしています。CIでチェックするくらいでいいのかもしれない。
.swiftlint.yml はこんな感じに書いています。
disabled_rules:
- nesting
- line_length
- function_body_length
- identifier_name
excluded:
- Carthage
- Pods
- App/SupportingFiles/R.generated.swift
- vendor
type_name:
min_length:
warning: 3
max_length:
warning: 60
excluded:
- GA
- ID
cyclomatic_complexity:
warning: 20
error: 30
type_body_length:
warning: 400
error: 700
Fabric, Crashlytics, Google/Analytics, Firebase/Core
アクセス解析、クラッシュログ収集のために使うライブラリです。GA, Firebase, Fabric で計測を行い、 Crashlytics でクラッシュログを取得しています。
参考: Firebase, Google Analytics, Fabric, Apple App Analytics の個人的使い分け - star__hoshi's diary
Cartfile, Podfile
上記で紹介したライブラリの管理ファイルです。
Cartfile
github "ishkawa/APIKit"
github "kishikawakatsumi/KeychainAccess"
github "SVProgressHUD/SVProgressHUD"
github "Hearst-DD/ObjectMapper"
github "malcommac/SwiftDate"
github "radex/SwiftyUserDefaults"
github "onevcat/Kingfisher"
github "tomvanzummeren/TZStackView"
github "skywinder/ActionSheetPicker-3.0"
github "SnapKit/SnapKit" ~> 3.1.2
github "SwiftyBeaver/SwiftyBeaver"
github "scalessec/Toast-Swift"
Cartfile.private
テストの時だけ使うライブラリです。
github "Quick/Quick"
github "Quick/Nimble"
github "AliSoftware/OHHTTPStubs" "swift-3.0"
Podfile
abstract_target で全ての target のライブラリ定義し、その中に個別に利用するもを追記しています。
platform :ios, '8.0'
abstract_target 'All' do
use_frameworks!
pod 'R.swift'
pod 'Fabric'
pod 'Crashlytics'
pod 'Google/Analytics'
pod 'Firebase/Core'
pod 'SwiftLint'
target 'App' do
target 'AppTests' do
inherit! :search_paths
pod 'Firebase/Core'
end
end
target 'AppStaging' do
end
end
おわり
この記事では、
Classi先生用 というアプリで利用しているライブラリを紹介しました。
ライブラリを利用するばかりなので、今後は自分でも作っていきたいところです 💪