티스토리 뷰

728x90
반응형

Library, Framework, Swift Package 궁금한 것들을 확인해보고 정리합니다. 

테스트를 위한 MyApp workspace 를 하나 만들고 시작합니다.

 


[1] Library 

 

# 만들기 

File > New > Project > Static Library 선택 

MyStaticLibrary 라는 이름으로 만들고 아래처럼 경로 / Add to / Group 을 설정해줍니다. 

 

# 기본 정보 

Target에 가보면 Mach-O Type이 static library 로 세팅 되어있으며 (Project는 Mach-O Type이 명시 안되어있음)

앱에 embed 하면 .a 확장자를 볼 수 있습니다. 

 

 

 

# 궁금! 만약 Mach-O Type 을 dynamic library 로 바꾸면..?! 

 

다시 import를 해도 확장자 a 타입이고 빌드 후,  nm 으로 찍어보면 다이나믹으로 들어간 것을 볼 수 있습니다.

 

~~~~~ 아래처럼 확인했습니다 ~~~~~~~

MyApp 에 아래와 같은 코드를 작성하고 빌드 ! 

import UIKit
import MyStaticLibrary

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        MyStaticLibrary()
    }
}

 

DerivedData > MyApp > Build 에 들어간 후

아래 사진 처럼 '패키지 내용보기' 를 해줍니다. 

 

 

터미널에 nm을 입력하고 exec 파일을 끌어와줍니다. 

 

 

(참고: Framework 관련 명령어 )

 

 

1.  Mach-O type이 static 일때

 

 

2. Mach-O type이 dynamic 일때

 

 

2번 스샷처럼 나옵니다.

즉 악의적으로(?) dynamic library로 바꾸면 확장자가 a 더라도 dynamic 으로 여겨집니다.

(MyApp 빌드할때, 라이브러리쪽 코드가 포함되어 빌드되지 않는 것을 보고 알 수 있습니다.)

 

 

# 궁금! 그럼 확장자가 .dylib 인 진짜 dynamic library 는 어떻게 만드나?

 

이 글을 보면 애플이 제공하는 System iOS랑 macOS 만 다이나믹 라이브러리를 만들 수 있는 것 같습니다.  

Dynamic libraries outside of a framework bundle, which typically have the file extension .dylib, are not supported 
on iOS, watchOS, or tvOS, except for the system Swift libraries provided by Xcode, such as Core Data, Core Bluetooth, which belongs to Apple.

System iOS and macOS libraries are dynamic.
This means that your app will receive improvements from Apple’s updates without new build submission.

 

 

 

# Demo App

앱을 추가할 수 있습니다.

+ 를 누르고 App을 추가하면 됩니다. 

 

 


 

[2] Framework 

# 만들기 

File > New > Project > Framework 선택

MyFramework 라는 이름으로 만들어줍니다.

 

 

 

# 기본 정보

Target에 가보면 Mach-O Type이 dynamic libary 로 세팅 되어있으며 (Project는 Mach-O Type이 명시 안되어있음)

앱에 embed 하면 .framework 확장자이고 기본 설정이 Embed & Sign 입니다. 

 

 

 

Embed & Sign 이기때문에 프레임워크가 App executable 안에 embed 된 것을 확인할 수 있습니다.

 

 

 

이 글에서 잘 설명해주듯이 (추천!) 

 

1. Static Framework

- 빌드타임에 링킹. 

- Do Not Embed 가 맞는 조합. 

  빌드 시 포함되어(복사되어) 빌드되므로 Embed 를 할 필요없음. Embed 하는 것은 중복이기 때문

 

2. Dynamic Framework

- 런타임에 링킹.

- Embed 가 맞는 조합. 
  런타임에 의존되는데 Do Not Embed 를 하면 이 프레임워크가 필요할때 호출해도 없으니 크래쉬가 나기 때문.

 

 

위와 같은데요,,, 궁금하니까 청개구리 심보(?)로,,, 반대조합으로 테스트 해보겠습니다!

 

 

# 궁금!  static + embed 조합 

 

- Mach-O Type = static library

- Embed 옵션 = Embed & Sign

 

dynamic 일때 embed 이면 MyFramework가 exec 였는데,, 

 

 

static 일때 embed 면 MyFramework 타입이 바뀜 (무슨 확장자인지 모르겠음) 

 

 

 

# 궁금!  dynamic + do not embed 조합 

 

- Mach-O Type = dynamic library

- Embed 옵션 = Do Not Embed

 

시뮬레이터에서는 크래쉬가 안나고 실기기에서는 크래쉬가 납니다. 

왜 시뮬레이터에서는 안날까요??!

여기 선생님도 모르겠다고 하시네요 ㅠㅠ 

 

If you do not embed a dynamic framework, your app will crash on real devices which is clear.
I don’t know why but it still works on simulator.
So there is no way except embedding dynamic libraries.

 

어쨌든 이 조합은 절대 안됩니다! 

 

 

 

# Demo App

라이브러리와 동일하게 + 를 누르고 App을 추가할 수 있습니다. 

 

 


[3] Swift Package 

 

# 만들기 

File > New > Package 선택 

MySwiftPacakge 라는 이름으로 만들어줍니다. 

 

 

 

# 기본 정보

type을 명시하지 않으면 SPM이 자동으로 적절한 type 을 정해주는데 

 

 

대부분의 경우 static 인 것 같습니다. 

 

 

이렇게 dynamic 으로 바꿀 수 있습니다. 

 

 

 

 

type을 명시안하거나 static으로 했을때는 Embed 옵션이 안뜨고 (선택못함. Do Not Embed 일 것으로 보임.)

dynamic 으로 해줬을 때는 Embed & Sign 으로 세팅됩니다

 

 

 

# Demo App

앱을 추가할 수 있는 방법이 없습니다,, 

Embedding Sample App inside Swift Package 이런 글이 있는데 

SwiftPackage 안에 앱을 추가하는 방법은 아닌 것 같아보입니다..! 

 

 

 


[4] 언제 어떤 것을 써야할까?

 

# library vs framework  

# static vs dynamic

 

두 주제는 제가 계속 언급했던 Xcode Modules, Framework and Libraries Comparison 이 글에 잘나와있습니다! 

 

한국블로그들 도 추천합니다 (설명 good)
-  framework vs Library 
- Static Framework & Dynamic Framework (feat. Library)

- Library, Framework 그리고 XCFramework

 

 

# framework vs swift package 

 

이 주제는 구글링해도 잘안나오는데,,  아래의 차이를 생각하며 선택하면 좋을 것 같아요

 

[ Framework ]

- 프레임워크 안에 독립적으로 빌드, 테스트가 가능한 세부모듈을 둘 수 없음 

 

- 데모 앱 가능

 

 

[ Swift Package ]

- 패키지안에 독립적으로 빌드, 테스트가 가능한 세부모듈을 둘 수 있으며 (libray, target 설정으로)

세부모듈 끼리의 의존관계도 세팅할 수 있음

 

 

- 데모 앱 불가능 

 

 

 

 

 

 

반응형
댓글