accessTokenInfoTaskWithCompletionHandler 가 실행되고 에러가 없다는건
= 토큰 정보를 확인하는데 문제가 없다 = 유효한 토큰이 존재한다? 라는 의미일 텐데
session.token.accessToken 를 확인하면 nil 값이 반환되고 NSDictionary 를 생성하는데서 에러가 발생합니다.
해당 이슈가 프로덕션 환경에서 간헐적으로 발생하는데
타이밍이나 로직상, accessTokenInfoTaskWithCompletionHandler을 정상적으로 요청한 뒤에
session.token.accessToken이 nil 로 반환이 되는 경우가 있을 수 있나요?
ex) completion handler 실행과 api 콜로 인한 accessToken 업데이트가 동시에 비동기로 실행된다 라던지…
accessTokenInfo 호출시 엑세스토큰이 만료되었다면 sdk내부에서 (만료되지 않은 리프레시토큰으로)엑세스토큰갱신을 하게되는데 이때 엑세스토큰 갱신실패가 날경우 기존 토큰이 삭제 될수 있습니다.
그때는 session.token.accessToken이 nil 로 반환됩니다.
네… 로직상 저도 전혀 문제가 없어야 된다고 생각하는데, 문제가 발생하는 유저들이 있어서 난감하네요
프레임 워크에서 발생하는 크래시는 그냥 NSNull 로 처리하면 되는 문제이지만
근본적 원인은 SDK에서 accessTokenInfo API 호출 이후의 completionHandler 에서
accessToken 을 조회했을때 nil 을 반환하는게 원인입니다.
요약하자면,
0. 앱을 최초 설치 1. 카카오 로그인 2. accessTokenInfo 를 호출 3. accessTokenInfo 의 completionHandler 에서 session.token.accessToken 을 호출하면 간헐적으로 nil 이 나온다.
(NSDictionary 를 선언할 때 value 에 [NSNull null] 이 아닌, nil 이 들어가게 되면 크래시가 발생하는데, session.token.accessToken 을 NSDictionary 에 넣는 라인에서 nil 이 들어가 크래시가 발생합니다.)
입니다.
저도 딱히 답이 안보이네요, 토큰 갱신하는게 크게 중요한 기능은 아니라서
혹시나 시간날때 면밀히 살펴봐주시면 감사하겠습니다!
/*!
* @property automaticPeriodicRefresh
* @abstract access token의 자동 주기적 갱신 여부 설정. 해당 값이 YES일 경우 handleDidBecomeActive 및 특정 시간 주기로 필요시 토큰을 자동 갱신함.
* @discussion 값을 설정하면 현재 토큰 상태에 따라 타이머를 설정하거나 갱신이 필요할 경우 바로 갱신합니다. 이 속성 값은 기기에 저장되지 않고 메모리에서만 유지되므로 AppDelegate의 application:didFinishLaunchingWithOptions: 메소드 내에서 설정하는 것을 권장합니다. iOS 특성상 앱이 백그라운드로 내려가거나 suspend 상태가 되면 갱신이 불가능합니다.
* @seealso token
*/
혹시 automaticPeriodicRefresh 가 켜져있을때 handleDidBecomeActive 에서 일어나는 자동 갱신 로직으로 인해
아래의 시나리오가 발생 할 가능성이 있을까요?
Kakao 로그인 완료 후 앱으로 전환 [applicationDidBecomeActive]
아래 두개의 로직이 동시에 실행
5-1 [applicationDidBecomeActive] 의 [KOSession handleDidBecomeActive] 토큰 자동 갱신 로직 수행 (가설: 토큰 자동 갱신과 관련된 로직 실행이 되었으나, 타이밍적인 이슈로 KOSession 닫힌것으로 판단되어 토큰 초기화하는 로직 비동기 실행?)
5-2. 로그인 정보를 수신한 뒤, 앱에서는 이어서 다음 코드인 accessTokenInfoTaskWithCompletionHandler 호출
5-2 의 accessTokenInfoTaskWithCompletionHandler 요청은 성공되었으나 가설: completionHandler 에서 5-1 의 로직이 비동기로 함께 수행되며 타이밍적인 이슈 발생
사용자 토큰 주기적 갱신
iOS SDK는 API 호출 시 자동으로 사용자 토큰을 갱신하는 기능이 있습니다. 이 기능을 쓰려면 약간의 설정이 필요합니다. iOS 카카오 SDK에서는 두 가지 설정이 필요합니다.
AppDelegate-didFinishLaunchingWithOptions에서 automaticPeriodicRefresh 옵션을 활성화합니다.
문서에는 API 호출 시 자동으로 갱신하려면 사용해야 한다고 기술되어있는데, 필요 없는건가요?
아무튼, 제거하고 배포한뒤 경과를 살펴보겠습니다.