안녕하세요.
요청 사항 : kakao-ios-sdk Swift Package Manager(이하 SPM)의 dynamic linking 지원을 요청드립니다.
현재 상황 요약 :
SDK 제공시 KakaoOpenSDK를 다이나믹 링킹을 지원하기 위해 여러 방법을 사용함 하지만, 적용과정에서 문제가 발생
근본 문제는 KakaoOpenSDK에서 다이나믹 링킹을 지원하지 않기 때문에 호환에서 문제가 발생 추정
KakaoOpenSDK의 다이나믹 링킹 지원을 요청드림 또는 아래 상황에서 해결방법을 알려주시면 감사하겠습니다.
현재 상황 :
저는 중간 SDK 공급 업체 개발자입니다.
저희는 xcframework(바이너리) 형태로 cocoapods 사용하여 SDK를 공급하고 있었습니다.
고객으로부터 SPM 지원요청이 들어와서 바이너리 형태의 xcframework를 SPM으로 지원하려는 시도를 하고있는 중입니다.
public은 모두 objective-c로 이루어져있기 때문에, 당사 바이너리(xcframework)와 KakaoOpenSDK를 디펜던시를 가질 경우 @rpath를 찾을수 없는 문제를 발견하였습니다.
저희는 그래서, 중간의 Core라는 이름의 별도의 바이너리(.xcframework) SDK를 만들고 간접 참조하는 방법으로 이 문제를 해결했습니다.
그래프로 그리자면 다음과 같습니다.
as-is:
AFrmaework(.xcframework, binary) → KakaoOpenSDK (SPM, Swift Code)
==> 직접 참조 불가능
to-be:
AFramework(.xcframework, binary) → ACoreFraemwork(.xcframework, binary) → KakaoOpenSDK (SPM, Swift Code)
==> A Core Framework를 통한 간접 참조 가능
이러한 방식으로 AFramework를 제공하였지만, KakaoOpenSDK가 현재 Static 링킹만 제공하는 상황이기 때문에 ACoreFramework를 otool과 nm 명령어를 사용하여,
심볼 테이블과 @rpath를 참조하였을때, KakaoOpenSDK의 텍스트(소스)코드와 KakaoOpenSDK가 참조하는 Alamofire의 텍스트(소스)코드가 모두 포함되어 바이너리가 아카이브후 빌드가 되는 상황이 발생하였습니다.
일부 발췌(ACoreFramework.xcframework 심볼테이블 참조)
. . .
0000000000023e94 T _$s9Alamofire7SessionC14activeRequestsShyAA7RequestCGvM
0000000000023e94 T _$s9Alamofire7SessionC14activeRequestsShyAA7RequestCGvg
0000000000022180 T _$s9Alamofire7SessionC14activeRequestsShyAA7RequestCGvpfi
0000000000023e94 T _$s9Alamofire7SessionC14activeRequestsShyAA7RequestCGvs
0000000000023e94 T _$s9Alamofire7SessionC14requestTaskMapAA07RequestdE0VvM
0000000000023e94 T _$s9Alamofire7SessionC14requestTaskMapAA07RequestdE0Vvg
0000000000022104 T _$s9Alamofire7SessionC14requestTaskMapAA07RequestdE0Vvpfi
0000000000023e94 T _$s9Alamofire7SessionC14requestTaskMapAA07RequestdE0Vvs
. . .
그리하여, 저희는 이런 상황을 또 해결하기 위해 다음과 같이 엄브렐라를 통해 dynamic linking이 되도록 지원하였습니다.
AFramework(.xcframework, binary) → ACoreFraemwork(.xcframework, binary) → KakaoOpenSDKUmbrella (SPM, Swift Code) → KakaoOpenSDK (SPM, Swift Code)
KakaoOpenSDKUmbrella의 Package.swift의 일부 코드를 발췌하면 아래와 같습니다.
. . .
products: [
.library(
name: “KakaoCommonUmbrella”,
type: .dynamic,
targets: [“KakaoCommonUmbrella”]
),
],
dependencies: [
.package(url: “https://github.com/kakao/kakao-ios-sdk”, from: Version(2,1,9))
],
targets: [
.target(
name: “KakaoCommonUmbrella”,
dependencies:
[
.product(name: “KakaoSDKCommon”, package: “kakao-ios-sdk”)
]
),
]
. . .
이렇게 적용하여 ACoreFramework를 아키이빙(xcframework로 바이너리화)하게 되니, KakaoOpenSDK를 dynamic하게 링킹할수 있게 되었습니다.
(nm 및 otool 명령어로 심볼테이블 @rpath 확인, 파일 사이즈가 10 MB → 1xx KB 로 감소)
이렇게 적용한 SDK를 이제 더미앱에 적용했을때 다음과 같은 문제를 발견하였습니다.
상황 1
- 더미앱에서 AFramework를 먼저 SPM으로 적용 (KakaoOpenSDK 2.22.3 버전 적용됨) (KakaoOpenSDK는 Version(2,1,9) 이후 버전 지원하도록 설정)
- 빌드
- 정상 실행 확인
- SPM으로 KakaoOpenSDK Exact 2.22.0 버전 적용
- swift package reset
- 빌드
- 정상 실행 확인
- SPM으로 KakaoOpenSDK Exact 2.20.0 버전 적용
- swift package reset 이후 빌드시 빌드 되지 않음.
상황 2
- 더미앱에서 KakaoOpenSDK를 먼저 SPM으로 적용 (KakaoOpenSDK 2.22.3 버전 적용됨)
- 더미앱에서 AFramework SPM으로 적용
- 빌드
- 정상실행 확인
- SPM으로 KakaoOpenSDK exact 버전 변경(2.22.0)
- swift package reset
- 빌드 되지 않음
두 시나리오 모두, KakaoOpenSDK가 설치되고 난 뒤 KakaoOpenSDK의 버전을 변경할 수 없는 문제를 발견하였습니다.
현재는 원인을 KakaoOpenSDK가 static 링킹만을 지원하기 때문에 고정 버전을 설치하게 되면 SPM 상에서 호환문제가 발생하는 것이 아닌가 하고 의심하고 있습니다.
해당 현상을 해결하기 위해 KakaoOpenSDK의 다이나믹 링킹 지원을 요청드립니다.
(Alamofire는 AlamofireDynamic으로 이미 다이나믹 링킹을 지원하고 있습니다. https://github.com/Alamofire/Alamofire/blob/master/Package.swift)