Kakao-ios-sdk Swift Package Manager dynamic linking 지원

안녕하세요.

요청 사항 : 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

  1. 더미앱에서 AFramework를 먼저 SPM으로 적용 (KakaoOpenSDK 2.22.3 버전 적용됨) (KakaoOpenSDK는 Version(2,1,9) 이후 버전 지원하도록 설정)
  2. 빌드
  3. 정상 실행 확인
  4. SPM으로 KakaoOpenSDK Exact 2.22.0 버전 적용
  5. swift package reset
  6. 빌드
  7. 정상 실행 확인
  8. SPM으로 KakaoOpenSDK Exact 2.20.0 버전 적용
  9. swift package reset 이후 빌드시 빌드 되지 않음.

상황 2

  1. 더미앱에서 KakaoOpenSDK를 먼저 SPM으로 적용 (KakaoOpenSDK 2.22.3 버전 적용됨)
  2. 더미앱에서 AFramework SPM으로 적용
  3. 빌드
  4. 정상실행 확인
  5. SPM으로 KakaoOpenSDK exact 버전 변경(2.22.0)
  6. swift package reset
  7. 빌드 되지 않음

두 시나리오 모두, KakaoOpenSDK가 설치되고 난 뒤 KakaoOpenSDK의 버전을 변경할 수 없는 문제를 발견하였습니다.

현재는 원인을 KakaoOpenSDK가 static 링킹만을 지원하기 때문에 고정 버전을 설치하게 되면 SPM 상에서 호환문제가 발생하는 것이 아닌가 하고 의심하고 있습니다.

해당 현상을 해결하기 위해 KakaoOpenSDK의 다이나믹 링킹 지원을 요청드립니다.

(Alamofire는 AlamofireDynamic으로 이미 다이나믹 링킹을 지원하고 있습니다. https://github.com/Alamofire/Alamofire/blob/master/Package.swift)

안녕하세요.
아래 공지와 같이 2023년 11월 30일 부로 iOS objective-c Kakao SDK v1 은 사용할 수 없게되었습니다. (Swift 기반 iOS SDK만 지원)

https://devtalk.kakao.com/t/android-ios-sdk-v1-notice-grace-period-for-kakao-sdk-for-android-and-ios-v1/126413

별도 지원은 불가하고 아래 내용 참고해보시면 좋을 것 같습니다.

objective-c 프로젝트에서 iOS v2 SDK 를 브릿지 방식으로 사용하는 예제 : https://kakao-tam.tistory.com/153

안녕하세요.

현재 v2를 사용하고 있습니다.

iOS objective-c Kakao SDK v1 지원은 별도로 필요하지 않으며

v2의 SPM 다이나믹 링킹을 지원해주셨으면 합니다.

확인해주시면 감사드리겠습니다.

@koy cc. @tim.l

안녕하세요.

KakaoSDK가 코코아팟 모듈지원 종료를 고려중이라 SPM의 다이나믹 타겟지원은 필수 지원 예정입니다.
(진행하게 된다면 우선순위 높혀서 SPM 다이나믹 타겟추가부터 시작할것 같습니다. 최대한 빨리 지원토록 노력할게요~)
Alamofire 도 최근버전인 5.9.0 부터 지원을 하기 시작했기때문에 외부디펜던시로 인한 이슈는 없을듯합니다.

다만 저희 sdk 모듈들의 다이나믹 타겟지원과는 상관없이 올려주신 케이스에 확인이 필요한 부분이 있습니다.
앱레벨에서 엄브렐러 다이나믹 프레임웍을 사용하여 라이브러리 중복을 회피한 상황으로 보이며

상황1과 상황2에서 최초설치시에는 문제없는것으로 볼때 버전변경 후 이전버전의 SPM 캐시가 남아있는것으로 보입니다.

한번 설치된 SPM 패키지는 “spm package reset” 만으로는 제거되지 않고 캐시로 남아있기때문에
터미널에서 아래명령어들로 확실히 날려주셔야 하며,

rm -rf ~/Library/Developer/Xcode/DerivedData
rm -rf ~/Library/Caches/org.swift.swiftpm
rm -rf ~/Library/org.swift.swiftpm
rm -rf ~/.swiftpm

경험상 경우에 따라서는 xcode도 종료 후 재실행해야하는 경우도 있습니다.

패키지 캐시도 리셋된것 확인은 package resolve나 package reset시 다운로드 프로그래스바가 나와야합니다.

2개의 좋아요

네 안녕하세요. 해당 명령어를 모두 적용한 뒤 Xcode를 껐다가 키고 심지어 Package History를 삭제후 실행하여도(어떤 방법이든 다 해봤습니다…) 동일한 현상이 일어납니다. (캐시가 리셋되지 않는건 Xcode, SPM 문제로 여기더라도… Dynamic과 Static이 혼용됐을 경우의 버전 호환성의 문제가 있어보입니다.
저희가 억지로 KakaoOpenSDK를 Dynamic으로 만들어 준 상태에서 Static을 적용하는 경우 내부 충돌이 있는거 같습니다.)

제가 추측했을 때… 저희 AFramework를 설치하고 적용시에는 별 문제가 안생기고, 다른 다이나믹 프레임워크(AlamofireDynamic 또는 RxSwfit)는 해당 과정에서 SPM 충돌이 일어나지 않는것으로 보아 KakaoOpenSDK를 설치시 Static한 코드가 적용되고, 해당 static 코드가 호환성에 문제를 끼치지 않나 하고 추측하여 Dynamic 라이브러리 요청을 드렸던 것입니다.

빠른 검토 해주셔서 감사드립니다.

1개의 좋아요

아 네. 확인 감사드립니다.

개발하시는 자세한 스펙을 몰라 확답드리기 어려우나 위 내용으로 볼때 가능성 높아 보이며
빠른지원 노력 해보겠습니다.
감사합니다.

1개의 좋아요