안녕하세요 flutter inAppWebView를 이용해 하이브리드 앱을 만들고 있습니다.
웹뷰에서 카카오 로그인 버튼을 누르면 카카오톡 앱을 실행시키고 싶지만 intent로 파싱을 시도할시에 intent.dataString이 null 로 반환되어 카카오톡 앱을 실행 시킬 수 없습니다.
url 수신은 flutter 쪽에서 하고 intent 파싱은 코틀린코드로 했습니다.
앱쪽 코드는 카카오 하이브리드 문서를 참고해서 작성하였습니다.
데브톡에 올라온 유사한 이슈
위 이슈와 같은 내용의 이슈로 추측됩니다.
안녕하세요.
파싱하신 코드와, 파싱전 전달된 내용 공유 부탁드립니다.
파싱코드
val url: String? = call.argument("url")
val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
result.success(intent.dataString)
전달 받은 intent url
intent:#Intent;action=com.kakao.talk.intent.action.CAPRI_LOGGED_IN_ACTIVITY;launchFlags=0x08880000;S.com.kakao.sdk.talk.appKey=a7385cbb67ce28a800d6e2da0c75d96e;S.com.kakao.sdk.talk.redirectUri=https://dev.chicruiting.com/auth/kakao/callback;S.com.kakao.sdk.talk.kaHeader=sdk/2.5.0%20os/javascript%20sdk_type/javascript%20lang/ko-KR%20device/Linux_aarch64%20origin/https%3A%2F%2Fdev.chicruiting.com;S.com.kakao.sdk.talk.extraparams=%7B%22client_id%22%3A%22a7385cbb67ce28a800d6e2da0c75d96e%22%2C%22redirect_uri%22%3A%22https%3A%2F%2Fdev.chicruiting.com%2Fauth%2Fkakao%2Fcallback%22%2C%22response_type%22%3A%22code%22%2C%22auth_tran_id%22%3A%22VWFWXCNE_UD0USYofIKTG3IyN1XknqEXHh1f2S6JKkiJOAd6tPjXyEzQAT2K%22%2C%22is_popup%22%3Atrue%7D;S.browser_fallback_url=https%3A%2F%2Fkauth.kakao.com%2Foauth%2Fauthorize%3Fclient_id%3Da7385cbb67ce28a800d6e2da0c75d96e%26redirect_uri%3Dhttps%253A%252F%252Fdev.chicruiting.com%252Fauth%252Fkakao%252Fcallback%26response_type%3Dcode%26auth_tran_id%3DVWFWXCNE_UD0USYofIKTG3IyN1XknqEXHh1f2
안녕하세요. 답변이 조금 늦었네요ㅠㅠ
말씀해주신 상황을 제대로 정확하게 이해하지 못했습니다.
하이브리드 앱을 개발 중이라고 하셨는데 ‘카카오톡 로그인’ 버튼을 눌렀을 때 수신되는 url은 어디서 전달해주는건가요?
웹 페이지에서 JavaScript용 카카오SDK를 사용하고 계신건지, 혹은 kakao_flutter_sdk를 사용하고 계신건지 잘 몰라서 현재 구현이 어떻게 되어있는지 파악하기가 어렵습니다.
사용 중인 SDK가 어떤 것인지 설명 부탁드리고, 로그인 버튼을 눌렀을 때의 플로우를 조금만 더 자세히 설명주시면 감사하겠습니다
JavaScript용 SDK 를 사용해서 구현했습니다.
웹쪽에서 “카카오 로그인 버튼” 을 클릭하면 Kakao.Auth.authorize() 함수를 호출하고,
앱쪽에서는 shouldOverrideUrlLoading 함수에서 수신되는 url 을 Intent.parseUri 로 파싱해서 사용합니다.
구현 상황 대략적으로 이해했습니다.
InAppWebView 클래스의 shouldOverrideUrlLoading 를 구현할 때, request.url의 scheme이 intent인 경우 String 값으로 변환해 메소드 채널로 android 단으로 전달해주고, android 단에서는 전달받은 String 값을 Intent.parseUri()
를 사용해 Intent
로 변환한 뒤에 startActivity()
를 호출해주는 방식으로 구현하면 정상적으로 동작할 것으로 보여요. (하이브리드 문서에서도 intent.dataString
을 사용하지는 않습니다)
대략적인 코드는 아래와 같고, 단순 예제 수준의 코드라서 참고만 하시는 것을 권장합니다.
InAppWebView(
// 나머지 부분 생략
shouldOverrideUrlLoading:
(controller, navigationAction) async {
var uri = navigationAction.request.url!;
if (uri.scheme == 'intent') {
final result = await channel.invokeMethod('launchIntent', {'url': uri.toString()});
return NavigationActionPolicy.CANCEL;
}
// 나머지 부분 생략
);
// 나머지 부분 생략
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
CHANNEL_NAME
).setMethodCallHandler { call, result ->
when (call.method) {
"launchIntent" -> {
val url = call.argument("url") ?: ""
val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
startActivity(intent)
result.success(true)
}
else -> {
result.notImplemented()
}
}
이 때 카카오톡 앱의 설치 유무, 미설치 시 browser_fallback_url 등을 활용해 카카오계정 로그인을 할 수 있도록 구현하면 더 좋을 것 같습니다. 이 점도 참고하시면 좋을 것 같아요.
안드로이드13 이후의 버전에서 카카오톡 앱이 실행되지 않습니다.
에러코드도 발생하지 않고 있습니다.
코드는 다음과 같습니다.
추가적으로 문서에 있는대로 로그를 찍었을때 pakage 의 값은 null 이 출력됩니다.
val url = call.argument("url") ?: ""
val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
Log.d("startActivity", "ACTIVITY: ${intent.`package`}")
}