EMBEDDED FRAMEWORK
AND SO ON
2015/02/18
@TachibanaKaoru
自己紹介
• @TachibanaKaoru
• VOYAGE GROUP で働く iOS エンジニアで
す。
• Blog : http://www.toyship.org/
EMBEDDED FRAMEWORKとは
IOS8のAPP EXTENSIONで導入され
た、複数のプロセスから利用できる
共有ライブラリ
ただし、制限があります
IOSではアプリ内サンドボックスでし
か使えません。アプリAからアプリBの
EMBEDDED FRAMEWORKは使えない
APP EXTENSIONくらいでしか
使えない
でもとりあえず
どんな感じか見てみましょう
まずはOBJCで。
ホストアプリをOBJCで作成
新規TARGETで「COCOA
TOUCH FRAMEWORK」を追加
こんな感じでEMBEDDED
FRAMEWORKが追加されます
ホストアプリに、共通ヘッダー
をよみこめば、すぐ使える。
#import "ViewController.h"
// Embedded Frameworkの共通ヘッダー
#import "weather.h"
@implementation ViewController
- (void)viewDidLoad {
   
    [super viewDidLoad];
   
    // Embedded Frameworkのクラス
    [[WTInformation sharedInstance] test];
   
}
わりと簡単。
でも、リアルプロジェクトに
導入しようとすると……
……IOS7でビルドエラー!
EMBEDDED FRAMEWORKは、APP
EXTENSIONに伴って導入されたの
で、IOS8からしか使えない
IOS7対応のアプリでEMBEDDED
FRAMWORKを使いたい
でも、裏技があります。
まずは、FRAMEWORKをリン
クからはずしましょう。
そして、そのFRAMEWORKを
BUNDLEにいれます。
そして、FRAMEWORKを実行
時によみだします。
こんな感じ
// for dlopen/dlclose
#import <dlfcn.h>
@implementation ViewController
- (void)viewDidLoad {
   
    [super viewDidLoad];
   
    // Frameworkをロードする
    void *newframework = dlopen("./weather.framework/weather", RTLD_LAZY);
   
    // WTInformationクラスを作成
    id loadedClass = [[NSClassFromString (@"WTInformation") alloc] init];
    // メッセージを送る
    [loadedClass performSelector:@selector(logtoday:) withObject:nil withObject:nil];
   
}
(え、これ審査にひっかかる
んじゃないの?)
大丈夫、公式ドキュメントに
書いてあります。
ではSWIFTだとどうでしょう
ホストアプリをSWIFTで作成
新規TARGETで「COCOA
TOUCH FRAMEWORK」を追加
こんな感じでEMBEDDED
FRAMEWORKが追加されます
ライブラリ側にCATクラスを
作ってみる
import Foundation
public class Cat{
   
    public init(){
    }
   
    public func meow(count: Int) -> String {
       
        println(" meow! (count)")
        return "meow (otheranimals version)"
    }
}
ライブラリをIMPORTすると、ホス
トアプリからライブラリのアプリが
使えるようになります
import otheranimals
class ViewController: UIViewController {
    override func viewDidLoad() {
       
        super.viewDidLoad()
        var cat1 : Cat = Cat()
        cat1.meow(3)
 
    }
ここで唐突ですが
SWIFTには
NAMESPACEがあります
やったー、これで AF*****とか
TS*****とかPREFIXを書かなくてもよ
くなるぞ!
と思ったのもつかのま
……でも NAMESPACEってど
うやってつかうの?
USING NAMESPACE
とかないけど?
実は、SWIFTのNAMESPACEは
MODULE単位
APPやEMBEDDED
FRAMEWORKがMODULE
SWIFTではEMBEDDED FRAMEWORK
でNAMESPACEの分割ができる!
ではちょっとNAMESPACEを
試してみましょう
さきほど、ライブラリ側にCATクラス
を作成しましたが、アプリ側にもCAT
クラスを作成してみます。
import Foundation
class Cat{
   
    init(){
       
    }
   
    func meow(count: Int) -> String {
       
        println(" にゃあ! (count)")
       
        return "meow (otheranimals version)"
    }
   
}
ホストアプリからよんでみる
import otheranimals
class ViewController: UIViewController {
    override func viewDidLoad() {
       
        super.viewDidLoad()
 
        // App Version
        var cat1 : Cat = Cat() //ホストアプリのCatがよばれる
        cat1.meow(3)
       
        // Lib Version
        var cat2 : otheranimals.Cat = otheranimals.Cat() // ライブラリのCatがよばれる
        cat2.meow(5)
   }
}
NAMESPACEがあれば、同じアプ
リ内でCATクラスが二つ使える!
PREFIXをつけなくていい!
まとめ
• SwiftのEmbedded Frameworkいいかも。
おまけ
• Blogにもう少し詳しく書いてあるので、そち
らもどうぞ。
• http://www.toyship.org/archives/2096
• http://www.toyship.org/archives/2111
• http://www.toyship.org/archives/2099

Embedded framework and so on