header-img
Info :

A. ๊ฒฐ๋ก 

  1. ํ˜ธ์ŠคํŠธ ์•ฑ์—์„œ static, dynamic ๊ด€๊ณ„ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  2. ํ˜ธ์ŠคํŠธ ์•ฑ์—์„œ ์ด๋ฏธ a ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ a ์‚ฌ์šฉํ•ด์•ผ ๋˜๋ฉด ์ถฉ๋Œ ์—†์ด ๊ทธ๋ƒฅ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฑธ๋กœ ์‚ฌ์šฉ๋จ.
  3. ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋Š” xcframework์ด๊ณ  ๊ทธ ๋‚ด๋ถ€๋Š” static library์ž„.
  4. ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ ์†Œ์Šค์ฝ”๋“œ ๋น„๊ณต๊ฐœ, ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด PC์— ํ•ด๋‹น ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด indexing์ด ๋˜์–ด์žˆ์Œ. ๋งŒ์•ฝ ์ œ3์ž๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ ์†Œ์Šค ์ฝ”๋“œ ์—†์ด pod์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๋งŒ ๋ฐ›๋Š”๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Œ.
  5. ์ฒดํฌํ•ด๋ณธ ๊ฒฐ๊ณผ ๊ฐ€๋Šฅํ•œ ๊ฒƒ
    1. ์ข…์†์„ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    2. ํ‚ค์ฒด์ธ ๊ฐ€๋Šฅ
    3. UIKit ์‚ฌ์šฉํ•ด์„œ vc, view … ๋“ฑ๋“ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  6. Bundle๋กœ ๋‚˜๊ฐ€์•ผ ํ•˜๋Š” xib, image ํŒŒ์ผ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐฐํฌ ๋ถˆ๊ฐ€๋Šฅ.

 

ํ…Œ์ŠคํŠธ

์ข…์†์„ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ UIKit ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • library์—์„œ Alamofire(์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ app project์—์„œ ์‚ฌ์šฉํ•œ ๋ชจ์Šต.
  • ibrary์— ์žˆ๋Š” viewcontroller, uiview๋ฅผ app project์—์„œ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•œ ๋ชจ์Šต.
  •  

 

B. ์ „์ฒด ๊ณผ์ •

  1. static library ๋งŒ๋“ค๊ธฐ
  2. 1์—์„œ ์ƒ์„ฑํ•œ ํ”„๋กœ์ ํŠธ์— pod์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ข…์†์„ฑ ์„ค์น˜
  3. static library xcframework
  4. ๋ฐฐํฌ์šฉ podspec ๋งŒ๋“ค๊ธฐ
  5. test ํ”„๋กœ์ ํŠธ์—์„œ pod์œผ๋กœ ์„ค์น˜ ํ›„ ๋นŒ๋“œ ์„ธํŒ… ์ˆ˜์ •

 

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

File > New > Project > Static Library ์„ ํƒ

dynamic framework์™€ ๋‹ค๋ฅด๊ฒŒ ์„œ๋ช…์„ ๊ผญ ๋ƒ…๋‘˜ ํ•„์š” ์—†์Œ. static library์—์„œ๋Š” ์„œ๋ช… ์ž์ฒด๊ฐ€ ์—†์Œ ์™œ๋ƒํ•˜๋ฉด ๊ทธ ์ž์ฒด๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๊ณ  ํŠน์ • ์•ฑ์ด๋‚˜ ๋ชจ๋“ˆ์— ์‚ฝ์ž…๋˜์–ด์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ. (์ถœ์ฒ˜ : about static library code signing … | Apple Developer Forums ) ๊ทธ๋Ÿฌ๋‚˜ ํƒ€๊ฒŸ iOS ๋ฒ„์ „์€ ๊ฐ library → targets → Build Settings → iOS Deployment Target์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋จ.

๋งŒ๋“  ํ”„๋กœ์ ํŠธ ์ฐฝ ๋‹ซ๊ณ  ํ•ด๋‹น ์œ„์น˜์—์„œ ํ„ฐ๋ฏธ๋„ open → pod init → vi PodSpec → ํŒŒ์ผ์— ์›ํ•˜๋Š” ์ข…์†์„ฑ ์ถ”๊ฐ€. Demo project์—์„œ๋Š” pod 'Alamofire'๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Œ. → pod install → ํ”„๋กœ์ ํŠธ๋ช….xcworkspace ์—ด๊ธฐ

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋ฉด ๋˜๋Š”๋ฐ pod์œผ๋กœ ์ข…์†์„ฑ ์„ค์น˜ํ•œ ๊ฒƒ์„ importํ•  ๋•Œ @_implementationOnly ํ‚ค์›Œ๋“œ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•จ. (e.g. @_implementationOnly import Alamofire)

์ฝ”๋“œ ์ž‘์„ฑ์ด ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด xcframework๋กœ ๋งŒ๋“œ๋Š” 3๋ฒˆ ๊ณผ์ • ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋นŒ๋“œ ํด๋ฆฐํ•ด์ฃผ๊ณ  ios, simulator๋กœ ๊ฐ๊ฐ ๋นŒ๋“œํ•ด์ฃผ์–ด์•ผ ํ•จ.

 

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

static library๋ฅผ ๋งŒ๋“  ์œ„์น˜์—์„œ ํ„ฐ๋ฏธ๋„ open ํ›„ ์•„๋ž˜์˜ ๋ช…๋ น์–ด ์‹คํ–‰ (์ด์ „์— ๋งŒ๋“  xcframework๊ฐ€ ์žˆ๋‹ค๋ฉด build, derived_data ํด๋” ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์‹คํ–‰)

// simulator ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ (์ƒ์„ฑ ์œ„์น˜ : derived_data ํด๋” ํ•˜์œ„)
xcodebuild build \\
  -scheme ํ”„๋กœ์ ํŠธ๋ช… \\
  -derivedDataPath derived_data \\
  -arch x86_64 \\
  -sdk iphonesimulator \\
  -workspace ํ”„๋กœ์ ํŠธ๋ช….xcworkspace \\
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES

// ๋งŒ๋“ค์–ด์ง„ ๊ฑธ build ํด๋” ๋งŒ๋“ค๊ณ  ๋‹ค์‹œ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ
mkdir -p build/simulators
cp -r derived_data/Build/Products/Debug-iphonesimulator/ build/simulators

// ios ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ (์ƒ์„ฑ ์œ„์น˜ : derived_data ํด๋” ํ•˜์œ„)
xcodebuild build \\
  -scheme ํ”„๋กœ์ ํŠธ๋ช… \\
  -derivedDataPath derived_data \\
  -arch arm64 \\
  -sdk iphoneos \\
  -workspace ํ”„๋กœ์ ํŠธ๋ช….xcworkspace \\
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES

// ๋งŒ๋“ค์–ด์ง„ ๊ฑธ build ํด๋” ๋งŒ๋“ค๊ณ  ๋‹ค์‹œ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ
mkdir -p build/devices
cp -r derived_data/Build/Products/Debug-iphoneos/ build/devices

// ๋ณต์‚ฌ๋œ library๋กœ xcframework ๋นŒ๋“œ (์ƒ์„ฑ ์œ„์น˜ : build ํด๋” ํ•˜์œ„)
xcodebuild -create-xcframework \\
    -library build/simulators/libํ”„๋กœ์ ํŠธ๋ช….a \\
    -library build/devices/libํ”„๋กœ์ ํŠธ๋ช….a \\
    -output build/ํ”„๋กœ์ ํŠธ๋ช….xcframework

 

E. ๊ฐ ๊ณผ์ • ์ƒ์„ธ - 4

3์—์„œ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์ ํŠธ๋ช….xcframework ํด๋”๋ฅผ ๋ฐฐํฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํด๋”๋กœ ์ด๋™. ์ด๋™ํ•œ ํด๋”์—์„œ cmd open → git init → git remote add origin ์ฃผ์†Œ๋ช… (๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐœ repo git ์ฃผ์†Œ) → touch ํ”„๋กœ์ ํŠธ๋ช….podspec → ์ƒ์„ฑํ•œ ์ŠคํŽ™ ํŒŒ์ผ ์˜คํ”ˆ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์ž‘์„ฑ

Pod::Spec.new do |s|
    s.name         = "ํ”„๋กœ์ ํŠธ๋ช…"
    s.version      = "๋ฒ„์ „" 
    # e.g. s.version = "0.1.0"
    s.summary      = "summary ์ž‘์„ฑ"
    s.description  = <<-DESC
    Desc ์ž‘์„ฑ
    DESC
    s.homepage     = "ํ™ˆํŽ˜์ด์ง€ ์ฃผ์†Œ"
    s.license = { :type => 'Copyright', :text => <<-LICENSE
                   Copyright 2018
                   Permission is granted to...
                  LICENSE
                }
    s.author           = { 'name' => 'email' }
    # e.g. s.author = { '์œ ์ €๋ช…' => '์ด๋ฉ”์ผ' }
    s.source       = { :git => "repo git ์ฃผ์†Œ", :tag => s.version.to_s }
    s.vendored_frameworks = "ํ”„๋กœ์ ํŠธ๋ช….xcframework"
    s.dependency '๊ฐ™์ด ๊น”๋ ค์•ผ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„'
    # e.g. s.dependency 'Alamofire'
    s.platform = :ios
    s.swift_version = "์Šค์œ„ํ”„ํŠธ ๋ฒ„์ „"
    s.ios.deployment_target  = '13.0'
    s.static_framework = true
end

์ดํ›„ ์•„๋ž˜ ์ˆœ์„œ ๋”ฐ๋ผ์„œ ๊นƒ ๋ฆฌํฌ์— ์—…๋กœ๋“œํ•ด์ฃผ๋ฉด ๋จ. (ํ˜„์žฌ ๋ฒ„์ „์ด 0.x.x๋ผ๊ณ  ๊ฐ€์ •)

  1. git add .
  2. git commit "commit msg"
  3. git tag 0.x.x
  4. git push origin ํ˜„์žฌ_๋ธŒ๋žœ์น˜ tag 0.x.x

๋งŒ์•ฝ ์ƒˆ๋กœ์šด xcframework๋ฅผ ๋งŒ๋“ค๊ณ  ์—…๋กœ๋“œํ•  ๋•Œ๋Š” ํ•ด๋‹น ํด๋”์—์„œ xcframework ์ด์ „ ๋ฒ„์ „ ๊ฒƒ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ์šด ํด๋” ๋„ฃ์–ด์ค€ ํ›„ podspec์—์„œ ๋ฒ„์ „ ์—… ์‹œ์ผœ์ฃผ๊ณ  ์œ„ 1~4 ๋ช…๋ น์–ด ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ ์—…๋กœ๋“œํ•˜๋ฉด ๋จ.

 

F. ๊ฐ ๊ณผ์ • ์ƒ์„ธ - 5

์‚ฌ์šฉํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Podfile์— ์•„๋ž˜ ๋ฌธ๊ตฌ ์ถ”๊ฐ€ (๋ฒ„์ „์€ 0.x.x๋ผ๊ณ  ๊ฐ€์ •)

pod 'ํ”„๋กœ์ ํŠธ๋ช…', :git => "๋ฆฌํฌ ์ฃผ์†Œ", :tag => '0.x.x'

๊ทธ๋ฆฌ๊ณ  ๋งจ ์•„๋ž˜ (end ๋’ค) ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€

post_install do |pi|
  pi.pods_project.targets.each do |t|
    t.build_configurations.each do |config|
      config.build_settings[‘BUILD_LIBRARY_FOR_DISTRIBUTION’] = ‘YES’
    end
  end
end

์ด ํ”„๋กœ์ ํŠธ์˜ Library Search Paths, Import Paths์— ์•„๋ž˜ ํ•ญ๋ชฉ ์ถ”๊ฐ€

$(SRCROOT)/Pods/ํ”„๋กœ์ ํŠธ๋ช…/ํ”„๋กœ์ ํŠธ๋ช….xcframework/ios-x86_64-simulator
$(SRCROOT)/Pods/ํ”„๋กœ์ ํŠธ๋ช…/ํ”„๋กœ์ ํŠธ๋ช….xcframework/ios-arm64

 

G. NAMSDK

→ NAMSDK์˜ GFPSDK๋„ static library๋ฅผ ์‚ฌ์šฉ ์ค‘

Specs/NAMSDK.podspec.json at master · CocoaPods/Specs

→ NAMSDK๋„ dependencies๋กœ 3rd party library์ธ KissXML์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ.

NAMSDK์™€ ๋น„๊ตํ•ด์„œ ์ง€๊ธˆ ๋˜์ง€ ์•Š๋Š” ์  : ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋นŒ๋“œ ์‹œ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ์ . Derived Data์— simulator ํด๋” ๋‚ด XCFrameworkIntermediates ํด๋”์— ์•„์นด์ด๋น™์ด ๋˜์ง€ ์•Š์Œ… ํ•˜์ง€๋งŒ ๊ตณ์ด ์ง€๊ธˆ ์ฐพ์ง€ ์•Š๊ณ  ๋ฐฐํฌ ๋•Œ ์ฐพ์•„๋„ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Œ.

 

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