카카오링크 웹 공유 기능 지원 중단인가요?

카카오링크 웹 공유 기능이 v1.9.0 버전에서 추가된 걸 확인하고 그 당시 sdk 버전 업데이트하고 테스트 해봤습니다. 잘 됐었는데 언제부터인지 되지 않는 것 같습니다.

ResponseCallback.onFailure() 가 호출되고 아무런 동작이 없네요

중단되지 않았어요. 다른 문제가 있을것 같은데요, 좀 더 상세한 내용을 알 수 있을까요?

ErrorResult.getException() 을 출력해봤을 때 다음과 같이 나옵니다.

“KAKAOTALK_NOT_INSTALLED: 최신버전의 카카오톡으로 업데이트가 필요합니다.”

문의 시 gradle 은 다음과 같이 추가하고 테스트해봤고, 최신 버전(1.19.0)으로도 테스트해봤는데 결과는 같습니다.

implementation ‘com.kakao.sdk:kakaolink:1.12.0’

apk 는 release 로 추출해 설치해보거나 Play 스토어 앱에서 다운로드 받았습니다.

톡 미설치 시 위 에러가 노출되는 경우는 아래의 경우가 있습니다.

  1. API level 15 미만
  2. Custom Tabs 프로토콜을 지원하는 브라우저 미설치 (크롬, 삼성브라우저, 파이어팍스)

웹공유는 외부 브라우저를 바로 띄우는게 아니라 Custom Tabs 를 사용하여 인앱 브라우저 탭 형태로 띄우도록 구현되어 있습니다. 위 두가지 경우에 해당되시나요?

1개의 좋아요

실행한 기기의 Android API level 은 28입니다. (앱의 min sdk 는 18 target sdk 는 28)
기기의 브라우저는 크롬, 삼성브라우저가 설치되어 있습니다.

custom tabs 와 관련해 누락한 가이드는 없을까 찾아보다가, 누락된 아래 코드를 추가도 해봤는데 결과는 동일하게 실패입니다. (추가 질문이, 이 가이드는 카카오링크 기능에 필요 없는 코드일까요?)

build.gradle (module level)

implementation "com.kakao.sdk:usermgmt:$kakao_version"

AndroidManifest.xml

<activity
    android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
    android:launchMode="singleTop"
    android:windowSoftInputMode="adjustResize">

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

SDK 소스 코드가 같이 업로드 되어 있는데 KakaoLinkService 코드에 디버그 모드로 실행해보실 수 있을까요?

        if (!isKakaoLinkV2Available(context) && Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
            callback.onFailure(getKakaoTalkNotInstalledErrorResult(context));
            return;
        }

또는 resolveCustomTabsPackageName 등 메소드를 디버그 해보시면 될 것 같아요.

resolveCustomTabsPackageName() 메소드에서 serviceInfos 의 size 가 0입니다.
따라서 packageName, availableChrome 변수의 값이 모두 null 이 됩니다.

    Intent serviceIntent = new Intent();
    serviceIntent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION);
    List<ResolveInfo> serviceInfos = context.getPackageManager().queryIntentServices(serviceIntent, 0);

말씀하신 것처럼 Custom Tabs 프로토콜을 지원하는 브라우저의 미설치/못찾는 경우로 생각됩니다.

메소드는 참고용으로 붙입니다.

@SuppressWarnings("WeakerAccess")
String resolveCustomTabsPackageName(final Context context, final Uri uri) {
    String packageName = null;
    String availableChrome = null;

    // get ResolveInfo for default browser
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
    ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);

    // get ResolveInfos for browsers that support custom tabs protocol
    Intent serviceIntent = new Intent();
    serviceIntent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION);
    List<ResolveInfo> serviceInfos = context.getPackageManager().queryIntentServices(serviceIntent, 0);
    for (ResolveInfo info : serviceInfos) {
        // check if chrome is available on this device
        if (availableChrome == null && isPackageNameChrome(info.serviceInfo.packageName)) {
            availableChrome = info.serviceInfo.packageName;
        }
        // check if the browser being looped is the default browser
        if (info.serviceInfo.packageName.equals(resolveInfo.activityInfo.packageName)) {
            packageName = resolveInfo.activityInfo.packageName;
            break;
        }
    }

    // if the default browser does not support custom tabs protocol, use chrome if available.
    if (packageName == null && availableChrome != null) {
        packageName = availableChrome;
    }
    Logger.d("selected browser for kakaolink is %s", packageName);
    return packageName;
}
import android.support.customtabs.CustomTabsService;

Intent serviceIntent = new Intent();
serviceIntent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION);

위 코드를 통과화면 Intent.mAction 값이 “androidx.browser.customtabs.action.CustomTabsService” 인데
아래 문서에서는 constant value “android.support.customtabs.action.CustomTabsService” 로 나오네요. 값에 차이가 있는데 관련있을까요?
https://developer.android.com/reference/androidx/browser/customtabs/CustomTabsService.html#ACTION_CUSTOM_TABS_CONNECTION


프로젝트 코드에서 비슷하게 테스트해본 결과입니다. 이때의 ACTION_CUSTOM_TABS_CONNECTION 값은 “android.support.customtabs.action.CustomTabsService” 입니다.

코드

import androidx.browser.customtabs.CustomTabsService;

Intent intent = new Intent();
intent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION);
List<ResolveInfo> infos  = context.getPackageManager().queryIntentServices(intent, 0);
Log.d("ABC", "onFailure: size=" + infos.size());
for (ResolveInfo info : infos) {
    Log.d("ABC", "onFailure: " + info.toString());
}

Logcat

D/ABC: onFailure: size=2
D/ABC: onFailure: ResolveInfo{d2d66a3 com.android.chrome/org.chromium.chrome.browser.customtabs.CustomTabsConnectionService m=0x108000}
D/ABC: onFailure: ResolveInfo{e3d5615 com.sec.android.app.sbrowser/.custom_tab.CustomTabsConnectionService m=0x108000}

문제 해결 되었습니다.

  • “jetifier” 의 문제로 판단
    • “jetifier” which process libraries and replace references from old support libraries to new androidx.
  • 앱 프로젝트 gradle plugin 3.4.2, gradle 5.1.1 로 수정해 문제 해결
  • (기존 gradle plugin 3.3.2, gradle 4.10.1)
  • 비슷한 문제를 겪는 깃헙 이슈를 참고했습니다. https://github.com/openid/AppAuth-Android/issues/395#issuecomment-472710342

도움 주셔서 감사합니다!

1개의 좋아요

앗 해결되어서 다행입니다! jetifier 버그 같은 경우에는 디버깅이 쉽지 않아서… ㅠㅠ 고생하셨습니다 :slight_smile:

2개의 좋아요