SPM?

  • Swift Package Manager는 애플의 공식 Swift 의존성 관리 도구이다.
  • 예전에는 주로 Cocoapod을 썼는데, 이제는 많은 서드파티 라이브러리들이 지원하고 있다.
  • Cocoapod이나 파이썬의 pip, 노드의 npm처럼 패키지 서버가 존재하는 것은 아니고, 직접 깃 주소로 의존성을 붙여 놓으면, Xcode에서 해당 저장소를 받아와 Package.swift를 보고 빌드하는 방식이다.

아직도 지원안해?

  • 모든 서드파티 라이브러리들이 발맞춰 바로바로 지원해주면 좋겠지만, 지원하지 않는 경우가 있다. 이렇게 되면 코코아팟이랑 섞어쓰던가 우웩, 바이너리를 아예 git에다가 포함시켜야 하는데 이러면 사이즈가 너무 늘어나고, 이럴 때 xcframework 바이너리가 있다면 직접 레포지토리를 만들고 Package.swift를 작성할 수 있다. 아무래도 다른 레포지토리인 만큼 래핑한다고 해서 동일성을 주장할 수는 없지만 본인이 만든거라면 뭐…일단 여기서는 티맵의 Vector Map SDK로 예시를 들었다.
  • 만약 xcframework가 없다면 lipo 등으로 적절히 프레임워크를 추출한 후 묶어주면 된다.
xcodebuild -create-xcframework \
  -framework iOS/Framework.framework \
  -framework iOS-Simulator/Framework.framework \
  -output Framework.xcframework

xcframework 래핑

// swift-tools-version: 5.7
import PackageDescription
 
let package = Package(
    name: "TMapSDK",
    defaultLocalization: "ko",
    platforms: [
        .iOS(.v13),
    ],
    products: [
        .library(
            name: "TMapSDK",
            targets: [
                "TMapSDK"
            ]
        ),
    ],
    targets: [
        .binaryTarget(
            name: "TMapSDK",
            url: "https://***/releases/download/1.0.3/TMapSDK.xcframework.zip",
            checksum: "5c6ab09dad90cab15ab212bab67d604bc1fca905d401f0957edf649fb2b66a64"
        ),
    ]
)

주의점

  • 바이너리의 무결성을 검증하기 위한 체크섬이 필요한데, swift package compute-checksum path/to/TMapSDK.xcframework.zip 으로 SHA256형태의 체크섬을 구할 수 있다.
  • Package.swift가 담기는 저장소는 비공개로 두고 Xcode에 연결된 Github 등의 계정으로저장소 주소에 대한 접근 권한을 authorize할 수는 있지만, 실질적으로 바이너리가 존재하는 url은 공개된 리소스여야 한다. 깃헙 릴리스 기능을 활용하시는 분들이 많은 듯해서 나도 넣어 보았다. 사내 서버에 둘만한 공간이 있었으면 좋겠다