ねこ島

iOSのこととか、日常について雑に書きます

XcodeGenでEmbedded Frameworkを扱う

今日初めてEmbedded Frameworkを使おうとしたのですが、XcodeGenと組み合わせた時どうするんだっけ?となったのでメモとして残しておきます。

Embedded Frameworkとは

直訳すると「埋め込みフレームワーク」となるEmbedded Frameworkは、アプリのコードの一部をFrameworkとして扱うことができます。

この機能を使う利点は複数あり、

  • 必要なFrameworkだけビルドを行うのでビルドの高速化が期待できる
  • AppExtensionとコードを共有できる
  • 名前空間が分かれるため、テストを意識したコードがかける(はず)

と、アプリ開発する上で最初に導入しておくと後々効いてきそうだと思いました。

XcodeGenと組み合わせる

Embedded FrameworkはXcodeのTargetから追加できますが、前述の通りXcodeGenでプロジェクトデータを管理しているため、FrameworkもXcodeGenで管理の対象とする必要があります。

なので、project.ymlをこんな感じにしました。

name: TestApp
options:
  bundleIdPrefix: com.example
targetTemplates:
  EmbeddedFramework:
    platform: iOS
    type: framework
    sources:
      - path: ${target_name}
  EmbeddedFrameworkTests:
    type: bundle.unit-test
    platform: iOS
    dependencies:
      - target: TestApp
    sources:
      - path: ${target_name}
targets:
  TestApp:
    type: application
    platform: iOS
    sources:
      - path: TestApp
    dependencies:
      - target: TestAppData
      - target: TestAppDomain
      - target: TestAppExtension
  TestAppTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppData:
    templates: 
      - EmbeddedFramework
  TestAppDataTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppDomain:
    templates: 
      - EmbeddedFramework
  TestAppDomainTests:
    templates:
      - EmbeddedFrameworkTests
  TestAppExtension:
    templates: 
      - EmbeddedFramework
  TestAppExtensionTests:
    templates:
      - EmbeddedFrameworkTests
  ...

ここではFrameworkをData, Domain, Extension…と分けており、それぞれ同じBuild Settingsを使いたいので、targetTemplatesを使って共通で使えるようにしています。

参考

github.com techlife.cookpad.com