새로운 빌드가 배포되면 토큰 정보가 사라지나요?

사용하는 SDK 버전 정보는 2.19.0 입니다.

adhoc으로 앱을 배포해서 테스트 중에 발견한 이슈입니다.

  1. 1.0, 1.1 버전으로 애드훅 배포
  2. 1.0 버전으로 카카오 로그인 완료 및 토큰 정보 확인 완료
  3. 1.1 버전 애드훅 버전 업데이트
  4. AppDelegate 함수에서 테스트 코드로 AuthApi.hasToken() 실행
  5. false 호출

디버그 모드로 앱을 새로 빌드하면 AuthApi.hasToken() 이 true로 반환 되는데 adhoc으로 배포하면 false로 반환되면서 카카오 토큰 정보가 사라지는 것으로 보입니다.

  1. 스토어 버전은 테스트하기가 어려워 확인은 못했지만 adhoc과 동일하게 발생하는지?
  2. 이렇게 동작하는게 정상인건지 확인 부탁드립니다.

안녕하세요.

토큰 정보는 UserDefaults를 사용하여 저장하고 있습니다.
따라서, 앱스토어를 통한 업데이트나 adhoc 설치 시 해당 정보가 초기화 되지 않습니다.

adhoc에 의한 배포에서만 초기화 된다고 보이신다면 bundleId 가 변경되었거나 기존앱을 제거하고 설치하지 않으셨는지 확인해 보시면 좋을것 같습니다.

UserDefaults를 사용하고 있어서 초기화 되지 않을 것이라고 예상은 했습니다.

해당 상황을 디버깅 해보면 아래처럼 출력됩니다.

  • AuthApi.hasToken → false
  • Auth.shared.tokenManager.getToken()?.accessToken → nil
  • UserDefaults.standard.object(forKey: “com.kakao.sdk.oauth_token”) → 데이터 있음

Userdefault에 “com.kakao.sdk.oauth_token” 정보는 있는 상황으로 보입니다. 이 값이 토큰값으로 보이는데 이유가 무엇인지 알 수 있을까요?

SDK 가 초기화 될 때, MigrateManager 에 의해 과거 버전 SDK의 토큰정보를 UserDefault에서 꺼내 초기화 되는데요

초기화 될 때 로그 첨부 부탁드립니다.
"start migration sdk from v1 to v2… " 으로 시작합니다.

"start migration sdk from v1 to v2… " 로그는 없는데 SDK 초기화 함수가 있나요?
초기화함수를 호출 해줘야하는것일까요?

AuthApi.hasToken() 호출하면 아래처럼 로그가 출력됩니다.

2024-04-25 02:44:38517 [:microscope:][Properties.swift 35:21] → load-crypted : {length = 1120, bytes = 0xeb666320 09580678 9c88b4c1 7b07fefa … 75766815 2dd3babc }

2024-04-25 02:44:38534 [:microscope:][Properties.swift 37:21] → load-plain : {length = 1120, bytes = 0x3a8ad0eb edc6c4bb 02f550b7 ee3713df … adfe0770 26a5a97c }

2024-04-25 02:44:38536 [:speech_balloon:][MigrateManager.swift 23:17] → ============================================================================================================

2024-04-25 02:44:38537 [:speech_balloon:][MigrateManager.swift 24:17] → check migration…

2024-04-25 02:44:38539 [:speech_balloon:][MigrateManager.swift 26:21] → pass migration…

2024-04-25 02:44:38540 [:speech_balloon:][MigrateManager.swift 27:21] → used sdk version:2.19.0

로그상 UserDefault에서 값을 가져온 것으로 확인됩니다.
다만, 토큰 정보의 경우 벤더ID를 seed로 하여 암호화 하여 저장하기에 복호화에 실패하면 Auth.shared.tokenManager.token에 값을 할당하지 않고 AuthApi.hasToken()는 false로 전달됩니다.

이 경우, 구현하신 코드나 카카오에서 제공하는 SDK가 원인이 되어 발생하는 오류가 아닙니다.
디버그 모드로 빌드했을 때와 아닐때 벤더ID가 변경되는 것으로 보이며 이 때문에 암복호화 시 실패 하는 것으로 추정됩니다.

앱 업데이트간에 토큰 정보를 유지하기 위해서는 동일한 환경에서 빌드된 버전간에만 테스트 부탁드립니다.

추가로 testflight 배포하셨다면 이 경우 암복호화에 사용되는 벤더ID가 계속 변경되기에 토큰 복호화에 항상 실패하게 됩니다.

그럼 마켓 버전은 벤더ID가 동일하기 때문에 문제가 발생하지 않는 것으로 이해해도 될까요?

벤더 ID는 UIDevice.current.identifierForVendor?.uuidString 를 말하는 것인가요?

네 맞습니다.

추가 설명드리면

그리고, 아래 애플문서에 벤더아이디 에 대해서 잘 설명되어있습니다.
https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor
요약:
“같은 공급자의 앱스토어버전에서는 일반적인 벤더아이디 속성에 따라 유지되고
테스트플라이트나 adhoc 배포에서는 벤더아이디가 계속 바뀔 수 있다…”

일반적인 상황에서 벤더아이디가 바뀌는상황은

  1. 디바이스가 바뀌거나
  2. 해당 그룹의 다른 앱 하나 없이 유일한데 삭제 후 재설치

이며 SDK의 벤더아이디 참조는 위 범위안에서 정상동작하게 설계 되었습니다.

2개의 좋아요

여기 내용으로 미루어볼때
최초 로그인은 엑스코드로 직접설치한 디버그버전으로 실행한것이고, 그이후 업로드한 ad-hoc 설치가 디버그 버전위에 업데이트 된것으로 보입니다.

1개의 좋아요