템플릿 이용 관련 문의드립니다

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.


현재 2.7.4 js sdk 사용중이며 앱 ID 1037687 입니다.

플러터에서 뷰를 이용하여 웹뷰를 띄워 사용중인 하이브리드앱 입니다.
하이브리드 개발 참조문서를 사용하여 코드를 작성하였는데요,
카카오톡 앱은 실행이 잘 되나, 전달하려는 메시지의 필수 정보에 오류가 있다는 alert이 발생합니다.
template 에서 필요로 하는 값은 전부 전달을 하였는데 빠트린 부분이 있는걸까요?
아래는 vue 코드입니다.

<button @click=“sendKakaoMessage”>카카오톡 공유하기

const sendKakaoMessage = () => {
const appKey = “앱키”; // JavaScript 앱 키
const templateId = “123456”; // Custom Template ID

// 필수 필드 JSON 구성
const templateArgs = encodeURIComponent(
    JSON.stringify({
        title: "공유할 제목", // 필수 필드: ${title}
        description: "공유할 설명", // 필수 필드: ${description}
        image: "kakao.png", // 필수 필드: ${image}
        button: "앱 다운로드" // 필수 필드: ${button}
    })
);

// 카카오 링크 URL 생성
const kakaoLinkUrl = `intent://send?appkey=${appKey}&template_id=${templateId}&template_args=${templateArgs}&browser_fallback_url=${encodeURIComponent(
    "https://play.google.com/store/apps/details?id=com.kakao.talk" // Fallback URL
)}#Intent;scheme=kakaolink;package=com.kakao.talk;end`;

// 카카오톡 실행
window.location.href = kakaoLinkUrl;
console.log(kakaoLinkUrl);

};

1개의 좋아요

안녕하세요.

intent 스킴을 직접 호출하시는 이유를 설명해주시겠어요?

안녕하세요, intent를 사용하는 특별한 이유는 없으며 되는 방법을 찾다보니 methodChannel 을 사용하여 하게 되었습니다

아래는 flutter inappwebview 코드 일부입니다.

if (uri.toString().startsWith(“intent://”)) {
try {
await const MethodChannel(“com.who.am.i.who_am_i/intent”).invokeMethod(
“handleIntent”,
{“url”: uri.toString()},
);
} catch (e) {
print(“Error handling intent: $e”);
}
return NavigationActionPolicy.CANCEL;
}

하이브리드 앱에서 카카오톡 앱을 실행시키는 다른 방법이 있을까요?

1개의 좋아요

인텐트 스킴을 직접 사용하시면 안되고, JS SDK를 이용해서 호출해주세요.
(디벨로퍼스에서 제공하는 방식이 아닌 스킴을 바로 호출하는 방식으로 호출하시면 예고 없이 차단될 수 있습니다.)

카카오톡 공유: JavaScript | Kakao Developers 카카오톡 공유: JavaScript

그럼 웹뷰에서 카카오톡 앱을 직접 호출할 수 있는 방식은 없는걸까요?

웹뷰에서 띄운 웹페이지에서 JS SDK 로 카카오톡 공유하는 방법과
네이티브앱에서 android, ios SDK로 카카오톡 공유하는 방법이 있습니다.
가이드 참고 부탁드려요~

안녕하세요, 번거로우시겠지만 해결이 되지 않는 부분이 있어 다시 문의드립니다.
JS SDK를 사용하여 구현하였는데 실 기기에서 테스트 해보았을 때 카카오톡이 실행되지 않고 about:blank#blocked 링크로 던져집니다, ㅠㅠ
flutter에서 inappwebview를 사용하여 vue의 웹뷰 페이지를 띄워놓은 상태이며 Android 휴대폰을 사용하여 테스트 하였습니다.

<button @click=“sendKakaoMessage”>카카오톡 공유하기

import {onMounted} from “vue”;

const templateArgs = {
title: ‘제목 영역입니다.’,
description: ‘설명 영역입니다.’,
button: ‘다운로드’,
image: ‘https://d187qcel719m8w.cloudfront.net/b2c/icon_sns_kakao.png’,
};

const initKakao = () => {
window.Kakao.init(‘JS APP KEY’);
window.Kakao.isInitialized();
}
const sendKakaoMessage = () => {
window.Kakao.Share.sendCustom({
templateId: 111855,
templateArgs: templateArgs,
});
};

onMounted(() => {
initKakao();
})

1개의 좋아요

Hello @b10007535fda45460cb1

Since I don’t know your source code exactly, this suggestion may not work 100%, but still feel free to try. I use this structure in another project of mine and it works fine.

Here’s how to fix the issue with Kakao Share in your Flutter InAppWebView implementation:

  1. Modify the Flutter InAppWebView settings:
InAppWebView(
  initialOptions: InAppWebViewGroupOptions(
    crossPlatform: InAppWebViewOptions(
      useShouldOverrideUrlLoading: true,
      javaScriptEnabled: true,
      javaScriptCanOpenWindowsAutomatically: true
    ),
    android: AndroidInAppWebOptions(
      useHybridComposition: true,
      // Add this line
      mixedContentMode: AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW
    ),
  ),
  // Add URL handling callback
  shouldOverrideUrlLoading: (controller, navigationAction) async {
    var uri = navigationAction.request.url!;
    if (uri.scheme == 'kakaolink' || uri.scheme == 'kakaoplus') {
      try {
        final canLaunch = await url_launcher.canLaunch(uri.toString());
        if (canLaunch) {
          await url_launcher.launch(uri.toString());
          return NavigationActionPolicy.CANCEL;
        }
      } catch (e) {
        print(e);
      }
    }
    return NavigationActionPolicy.ALLOW;
  },
)
  1. Update your Vue code:
import { onMounted, ref } from "vue";

export default {
  setup() {
    const isKakaoInitialized = ref(false);

    const initKakao = () => {
      if (!window.Kakao.isInitialized()) {
        try {
          window.Kakao.init('JS APP KEY');
          isKakaoInitialized.value = window.Kakao.isInitialized();
          console.log('Kakao initialized:', isKakaoInitialized.value);
        } catch (error) {
          console.error('Kakao init error:', error);
        }
      }
    };

    const sendKakaoMessage = async () => {
      if (!isKakaoInitialized.value) {
        console.error('Kakao not initialized');
        return;
      }

      const templateArgs = {
        title: 'Title Area',
        description: 'Description Area',
        button: 'Download',
        image: 'https://d187qcel719m8w.cloudfront.net/b2c/icon_sns_kakao.png'
      };

      try {
        await window.Kakao.Share.sendCustom({
          templateId: 111855,
          templateArgs: templateArgs,
        });
      } catch (error) {
        console.error('Kakao share error:', error);
      }
    };

    onMounted(() => {
      initKakao();
    });

    return {
      sendKakaoMessage
    };
  }
};
  1. Add Kakao SDK to index.html:
<script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
  1. Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<queries>
    <package android:name="com.kakao.talk" />
</queries>
  1. Additional checks:
  • Verify domain registration in Kakao Developers Console
  • Confirm JavaScript app key is correct
  • Verify template ID is valid
  • Check if web domain is in allowed domain list

If the issue persists after these changes, check the developer console logs for specific error messages. The about:blank#blocked error usually occurs due to incorrect URL handling or initialization issues, which these changes should address.

네, 위에 설명 해주신 것과 같이

하이브리드앱 설정이 되어 있어야 웹뷰에서 팝업도 띄우고 카카오톡앱도 실행할 수 있습니다.

하이브리드 앱 가이드 | Kakao Developers 하이브리드 앱 가이드