読者です 読者をやめる 読者になる 読者になる

日々の作業メモ

ライトなインフラエンジニアです

自作Universal Frameworkをつくる (Xcode, Objective-C)

iOS

iOSの自作Universal Framework作りについて。
Cocoa Touch Frameworkを使用して、独自のFrameworkを作成します。

プロジェクトの作成

Cocoa Touch Framework を選択 f:id:jimaoka:20150927202759p:plain:w450

コーディング

コーディングします

Public Headerの設定

公開したいヘッダファイルを、[Build Phases] -> [Headers] のPublicにドラッグアンドドロップ。 (今回は Hoge.h)

f:id:jimaoka:20150927203047p:plain:w450

メインHeaderファイルの設定

また、フレームワークで import されたいヘッダファイルを [プロジェクト名].h ファイルでimportしておく。(FrameworkSample.h で Hoge.hをインポート)

f:id:jimaoka:20150927203337p:plain:w450

Build設定の変更

実機とシミュレータの両方に対応したFrameworkを生成するための設定。
[Build Settings] -> [Build Active Architecture Only] を Noにしておく。
f:id:jimaoka:20150927204843p:plain:w450

[Build Settings] -> [Valid Architecture] に "armv7 armv7s arm64 i386 x86_64" を設定。
f:id:jimaoka:20150927204857p:plain:w450

Universal Framework作成用のターゲットを作成

[File] -> [New] -> [Target] で新しいターゲットを作成する。 [Other] -> [Aggregate] を選択。
f:id:jimaoka:20150927210714p:plain:w450

名前は FrameworkSampleUniversalとかにしておく。
f:id:jimaoka:20150927210913p:plain:w450

さっき作ったターゲットの [Build Phases] タブの右上の + から New Run Script Phase を選択。
f:id:jimaoka:20150927211156p:plain:w450

Gistに上がっているRun Scriptを、Script部分に貼り付け。
https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79#file-universal-framework-sh
f:id:jimaoka:20150927211853p:plain:w450

Frameworkのビルド

まず実機用のバイナリファイルを生成するため、ターゲットを [FrameworkSample -> iOS Device] にしてBuildする。
f:id:jimaoka:20150927212306p:plain:w450

[FrameworkSample -> 何らかのシミュレータ] にして、シミュレータ用のバイナリファイルを生成。
f:id:jimaoka:20150927212441p:plain:w450

最後に[FrameworkSampleUniversal -> 何でもOK] で、2つのバイナリファイルを組み合わせたものを作成。
f:id:jimaoka:20150927212608p:plain:w450

Frameworkの対応Architectureを確認。

% lipo -info Documents/FrameworkSample/FrameworkSample.framework/FrameworkSample
Architectures in the fat file: FrameworkSample are: i386 x86_64 armv7 arm64

作成したFrameworkの使用

作成したFrameworkは、プロジェクト内にコピーして、Embedded Binariesにドラッグアンドドロップする。
f:id:jimaoka:20150927213340p:plain:w450

ViewController内で FrameworkSample.h をインポートして使用。
HogeクラスのgetHogeは @"HogeHoge"という文字を返すので、ラベルの文字を HogeHogeに変更する。

#import "ViewController.h"
#import <FrameworkSample/FrameworkSample.h>

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  Hoge *hoge = [Hoge alloc];
  [_label setText:[hoge getHoge]];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
}

@end

HogeHogeという文字が表示される。
f:id:jimaoka:20150927214630p:plain:w450

シミュレータでも実機でもビルド可能。
f:id:jimaoka:20150927215734p:plain:w450 f:id:jimaoka:20150927215736p:plain:w450