109
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Embedded Frameworkの導入方法

Last updated at Posted at 2016-09-16

概要

Embedded Frameworkの導入方法やはまったところについてまとめました

Embedded Frameworkとは?

Embedded FrameworkはiOS 8・Xcode 6から追加された機能です。
アプリのコードを分割してFrameworkとして扱うことができます。

Embedded Frameworkを導入することのメリット

コードを分割してFramework化することで以下のメリットがあります。

  • コードのターゲットが分かれるため、差分コンパイルされビルドパフォーマンスが向上する
  • App Extentionsを持つアプリの場合、メインターゲットとExtension間でコード共有することができる
  • Frameworkに分けることで、依存関係がシンプルになる
  • Frameworkごとにテストを書くことができる

導入方法

Xcode 7.3.2 Swift 2.2での導入方法です。

Frameworkの作り方

Embedded Frameworkの導入は簡単で、Xcodeのツールバーから「File」 → 「New」 → 「Target」を選択すると、以下の画面が表示されます。

スクリーンショット 2016-09-15 14.54.40.png

そこから「Framework & Library」 → 「Cocoa Touch Framework」を選択すると新しくターゲットが追加されます。

d0337ade-fffd-1c29-27e5-1cd780a893c9.png

新しくできたTargetに分けたいコードを追加していきます。

Frameworkの使い方

Frameworkとして扱うメソッドやclass、変数にはメインターゲットからアクセスできるように public 修飾子をつけてください。

import Foundation
import Alamofire

public class Util {

    public var name: String?

    public init() {

    }
}

使用したいFrameworkをimportするだけで使えるようになります。

import UIKit
import SampleFramework

class ViewController: UIViewController {
  
    override func viewDidLoad() {
        super.viewDidLoad()
        let util = Util()
        util.name = "hoge"
    }
}

Embedded Frameworkの導入はすごく簡単です。
しかし、Framework内でライブラリを使う場合はいろいろとハマる部分がありました。
その対応方法をいくつか紹介したいと思います。

CocoaPodsでライブラリを使う場合

Embedded Frameworkだけでしか利用していないライブラリでも、メインターゲットにもインストールする必要があります。
Podfileにターゲットごとに同じライブラリ名を記述するのは手間なので、iQONではabstract_targetでまとめています。

// Podfile

abstract_target 'All' do # Targetとかぶらなければ、名前の文字列は何でも大丈夫です

  pod 'Alamofire'

  target 'SampleApp' do # AlamofireとSVProgressHUDがインストールされる
    pod 'SVProgressHUD'
  end

  target 'SampleFramework' do # Alamofireがインストールされる
  end
end

Carthageでライブラリを使う場合

CarthageもCocoaPodsと同様にFrameworkとメインターゲットどちらにも、ライブラリを設定する必要があります。
メインターゲットのEmbedded BinariesにFrameworkで利用しているライブラリを設定します。

e73231a2-4962-be61-d4c4-2f184cf57a0c.png

Library not loadedでクラッシュする場合

CocoaPodsでインストールしたライブラリがLibrary not loadedでクラッシュしてしまう時は「Build Phases」を確認してみてください。

おそらく、インストールしたライブラリをアプリ内に組み込むための Run Script が存在していないためにクラッシュしている可能性があります。
[CP] Embed Pods Frameworks という名前の Run Script は本来CocoaPodsが自動的に追加するもので、なぜそのRun Scriptが存在しないのかは詳しくは分かりませんが、追加すればクラッシュしなくなります。

スクリーンショット_2016-09-15_12_19_42.png

Framework not found Pods_**でビルドが通らない場合

[Build Phases] -> [Link Binary With Libraries]を確認してみてください。
エラーで表示されているFrameworkを削除してください。
以前からCocoaPodsでライブラリを管理しているプロジェクトだと、Pod_**.frameworkというものがLink Binary With Librariesに設定されています。
しかし、Podfileをabstract_targetで書くようにした場合、新しくPods-**-**.frameworkというものが設定されるので、Pod_**.frameworkが不要になります。
不要なものが設定されているために、ビルドに失敗していました。

スクリーンショット 2016-09-15 12.47.16.png

まとめ

Embedded Frameworkの導入は一部のハマりどころさえ超えれば、とても便利なのでおすすめです!

109
81
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
109
81

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?