Objective-C で Embedded Framework

iOS8から使えるようになったEmbedded Framework。 その使い方と、iOS7 でEmbedded Frameworkを使う方法を調べてみました。

Embedded Frameworkとは

Embedded Framworkは、複数のプロセスから利用できる共通ライブラリで、iOSでは、OS8のApp Extensionと同時に導入されました。

App Extensionでは、アプリ本体のプロセスと、App Extension側のプロセスが別なので、おなじsataic lib をリンクすると、その部分のバイナリが2倍になってしまいますが、これを利用すると共通化することができます。

ただし、残念ながらEmbedded Framworkの利用はおなじアプリサンドボックス内に限られ、他のアプリから使うことはできません。

Embedded FrameworkはApp Extensionや、Apple Watchなど、一つのアプリで複数のプロセスをハンドリングする時のための発生した手法ですが、別に普通のアプリでも使えます。

Embedded Frameworkをアプリに追加する

では、アプリに Embedded Frameworkを追加してみましょう。 もとになるアプリを news アプリ、Embedded Framework を weather Framework とします。

newtarget

まず、アプリにEmbedded Framework用の新規ターゲットを追加します。 「File」-「New」-「Target」を選ぶと、こんな画面が表示されるので、「Framework & Library」から「Cocoa Touch Framework」を選択します。

Screen Shot 2015-02-15 at 12.32.50 PM ここでは、「weather」という名前をつけます。 言語は「Objective-C」で、Embed in Applicationは、親アプリの「news」になっていることを確認してください。

Screen Shot 2015-02-15 at 12.47.30 PM

メインターゲットのビルド設定を確認すると、weather Frameworkが「Embed Framework」にはいっているはずです。

これで weather ライブラリができたので、このライブラリに自分の使うクラスを追加してください。 (ファイルを追加するときには、メインのターゲットではなく、Embedded Frameworkに追加してください。) 自分でつくったクラスは、自動で作成されるライブラリの共通ヘッダーファイル(この場合には weather.hという名前です)にこんな感じで記載していってください。

#import <UIKit/UIKit.h>

//! Project version number for weather.
FOUNDATION_EXPORT double weatherVersionNumber;

//! Project version string for weather.
FOUNDATION_EXPORT const unsigned char weatherVersionString[];

// 自分が作成したクラスをこんな感じで追加
#import <weather/WTInformation.h>

あとは、メインターゲットの適当なクラスで、共通ヘッダーをimportすれば、ライブラリのクラスを簡単に使うことができます。

#import "ViewController.h"

// Embedded Frameworkのヘッダー
#import "weather.h"

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    // Embedded Frameworkのクラス
    [[WTInformation sharedInstance] todaysweather];
    
}

App Extensionで使用する場合

Embedded Frameworkは、App Extensionで使うのが一般的ですが、App Extensionの場合、Extension部分では、使うことができるAPIに制限があります。 Extensionから使用するライブラリの場合には、Embedded Frameworkのここのチェックをonにしておきましょう。

appext

iOS7 以下で Embedded framwork を使うには

さて、このembedded frameworkは、App Extensionと同時に導入されたので、iOS8.0以上でしか使えません。 といっても、まだまだiOS7.0のデバイスに対応しなくてはいけないアプリも多いと思います。 そんな時には、こんなやりかたで Embedded Frameworkを使いましょう。