[하이브리드/AOS] 카카오톡 공유 시 카카오톡 앱 실행 관련(shouldOverrideUrlLoading 에서 호출안됨)

  • 안드로이드 웹뷰에서 카카오톡 공유 실행 시, (카카오톡 앱이 설치 되어 있어도) 웹으로 연결되어 아래처럼 로그인 페이지로 이동합니다.
  • 로그 찍어보면 shouldOverrideUrlLoading 메서드를 거치지 않고 바로 setWebChromeClient의 onCreateWindow이 호출됩니다.

00

01

  • IOS 웹뷰에서는 정상적으로 동작함
    ==> Javascript SDK에서 호출 쪽은 문제 없는 것으로 보입니다.
Kakao.Share.sendCustom({
      templateId: 77237,
      installTalk: true,
      templateArgs: {
        title: String(text),
        description: "",
        link: url,
        thumb_url: img,
        thumb_width: img_w,
        thumb_height: img_h,
      },
    });
  • 안드로이드에서 설정한 내용

AndroidManifest.xml

<manifest ...>
...
    <queries>
        <package android:name="com.kakao.talk" />
    </queries>
...
    <application ...>
         <activity
            android:name=".MainActivity"
            android:exported="true"
            >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host="kakaolink"
                    android:scheme="kakao{네이티브앱키 입력함}" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActivity

 mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                Log.d(TAG, "shouldOverrideUrlLoading: " + url);
                if (url == null) {
                    return false;
                }
                try {
                    if (
                            url.startsWith("intent")
                            || url.startsWith("intent:kakaolink")
                            || url.startsWith(kakaoChannelUrl)
                            || url.contains("kakao")
                    ) {
                        try {
                            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                            Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
                            if (existPackage != null) {
                                startActivity(intent);
                            } else {
                                Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                                marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
                                startActivity(marketIntent);
                            }
                            return true;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    startProgress();
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
                return false;
            }

위 코드로 이전에는 카카오톡앱으로 바로 호출되었던 것으로 기억하는데, 이번에 SDK 업데이트 이후에 안되는 듯 합니다.(정확하지 않음)

여기 가이드처럼 똑같이 설정하고 intent 부분도 아래처럼

if (request.url.scheme == "intent") {

처리해도, shouldOverrideUrlLoading메서드로 진입을 하지 않아서 확인이 안됩니다.
intent 자체가 아예 url로 안들어오는 것으로 보이는데 어떻게 해야 할까요?

아니면 위와 같이 동작하는게 정상일까요?

자문자답입니다.

웹뷰 상에서 구글 로그인 처리를 위해 user-agent를 변경한 것 때문에
Javascript SDK의 checkPlatform에서 Mobile이 아닌 PC로 인식해서
intent url이 아닌 일반 웹 주소를 호출한 것으로 보입니다.

ios상의 user-agent도 비슷하고 return값도 pc로 나오기는 하는데 정상적으로 앱이 호출되는 반면
안드로이드는 intent url 아닌 웹 주소를 호출하는 것 같아요.
uaer-agent를 변경하는 것으로 해결했습니다.

(혹시 mobile 체크 하는 부분이 sdk 업데이트되면서 변경된 것일까요?)