1
/
5

Classi の iOS アプリ開発で利用しているライブラリ

iOS エンジニアの星川(@star__hoshi)です。

弊社では、 Classi先生用 というアプリを2017年4月にリリースしました。学校の先生が素早く出席を取ることを目的とした iPad 向けアプリです。

2016年10月に開発を始めたため、アプリケーションのコードは全て Swift で書いています。

この記事では、どういうライブラリを利用して開発したのかを紹介していきます。

ライブラリ管理

CarthageCocoaPods の両方を使っています。基本的に 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先生用 というアプリで利用しているライブラリを紹介しました。

ライブラリを利用するばかりなので、今後は自分でも作っていきたいところです 💪

Classi株式会社's job postings
7 Likes
7 Likes

Weekly ranking

Show other rankings