【Xcode/iOS】Static Library/Dynamic Frameworkの作成方法!

【Xcode/iOS】Static Library/Dynamic Frameworkの作成方法!

この記事からわかること

  • Xcode/iOSアプリライブラリフレームワーク作成方法
  • Static Library/Dynamic Frameworkの定義方法

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

モジュール化を行う方法

iOSアプリのプロジェクト内でモジュール化を行う方法としてあるのがライブラリとフレームワークへの切り出しです。「Static Library」や「Dynamic Framework」を作成する方法と使い方をこの記事ではまとめていきたいと思います。

  1. Static Library
  2. Dynamic Framework

Static Libraryの作成方法

XcodeからStatic Libraryを作成するには上部メニュー「File」>「New」>「Target...」からStatic Library」を選択します。

【Xcode/iOS】マルチモジュール化とは?ライブラリ/フレームワーク/SPMへの切り出し

Static Libraryを追加すると以下(TestLibrary)のようなファイル群が自動で追加されます。初回は指定したライブラリ名の名前がついた空のファイルだけが生成されます。

【Xcode/iOS】マルチモジュール化とは?ライブラリ/フレームワーク/SPMへの切り出し

アクセス修飾子を意識しながら定義する

生成されたディレクトリの中にモジュール単位に切り出したい処理を実装していきます。モジュール単位でのアクセスを意識した定義になるのでアクセス修飾子を正しく指定しながら定義していきます。

Swiftではデフォルトのアクセス修飾子が別モジュールからはアクセスできないinternalのため、 別のモジュールからアクセスできるようにしたい場合はpublicを付与してあげてください。


// デフォルトではinternalのため別モジュールからはアクセスできない
class TestLibrary {
    var text = "Hello, World!"
}

// 別のモジュールからアクセスできるようにしたい場合はpublicを付与する
public class TestPublicLibrary {
    // デフォルトではinternalのため別モジュールからはアクセスできない
    var text = "Hello, World!"
    
    // イニシャライザにもpublicを付与しないと別のモジュールからインスタンス化できない
    public init(text: String = "Hello, World!") {
        self.text = text
    }
    
    // publicを指定しているので別モジュールからアクセス可能
    public func sayHello() {
        print(text)
    }
}

プロジェクト内からライブラリを参照できるようにする

ここまできたら実際にこのライブラリをプロジェクト内から使えるようにしていきます。まずは一度普通にビルドします。ビルドするとlibTestLibrary.aというファイルが内部的に生成されます。その後対象のアプリプロジェクトの「General」>「Frameworks, Libraries, and Embedded Content」>「+」をクリックします。すると以下のように「libTestLibrary.a」が表示されているのでこれ選択して「Add」で追加します。

【Xcode/iOS】Static Library/Dynamic Frameworkの作成方法!

これでライブラリの導入は完了したので使いたい箇所でimportを使用することで定義されているコードが使えるようになります。


import SwiftUI
// 明示的にimport
import TestLibrary

struct ContentView: View {
    var body: some View {
        VStack {
            Button {
                // TestLibraryモジュールのコードを使えるようになる
                let testPublicLibrary = TestPublicLibrary()
                testPublicLibrary.sayHello()
            } label: {
                Text("sayHello")
            }
        }
        .padding()
    }
}

Dynamic Frameworkの作成方法

XcodeからFrameworkを作成するには上部メニュー「File」>「New」>「Target...」からFramework」を選択します。作成する際はバンドルIDも一緒に決める必要があります。またデフォルトで生成されるFrameworkはDynamic Frameworkです。Staticに変更したい場合は「Build Settings」>「Mach-O Type」>「Static Framework」に変更する必要があるようです。

公式リファレンス:Creating a static framework

【Xcode/iOS】マルチモジュール化とは?ライブラリ/フレームワーク/SPMへの切り出し

Frameworkを追加すると以下(TestFramework)のようなファイル群が自動で追加されます。

【Xcode/iOS】マルチモジュール化とは?ライブラリ/フレームワーク/SPMへの切り出し

アクセス修飾子を意識しながら定義する

ライブラリの時と同じようにアクセス修飾子を意識しながら定義していきます。


// デフォルトではinternalのため別モジュールからはアクセスできない
class TestFramework {
    var text = "Hello, World!"
}

// 別のモジュールからアクセスできるようにしたい場合はpublicを付与する
public class TestPublicFramework {
    var text = "Hello, World!"
    
    public init(text: String = "Hello, World!") {
        self.text = text
    }
    
    public func sayHello() {
        print(text)
    }
}

プロジェクト内からフレームワークを参照できるようにする

フレームワークはライブラリと異なり追加した時点でプロジェクト内で使えるようになります


import SwiftUI
// 明示的にimport
import TestFramework

struct ContentView: View {
    var body: some View {
        VStack {
            Button {
                // TestFrameworkモジュールのコードを使えるようになる
                let testPublicFramework = TestPublicFramework()
                testPublicFramework.sayHello()
            } label: {
                Text("sayHello")
            }
        }
        .padding()
    }
}

Embed & Signとは?

フレームワークも「Frameworks, Libraries, and Embedded Content」に追加されています。ただフレームワークの方には「Embed」の項目に「Embed & Sign」が選択されています。これはアプリ本体にライブラリ/フレークワークをどうやって組み込む(Embed)するかを指定するところになります。

【Xcode/iOS】Static Library/Dynamic Frameworkの作成方法!

基本的にフレームワークは「Embed & Sign」のままで良さそうです。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article