일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준2309
- hotStream
- conflate
- Advanced LCA
- KAKAO
- collectLatest
- app-distribution
- SDUI
- monotone stack
- coroutine
- google play console
- coroutinecontext
- ShapeableImageView
- 릴리즈 키해시
- Algorithm
- Product Flavor
- TOSS 과제
- java
- 안드로이드
- Android
- Flow
- flowon
- ServerDrivenUI
- cancellationException
- withContext
- 백준
- coldStream
- coroutinescope
- Next Challenge
- Kotlin
- Today
- Total
루피도 코딩한다
앱을 출시를 했는데요, 출시를 못했습니다 (2편/ Kakao Login) 본문
0. 지난 글 요약
1) 개인정보처리방침 url이 문제가 되어 3번의 리젝을 당함
2) url 수정끝에 릴리즈에 성공
3) 심사 통과를해서 프로덕션 출시가 시작됐는데, 앱 다운로드가 안됨
4) Leakcanary와 관련된 문제를 해결
5) ?? : 이제 다운로드는 잘 되는데, 카카오 로그인이 안돼요
그리하여 오늘은 카카오 로그인 에러를 해결한 경험에 대해 기록하고자 한다.
https://developer-rim.tistory.com/8
앱을 출시를 했는데요, 출시를 못했습니다 (1편/ Leakcanary)
0. 발단 지난 반년 간 사이드 프로젝트로 틈틈이 진행해오던 'ReadMe'가 드디어 릴리즈를 했다. 그러나 리젝만 3번 당하고 v1.0.4가 되어서야 프로덕션 릴리즈에 성공했다. 너무나도 기쁜 나머지 나
developer-rim.tistory.com
1. 문제 분석
분명 디버그시에는 카카오 로그인이 잘 작동했는데, 왜 릴리즈 모드에서 문제가 되는 것일까.
kakao developers 문서에 따라 릴리즈 키 해시도 등록해 두었는데 나는 또 조금 억울했다.
그렇지만 컴퓨터는 죄가 없는 법..
결론부터 말하자면, 릴리즈 키 해시를 잘못 등록한 것이 원인이었다.
2. 키 해시 추출 방법
Kakao Developers에서는 디버그/ 릴리즈 키 해시를 추출하는 2가지 방법을 제안한다.
1. 터미널에서 생성
2. Kakao SDK로 확인
https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android#add-key-hash
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
2-1. 터미널에서 키 해시 뽑아내기
본 프로젝트에서 나는 터미널을 활용하여 디버그/릴리즈 키 해시를 추출해냈다.
터미널 명령어는 mac과 window 운영체제별로 차이가 있고, 아래는 mac에서 디버그 키 해시를 추출하는 명령어이다.
[Debug 키 해시 추출]
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
[Release 키 해시 추출]
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
위 명령어 두 개를 위아래-위위 아래로 훑어보면 명령어의 구조는 거의 비슷하나 3가지 차이점이 있다.
1. debug 키 해시 추출 명령어의 경우 모든 유저가 일괄적으로 사용 가능하다.
2. debug 키 해시 추출 명령어의 경우
<RELEASE_KEY_ALIAS> 자리에 androiddebugkey가,
<RELEASE_KEY_PATH> 자리에 ~/.android/debug.keystore가 들어간다.
3. debug 키 해시에는 -storepass android -keypass android가 자리 잡고 있다.
첫 번째로, 디버그 키 해시 추출 명령어에 대해 살펴보자.
디버그 명령어의 경우 ~/.android/debug.keystore 경로에 있는 keystore를 가져와 파싱 하는 코드로 추측할 수 있다. 맥에서 cmd + shift + . 의 단축키를 누르면 finder에서 숨김 파일을 볼 수 있는데, 실제로 확인해보면 .android 폴더 내부에 이런저런 비밀스러운 파일들이 있으며 거기서 디버그 키를 가져오는 듯하다.(하단 이미지 참고)
두 번째로, 화근이 되었던 릴리즈 키 해시 추출이다.
릴리즈 키의 경우 디버그 키와 달리 <RELEASE_KEY_ALIAS>와 <RELEASE_KEY_PATH>를 직접 입력해주어야 한다.
여기서 말하는 RELEASE_KEY의 ALIAS와 PATH는 keystore과 관련이 있다.
잠깐 keystore와 관련된 이야기를 해보자.
릴리즈를 위해서는 Signed 된 Bundle/APK를 생성해야 하는데, 'Signed'된 파일을 생성하기 위해서 우리는 keystore 정보를 입력해야 한다. Signed Bundle / APK 추출이 처음이라면, 아래 우측 이미지에서 Create new를 눌러 keystore를 생성하게 된다.
keystore를 생성하는 화면은 아래와 같고, 우리는 빈 값을 채워 우측과 같은 형태로 만들어 준다.
이때 우리는 'Key Store Path'와 'Alias'를 지정할 수 있고, 이 값이 카카오 릴리즈 키를 추출할 때 필요한 값이니 기억해두자.
그렇다면 이제 keystore 생성까지 완료했으니, 카카오에서 제공해주는 명령어를 보고 < > 내부에 올바른 값을 채워 넣어 보자.
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
<RELEASE_KEY_ALIAS> 자리에 key0가
<RELEASE_KEY_PATH> 자리에 /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/ReadMeKeyStore가 들어간다.
keytool -exportcert -alias key0 -keystore /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/ReadMeKeyStore | openssl sha1 -binary | openssl base64
리눅스 명령어에 대해 조금이라도 아는 분들에겐 당연한 얘기겠지만, 아래와 같이 터미널의 현재 경로 자체를 keystore가 위치하는 폴더로 이동하고, <RELEASE_KEY_PATH> 자리에 상대 경로를 입력해주어도 좋다.
(base) kimhyorim@gimhyolim-ui-MacBookPro ~ % cd /Users/kimhyorim/AndroidStudioProjects/ReadMe-KeyStore/
(base) kimhyorim@gimhyolim-ui-MacBookPro ReadMe-KeyStore % keytool -exportcert -alias key0 -keystore ReadMeKeyStore | openssl sha1 -binary | openssl base64
Enter keystore password: ******
Oc*********************=
참고로, 경로의 경우 finder > keystore 우클릭 > 정보 가져오기를 누른 후, 위치를 복사하면 폴더의 절대 경로를 쉽게 가져올 수 있다.
그래서.. 무엇이 문제였는가?
실수는 간단했다. <RELEASE_KEY_PATH> 자리에 keystore의 확장자 (. jks)까지 붙여서 입력했다는 것.
올바르게 작성하기 위해서는, 상단 코드 블록에 기재해둔것 처럼 ..생략/ReadMe-KeyStore/ReadMeKeyStore으로 입력해야 한다.
그러나 나의 경우 ..생략/ReadMe-KeyStore/ReadMeKeyStore.jks 라고 입력했던 것이다.
경로를 올바르게 입력하지 않아도 키 해시가 튀어나온다.
그러나, 올바르게 경로를 입력한 경우에는 'Enter Keystore password : '라는 멘트가 나온다.
RELEASE_KEY_ALIAS와 RELEASE_KEY_PATH를 열심히 입력했음에도 불구하고 password를 나에게 물어보지 않는다면..
허공에 은은한 미소를 지어 보이고 다시 해보자..^^
2-2. 카카오 SDK를 사용하여 키 해시 뽑아내기
터미널 좀 써보겠다고 멋 부리지 않고, 카카오 sdk를 사용하여 키 해시를 뽑는 것도 상당히 현명한 방법이라 생각한다.
아무 Activity, Fragment 파일에서 작업해도 되지만, 편의를 위해 앱의 가장 첫 번째 진입 지점인 Activity에 아래와 같이 코드를 추가하면 된다. 나의 경우 로그인을 담당하는 AuthActivity에서 키 해시를 찍어보았다.
어차피 Key Hash만 추출하고 지울 코드이기 때문에, 아무렇게나 생명주기 함수 안에 대충 입력해도 상관없다.
import com.kakao.sdk.common.util.Utility
class AuthActivity : BindingActivity<ActivityAuthBinding>(R.layout.activity_auth) {
override fun onCreate(savedInstanceState: Bundle?) {
val keyHash = Utility.getKeyHash(this)
Log.d(TAG, "onCreate: $keyHash")
super.onCreate(savedInstanceState)
}
}
디버그 키 해시 추출 법
우리가 일반적으로 실행시킬 때 사용하는 ▶️ 버튼은 debug 모드로 실행이 된다.
따라서 ▶️ 버튼을 눌러 실행시킨 후 로그를 확인하면, 디버그 키 해시를 추출할 수 있다.
릴리즈 키 해시 추출 법
릴리즈 모드에서도 디버그 시와 동일한 코드를 활용한다. 단, 디버그 모드가 아닌 릴리즈 모드의 앱을 실행시켜야 한다.
릴리즈 모드로 실행은 어떻게 시킬까? 이런저런 방법이 있겠지만, 내가 느끼기에 가장 편했던 방법은, Signed 된 apk를 생성한 뒤 이를 에뮬레이터로 실행시키는 것이었다. 릴리즈 키 해시 추출 과정을 담은 영상은 아래에 첨부해두겠다.
3. Google Play Console 앱 서명? 두둥등장
kakao developer 문서를 쿰척쿰척 복사해왔다. 말이 초큼 어렵지만 그냥 하라는 대로 하면 된다.
Google Play 앱 서명(App Signing)을 사용한다면 직접 릴리즈 키 해시를 생성하지 않고, Google Play Console에서 얻은 SHA-1 인증서 지문(SHA-1 certificate fingerprint)을 Base64로 인코딩하여 사용해야 합니다. 자세한 내용은 Play Console 고객센터 > 앱 서명 사용하기를 참고합니다.
- [Google Play Console] > [설정] > [앱 무결성] 메뉴의 [앱 서명키 인증서] 항목에서 [SHA-1 인증서 지문] 값을 복사합니다. (아래 이미지 참고)
- 1번 단계에서 얻은 SHA-1 인증서 지문 값을 터미널에 다음과 같이 입력합니다. ${PRINTCERT} 부분에 실제 SHA-1 인증서 지문 값을 입력해야 합니다.
echo "${PRINTCERT}" | xxd -r -p | openssl base64
그러나 공식문서에서 한 가지 의문이 드는 부분이 있었다.
글의 앞부분을 보면, '직접 릴리즈 키 해시를 생성하지 않고'라고 되어있다.
만약 release 모드의 앱을 별도로 테스트해보지 않고, Google Play Store에서만 다운받아서 사용할 것이라면 2번에서 언급한 릴리즈 키 해시 추출 및 등록을 하지 않아도 된다. 그렇지만, 우리 팀의 경우 본격적인 출시 전에 release 버전의 앱으로 QA를 진행한다. 따라서 릴리즈 키 해시도, SHA-1을 Base64로 인코딩한 것도 모두 등록해주어야 한다. 카카오에서도 그렇게 하라고 한다.
https://devtalk.kakao.com/t/sdk/120479/5
SDK 이용한 카카오로그인 안됩니다
ID 573048
devtalk.kakao.com
릴리즈 키 해시를 제대로 추가한 것인지 확인하는 것은 위에서 이미 알아보았다.
그렇다면 Google Play Console에서 얻은 SHA-1 certificate fingerprint를 Base64로 인코딩한 값을 제대로 추출한 것인지는 어떻게 확인할 수 있는가? 앱의 심사가 끝나고 프로덕션 출시가 완료될 때까지 기다려야 할까?
Google Play App 서명을 사용한 apk를 google play console에서 다운받을 수 있다.
다운받은 apk를 에뮬레이터로 드래그해서 실행시켜보면, google play app 서명을 활용한 경우에서도 카카오 로그인이 잘 작동하는지 확인할 수 있다!
이렇게 키 해시까지 등록하고 확인까지 마무리하면 카카오 로그인
찐으로
끝! 🎉🎉
[번외] 정규표현식 고치기
| 여기서부터는 카카오 로그인과 관계없는 내용입니다.
나 : 카카오 로그인 고쳤어!!!
나의 안드 팀원 문** 언니와 이** 오빠는 요즘 취준때문에 바쁘다.
때문에, Leakcanary 에러를 잡는 시간도.. 카카오 로그인 키 해시 문제를 해결한 것도.. 외로운 사투의 시간이었다.
카카오 로그인을 해결하고 신난 마음에, 로그인 다음 화면인 닉네임 입력을 하고 있었는데 버그를 발견했다.
이** 오빠의 담당 뷰였는데, 복잡한 문제는 아닌 것 같아서 내가 해결을 했다.
1. 정규표현식 목록에 천지인 문자 추가 (ㆍ,ᆢ)
내 이름의 '효'를 천지인 키보드로 입력한다고 생각해보자.
ㅎ ㆍㆍㅡ 이렇게 4개의 문자를 눌러야 하는데, ㆍ를 한글로 인식하지 못하는 것이 첫 번째 버그였다.
2. 닉네임 관련 안내 메시지 분기 처리 버그 수정
1) 닉네임 최대 7글자 길이 제한이 있음
2) 7글자 입력함
3) 닉네임 확인 버튼 클릭 -> '사용 가능한 닉네임입니다' 멘트 나옴
4) 백스페이스로 한 글자 지워서 6글자 만듦
5) '닉네임은 최대 7글자까지 설정 가능합니다'라고 뜨지 말아야 할 것이 뜸
-> 메소드를 분리하여 의존성을 떨어뜨려 해결함!
그렇게 하루 만에 릭카나리, 카카오 로그인, 정규표현식 에러를 모두 수정하고 v1.0.5 릴리즈에 성공했다 🎉
'Android' 카테고리의 다른 글
Github Action을 통해 Firebase App Distribution에 자동으로 Android 앱 배포하는 방법 (+ Slack에 노티까지!?) (2) | 2023.08.06 |
---|---|
[Android] Product Flavor 사용환경에서 Crashlytics 적용하기 (feat. slack 알림 연동) (2) | 2023.06.01 |
[Android] ShapableImageView radius설정하기 (0) | 2022.11.27 |
앱을 출시를 했는데요, 출시를 못했습니다 (1편/ Leakcanary) (7) | 2022.10.04 |
[Play Store] AAB(Android App Bundle)로 앱 업데이트하는 법 (0) | 2022.05.09 |