1. 카카오링크 API 선택

카카오톡 메시지를 이용해서 보낼 경우, 만든 앱과 카카오톡이 연동되지 사용자는 친구 목록으로 불러올 수 없으므로

카카오 메시지 API 아닌 카카오링크 API 이용해서 작업했다.

 


⌘ 참고 ⌘

카카오링크 API vs 카카오톡 메시지 API

<카카오톡 친구 목록 가져오기 API>

  • 사용자의 모든 카카오톡 친구 정보를 제공하지 않을 수도 있다. 즉, 실제 카카오톡 친구 수와 API 응답의 친구 수는 다를 수 있다.
  • 사용 권한이 주어진 앱에서만 사용할 수 있다. 
  • 친구 정보 제공 조건 ( 모두 만족시 친구 목록 가져오기 API 응답에 포함됨 )
    • 친구인 사용자가 앱과 연결된 상태일 것
    • 사용자와 친구 모두 앱 연결 시 ‘카카오 서비스 내 친구 목록 제공’ 동의 항목에 동의한 상태일 것
    • 숨김 또는 차단 친구가 아닐 

2. 기본 세팅 및 어플리케이션 등록 

https://developers.kakao.com/

'애플리케이션 추가하기' 후 네이티브 앱 키를 받고 android 플랫폼 설정을 해주자

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

2-0. manifest 인터넷 권한

    <uses-permission android:name="android.permission.INTERNET" />

 

2-1. build.gradle(project)에 추가

maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }

2-2. build.gradle(module)에 추가

    //카카오 SDK 모듈 설정
    implementation "com.kakao.sdk:v2-user:2.9.0" // 카카오 로그인
    implementation "com.kakao.sdk:v2-talk:2.9.0" // 친구, 메시지(카카오톡)
    implementation "com.kakao.sdk:v2-story:2.9.0" // 카카오스토리
    implementation "com.kakao.sdk:v2-link:2.9.0" // 메시지(카카오링크)
    implementation "com.kakao.sdk:v2-navi:2.9.0" // 카카오내비
    implementation group: 'com.kakao.sdk', name: 'kakaolink', version: project.KAKAO_SDK_VERSION //카카오링크 sdk를 사용하기 위해 필요

2-3. java 8 사용 위한 build.gradle(module) 설정

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

 

3. 패키지 쿼리 및 상호작용 설정

<manifest
    package="com.sample.sample">
    <!-- queries에 카카오톡 패키지 추가 -->
    <queries>
        <package android:name="com.kakao.talk" />
    </queries>
<</manifest>

 

4. DeepLink( 딥링크 ) vs AppLink( 앱링크 )

  • DeepLink ( 딥링크 ) : 인텐트필터의 일종으로 사용자들이 직접적으로 안드로이드 앱내의 액티비티에 접근하는것을 허용. 다른 앱에서 또는 웹브라우저에서의 링크를 클릭했을때 해당 링크의 scheme을 보고 앱을 실행하게 되며, 해당 링크를 처리하는 2개이상의 앱이 있다면 사용자에게 다이얼로그를 띄어 앱을 실행할 수 있도록 유도함.
  • AppLink ( 앱링크 ) : 인증된 웹사이트 URL을 기반으로 하는 딥링크. 링크 클릭시 앱이 설치되어있다면 즉시 열어서 보여주고 없다면 웹으로 이동합. 다이얼로그는 나타나지 않음. 

제가 만드는 앱은 URL이 아닌 custom scheme으로 이동이 가능하기에 DeepLink로 구현했습니다

 

5. Custom scheme 설정

//AndroidManifest.xml
<activity
    android:name=".ProductActivity"> //메시지 '자세히 보기 클릭'시 보여주고 싶은 화면
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- "kakao{YOUR_NATIVE_APP_KEY}" 형식의 앱 실행 스킴을 설정하는데 사용 -->
        //2번에서 받은 '네이티브 앱 키' 앞에 'kakao' 추가하고 scheme에 설정
        // ex ) kakaod7203~~~~
        <data
            android:scheme="@string/kakao_app_key_for_login_page"
            android:host="kakaolink" />
    </intent-filter>
</activity>

6. 카카오링크 구현

6-1. 메시지 템플릿 정하기 (Feed로 결정)

6-2. 공유하기 버튼 클릭 시 해당 함수가 호출되도록 구현(보내기)

private fun sendKakaoLink(title: String, desc: String, image: String) {
    // 메시지 템플릿 만들기 (피드형)
    val defaultFeed = FeedTemplate(
        content = Content(
            title = title,
            description = desc,
            imageUrl = image,
            link = Link(
                mobileWebUrl = "https://play.google.com/store/apps/details?id=com.sample.sample"
            )
        ),
        buttons = listOf(
            Button(
                "자세히 보기",
                Link(
                //이 부분을 사용해서 어떤 상세페이지를 띄울지 결정할수 있다 ⭐️⭐️⭐️⭐️⭐️
                    androidExecutionParams = mapOf(
                        "productIdx" to productIdx.toString(),
                        "pay_mode" to "benefit"
                    )
                ),
            )
        )
    )

    // 피드 메시지 보내기
    if (context?.let { LinkClient.instance.isKakaoLinkAvailable(it) } == true) {
        // 카카오톡으로 카카오링크 공유 가능
        context?.let {
            LinkClient.instance.defaultTemplate(it, defaultFeed) { linkResult, error ->
                if (error != null) {
                    Log.e("TAG", "카카오링크 보내기 실패", error)
                } else if (linkResult != null) {
                    Log.e("TAG", "카카오링크 보내기 성공 ${linkResult.intent}")
                    startActivity(linkResult.intent) //카카오톡이 깔려있을 경우 카카오톡으로 넘기기
                    
                    // 카카오링크 보내기에 성공했지만 아래 경고 메시지가 존재할 경우 일부 컨텐츠가 정상 동작하지 않음
                    Log.e("TAG", "Warning Msg: ${linkResult.warningMsg}")
                    Log.e("TAG", "Argument Msg: ${linkResult.argumentMsg}")
                }
            }
        }
    } else {  // 카카오톡 미설치: 웹 공유 사용 권장
        // 웹 공유 예시 코드
        val sharerUrl = WebSharerClient.instance.defaultTemplateUri(defaultFeed)

        // 1. CustomTabs으로 Chrome 브라우저 열기
        try {
            context?.let { KakaoCustomTabsClient.openWithDefault(it, sharerUrl) }
        } catch (e: UnsupportedOperationException) {
            // Chrome 브라우저가 없을 때
            Toast.makeText(context, "chrome 또는 인터넷 브라우저를 설치해주세요", Toast.LENGTH_SHORT).show()
        }

        // 2. CustomTabs으로 디바이스 기본 브라우저 열기
        try {
            context?.let { KakaoCustomTabsClient.open(it, sharerUrl) }
        } catch (e: ActivityNotFoundException) {
            // 인터넷 브라우저가 없을 때
            Toast.makeText(context, "chrome 또는 인터넷 브라우저를 설치해주세요", Toast.LENGTH_SHORT).show()
        }
    }
}

6-3. 카카오톡 '자세히 보기' 클릭시 이동할 Activity에서 params값을 받아옴(가져오기)

class ProductActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val bundle = intent.extras
        
        initDeepLink()
    }
    
    private fun initDeepLink() {
        if (Intent.ACTION_VIEW == intent.action) {
            val uri = intent.data
            if (uri != null) {
            // ⭐️여기서 androidExecutionParams 값들을 받아와 어떠한 상세페이지를 띄울지 결정할 수 있음
                val productIdx = uri.getQueryParameter("productIdx")
                val payMode = uri.getQueryParameter("pay_mode")

                val bundle = Bundle()
                if (productIdx != null) {
                    bundle.putInt("product_idx", productIdx.toInt())
                    togetherFragment.arguments = bundle
                    benefitFragment.arguments = bundle

                    if (payMode == "benefit") {
                       //benefitFragment로 이동
                    } else {
                       //benefitFragment로 이동
                   }
                }
            }
        }
    }
}

7. 완료 !!!!!

'자세히 보기' 클릭 후 바로 해당 페이지로 이동

처음에 Deeplink도 모르고 자꾸 kakao Developer에 설정되어 있는 Web의 사이트 도메인으로 이동해서 애를 먹었는데,

다음과 같이 DeepLink를 이용하면 쉽게 풀린다 ! 

 

* 참고

  • 위와 같이 mobileWebUrl을 플레이스토어로 지정할 경우 'https://play.google.com'를 kakao Developer의 플랫폼 -> Web에 추가해주어야 한다.
  • FeedTemplate에서 imageUrl을 서버에서 받아오는 경우 아래와 같이 한번 더 거쳐주어야 한다.
        LinkClient.instance.scrapImage(image) { imageUploadResult, error ->
            if (error != null) {
                Log.e("TAG", "이미지 스크랩 실패", error)
            }
            else if (imageUploadResult != null) {
                Log.e("TAG", "이미지 스크랩 성공 \n${imageUploadResult.infos.original}")
            }
        }

 

+ Recent posts