header-img
Info :

A. Umbrella Framework ๋ถˆ๊ฐ€๋Šฅ

Technical Note TN2435: Embedding Frameworks In An App

Umbrella framework : ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํ˜•ํƒœ. macOS์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ง€์–‘๋˜๋Š” ๊ตฌ์กฐ. iOS, watchOS, tvOS์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•จ. ๋”ฐ๋ผ์„œ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์— ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„ฃ์ง€ ๋ง๊ณ  Embedding a framework ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

 

B. ์ผ๋ฐ˜ 3rd party framework ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ• ์ „์ฒด ๊ณผ์ •

์•„๋ž˜ ๋‹จ๊ณ„๋Š” framework project, test project, ๊ฐœ๋ฐœ workspace(framework project, test project๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ)๊ฐ€ ๋ชจ๋‘ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. [optional] test project, framework project์— pod๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•จ.
    1. pod์ด ์„ค์น˜๋œ ํ”„๋กœ์ ํŠธ์—์„œ cmd open
    2. pod deintegrate
    3. rm Podfile
    4. rm Podfile.lock
  2. framework project์—์„œ cmd open → pod init
  3. 2๋ฒˆ์œผ๋กœ ์ƒ์„ฑ๋œ Podfile์„ ์—ด๊ณ  ์ข…์†์„ฑ ์ถ”๊ฐ€
  4. 2๋ฒˆ์˜ ์œ„์น˜์—์„œ ๋‹ค์‹œ cmd open → pod update
  5. ๊ฐœ๋ฐœ workspace(framework project, test project๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ)์—์„œ project navigator ์šฐํด๋ฆญ ํ›„ add files to “…” ์„ ํƒ → ์„ค์น˜๋œ Pods ํด๋”์˜ Pods.xcodeproj ํŒŒ์ผ ๋„ฃ๊ธฐ
  6. framework project build
  7. test project build

 

C. ๊ฐ ๊ณผ์ • ์ƒ์„ธ - 1

[optional] test project, framework project์— pod๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•จ.pod์ด ์„ค์น˜๋œ ํ”„๋กœ์ ํŠธ์—์„œ cmd open -> pod deintegrate -> rm Podfile -> rm Podfile.lock

framework project์—์„œ๋งŒ pod ์ดˆ๊ธฐํ™”, ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์„ ํ•ด๋„ ๋˜์ง€๋งŒ ๊น”๋”ํ•˜๊ฒŒ ์‚ญ์ œํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ์ถฉ๋Œ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ framework project, test project ๋ชจ๋‘ ์ดˆ๊ธฐํ™”

 

D. ๊ฐ ๊ณผ์ • ์ƒ์„ธ - 2, 3, 4

framework project์—์„œ cmd open → pod init → 2๋ฒˆ์œผ๋กœ ์ƒ์„ฑ๋œ Podfile์„ ์—ด๊ณ  ์ข…์†์„ฑ ์ถ”๊ฐ€ → 2๋ฒˆ์˜ ์œ„์น˜์—์„œ ๋‹ค์‹œ cmd open → pod update

์ข…์†์„ฑ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™์Œ.

workspace 'workspace_์ƒ๋Œ€๊ฒฝ๋กœ'

target 'test_ํ”„๋กœ์ ํŠธ๋ช…' do
  # Comment the next line if you don't want to use dynamic frameworks
  # use_frameworks!
  pod 'lib_์ด๋ฆ„1'
  pod 'lib_์ด๋ฆ„2'
  # Pods for PointHomeDummyProject

  
  target 'framework_ํ”„๋กœ์ ํŠธ๋ช…' do
    xcodeproj 'framework_ํ”„๋กœ์ ํŠธ_์ƒ๋Œ€๊ฒฝ๋กœ'
    pod 'lib_์ด๋ฆ„1'
    pod 'lib_์ด๋ฆ„2'
  end
end
  • workspace_์ƒ๋Œ€๊ฒฝ๋กœ : ๊ธฐ์กด์— ๋งŒ๋“ค์–ด๋‘” ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ ๊ฒฝ๋กœ๋ฅผ cmd openํ•œ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ ์–ด์คŒ
  • test_ํ”„๋กœ์ ํŠธ๋ช… : ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์„ ์ ์–ด์คŒ
  • lib_์ด๋ฆ„ : ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„
  • framework_ํ”„๋กœ์ ํŠธ๋ช… : ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ์ ์–ด์คŒ
  • framework_ํ”„๋กœ์ ํŠธ_์ƒ๋Œ€๊ฒฝ๋กœ : ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ”„๋ ˆ์ž„์›Œํฌ.xcodeproj ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ cmd openํ•œ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ ์–ด์คŒ.

์‚ฌ์šฉํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.

<์ƒ๋žต>

 

E. ๊ฐ ๊ณผ์ • ์ƒ์„ธ - 5, 6, 7

๊ฐœ๋ฐœ workspace(framework project, test project๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ)์—์„œ project navigator ์šฐํด๋ฆญ ํ›„ add files to “…” ์„ ํƒ → ์„ค์น˜๋œ Pods ํด๋”์˜ Pods.xcodeproj ํŒŒ์ผ ๋„ฃ๊ธฐ→ framework project build → test project build

5๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด workspace์—๋Š” framework project, test project, pods project ์„ธ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์žˆ์–ด์•ผ ํ•จ.

 

F. ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

  • workspace์—์„œ test๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ ๋นŒ๋“œ๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•„๋ž˜ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋จ.
    • framework project → target → Build Settings → Library Search Paths, Framework Search Paths, Runpath Search Paths. ์ด ์„ธ ๊ฐ€์ง€ ํ•ญ๋ชฉ ๋ณด๋ฉด ๋จ.
    • ๋ชจ๋“ˆ์„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด Framework Search Paths, Library Search paths๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด Runpath Search Paths๊ฐ€ ์ž˜๋ชป ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ์Œ.
  • ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋Œ๋ฆด ๋•Œ Could not find module '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ช…' for target 'x86_64-apple-ios-simulator'๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์•„๋ž˜ ์‚ฌํ•ญ ์ฒดํฌ
    • workspace์—์„œ pods ํด๋ฆญ → Targets ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ → Build Settings → architecture ๊ฒ€์ƒ‰ → Build Active Architectures Only๊ฐ€ Yes๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  Excluded Architectures๊ฐ€ iOS simulator์— ๋Œ€ํ•ด์„œ๋Š” arm64๊ฐ€ ์ œ์™ธ๋˜์–ด ์žˆ๋Š”์ง€ ์ฒดํฌ ํ•ด์ค˜์•ผ ํ•จ. ์•„๋ž˜ ์‚ฌ์ง„ ์ฐธ๊ณ .

 

Z. ์ฐธ๊ณ  ์ž๋ฃŒ

๋”๋ณด๊ธฐ
CS/iOS, Swift