iOSアプリの共通機能をライブラリを使って逃がす

はじめに

同じ機能があるアプリを2〜3も作ってると結構メンテナンスが辛い。共通機能を小まめにライブラリ化して、ライブラリを更新するだけで両方が更新される状況を作りたい。

ただ、両方のコードを全て共通化させて楽をするというのは上手く行かなさそうなので、あくまで小さいパーツに切り分けて、操作は各アプリで違ってくるという考え方良いと思っています。

CocoaPodsによる、外部ライブラリの利用と作成 | Developers.IO を読んでライブラリを作ってみます。

結構簡単にできました。今回は複数のアプリで使っていたTableViewControllerをライブラリに逃がしてみました。

try! Swift 文化を調和させる で学んだDataSourceの外出しを試してみました。ちょうど、最後の方のスライドの上に外出しした部分をライブラリにした具合ですね。

ライブラリを更新して、複数のアプリでpod updateすれば修正が全てに適応されます。ライブラリコードを固めることで良くも悪くも、自由度が下がり保守コストが下がります。

何はともあれCocoapodsの設定ファイルを作る

ライブラリは作成済み前提です。以下の様なコマンドを実行します。

$ pod spec create XXX

作成されたXXX.podspecを適切に編集する。

プライベートなCocoaPodsのSpecsを作成してデプロイ

githubで空っぽのCocoaPodsSpecsを作成してから作業する。

$ pod repo add yoneapp https://github.com/yoneapp/CocoaPodsSpecs
$ pod repo push yoneapp --allow-warnings --verbose

Podfileを書き換える

source 'git@github.com:yoneapp/CocoaPodsSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

use_frameworks!
platform :ios, '8.0'

target 'YYY' do
  pod 'XXX'
end

自分のライブラリ内で外部ライブラリを使う

Pod::Spec.new do |s|
  ...
  s.dependency 'PullToRefreshSwift', "= 2.0.0"
end

ios - How to import Alamofire/AFNetworking in my custom cocoapod - Stack Overflow

まとめ

今回作ったライブラリは公開できなさそうなんだけど、自前コードをライブラリ化する癖をつけておけば Motivation based library abstraction のようにライブラリを公開出来る日が来るんじゃないかなと思いました。