48
EMBEDDED FRAMEWORK AND SO ON 2015/02/18 @TachibanaKaoru

Embedded framework and so on

  • Upload
    toyship

  • View
    678

  • Download
    0

Embed Size (px)

Citation preview

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