티스토리 뷰

테스트 절차

 1.) Objective-C로 만들어진 외부라이브러리를 전혀 쓰지 않는 Framework를 만들어준다.

나는 PureObjcFramework라는 프레임워크로 만들어주고 PureObjcClass라는 클래스를 생성 후 PureObjcTestFunc라는 테스용 함수를 작성해 주었다.

해당 함수를 실행시켜주면 NSLog(@"called pureObjcTestFunc"); 라는 함수가 실행되게 만들어 놓았다.

github.com/HanweeeeLee/Framework_in_Framework_Sample/tree/main/PureFramework/PureObjcFramework

 

HanweeeeLee/Framework_in_Framework_Sample

Framework 안에 Framework를 넣어보자. Contribute to HanweeeeLee/Framework_in_Framework_Sample development by creating an account on GitHub.

github.com

앱에서 실행시키면 당연히 실행됨..

 

 2) 정상적으로 Objective C 프레임워크가 생성된것을 확인했으니 이 프레임워크를 Swift로 만들어진 프레임워크로 감싸보자

나는 SwiftFrameworkWrappingObjcFramework라는 이름으로 프레임워크를 만들고 그 안에 아까 만든 Objective C 프레임워크(PureObjcFramework)를 넣을것이다.

그 후 MySwiftClass라는 클래스를 만들고 이 함수에서 아까 넣어놨던 PureObjcFramework의 PureObjcTestFunc함수를 실행시키는 함수

callObjcFrameworkFunc 하나와 print("called Swift Func")이라는 로그를 찍을 함수 callSwiftFunc를 만들것이다.

 

 

요런 구성!

 3-1) 이제 Objective-C로 만들어진 프레임워크를 import하고, 클래스를 만들고, 사용을 해줘야한다. 위의 스크린샷에는 이미 사용 할 수 있게 만들어놓은 화면이지만, 단순히 프레임워크를 넣고 import를 하려면 import가 안된다는 메시지를 볼 수 있을것이다.

왜냐하면 Objective-C로 만들어진 framework이기때문에...

iOS나 macOS 앱에서는 이런경우 브릿지 헤더를 만들어서 연결을 해준다.

하지만 Framewrok에서는 그런거 지원 안된다...

이런경우 Framework에서는 몇가지 작업이 필요하다.

 

우선 모듈맵을 만들어줘야하며(필수),

엄브렐라헤더를 만들어주는것이 좋다(이건 필수 아님)

모듈맵

module SwiftLibWrappingObjc [system][extern_c] {
    header "../Headers/PureObjcFrameworkUmbrellaHeader.h"
    export *
}

이렇게 모듈맵 파일을 만들어줘야하며, 모듈맵 파일명은 원하는 파일명으로 하면된다.

그리고 내용에 module 뒤에 들어가는게 objc프레임워크를 import할때 쓰는 이름임..

헤더에는 아까 만들어줬던 objc의 헤더경로들을 쓰면 되는데 엄브렐러 헤더를 쓰면 수고를 줄일 수 있다..

엄브렐러 헤더

//
//  PureObjcFrameworkUmbrellaHeader.h
//  PureObjcFrameworkUmbrellaHeader
//
//  Created by hanwe lee on 2020/11/18.
//  Copyright © 2020 hanwe lee. All rights reserved.
//

#ifndef PureObjcFrameworkUmbrellaHeader_h
#define PureObjcFrameworkUmbrellaHeader_h

#import "../Framework/PureObjcFramework.framework/Headers/PureObjcFramework.h"

#endif /* PureObjcFrameworkUmbrellaHeader_h */

 

그리고 엄브렐러 헤더.. 경로를 지정해줘서 프레임워크의 헤더를 찾아준다.

(생각해보니까 PureObjcFramework.h 파일에 접근가능한 헤더 어짜피 다 모아놨었음..)

 

*이게 원래 그런지 모르겠는데 빌드를 한 후 나오는 .framework의 경로와 동일하게 맞춰놨음.. 이유는?

빌드를 한 후 앱에서 실행시키면 프레임워크 내부에있는 모듈맵이 동일한 경로로 헤더를 찾아가서.. 더 좋은 방법이 있을것 같은 생각이 든다.

 

 3-2)

위의 작업들을 완료하면 타겟의 빌드셋팅에 들어가보자.

수정해줘야 할것은 두가지이다.

 a) Packaging - Private Module Map File

 

해당 컬럼에 아까 만들어준 모듈맵의 경로를 입력한다.

 

 b) Swift Compiler - Search Paths - import Paths

 

소스 루트를 입력해주자.

 

github.com/HanweeeeLee/Framework_in_Framework_Sample/tree/main/WrappingFramework/SwiftFrameworkWrappingObjcFramework

 

HanweeeeLee/Framework_in_Framework_Sample

Swift Framework 안에 Objective-C Framework를 넣어보자. Contribute to HanweeeeLee/Framework_in_Framework_Sample development by creating an account on GitHub.

github.com

 

4) 이제 테스트앱을 만들고 테스트를 해보자.

앱을 만든 후 위의 그림처럼 프레임워크를 넣어주고

 

//
//  ViewController.swift
//  CallSwiftLibFromObjcLibApp
//
//  Created by hanwe lee on 2020/11/18.
//

import UIKit
import SwiftFrameworkWrappingObjcFramework


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let obj: MySwiftClass = MySwiftClass()
        obj.callObjcFrameworkFunc()
        obj.callSwiftFunc()
    }


}

 

아까 만들어줬던 Objective-C 프레임워크의 함수와 스위프트의 함수를 실행시켜보면

 

정상적으로 실행되는것을 확인할 수 있다.

 

github.com/HanweeeeLee/Framework_in_Framework_Sample/tree/main/SampleApp/CallSwiftLibFromObjcLibApp

 

HanweeeeLee/Framework_in_Framework_Sample

Swift Framework 안에 Objective-C Framework를 넣어보자. Contribute to HanweeeeLee/Framework_in_Framework_Sample development by creating an account on GitHub.

github.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함