[카카오 링크]카카오톡 로그인 문의드립니다

카카오 톡 간편로그인 구현중 질문이 있습니다.

네이티브단에서 웹뷰를 통하여 카카오톡 intent를 오픈하도록 작업을 하려고 합니다.

그러나 계속 앱이 열리지 않고, 웹뷰에 카카오톡 로그인 화면만 로드되고 있습니다.

웹뷰가 아닌, 카카오톡 앱을 통한 플로우를 구현하기위한 세팅이 따로 있을까요?

Kakao.Auth.authorize() 함수를 사용하시면 카카오톡이 있는 모바일 환경에 카카오톡앱으로 로그인 가능합니다.
현재 어떻게 세팅하셨나요?

JavaScript | Kakao Developers JavaScript

안드로이드 매니페스트에 scheme 적용 하고,
네이티브 단에서 웹뷰 통해 intent url일경우 앱이 있는지 판별하려 하고 있습니다.

웹뷰에서 띄운 웹사이트 URL알려주시겠어요?

단지 해당 페이지에서 Kakao.Auth.authorize()로 로그인만 하면 카카오톡앱으로 간편 로그인가능합니다.

https://cdn.playbigbox.com/timecast/studybooster/webview/KaKaoAuth.html입니다


이런식으로 작업중인데 url이 intent로 넘어오지 않아 세팅해야하는 것 이 있는지 궁금합니다.


말씀해주신 메소드는 사용중인걸로 확인 되었습니다

KakaoTalk_Video_2022-10-27-18-40-35.mp4.zip (555.2 KB)

안드로이드 인앱브라우저에서 기재하신 주소 로딩 해보니 첨부 영상과 같이 카카오톡 호출이 잘되어 계정 로그인 페이지 뜨는 것 재현하지 못했습니다.

테스트하시는 기기에 카카오톡 설치되어있고 로그인되어있나요?


하이브리드앱 가이드에 " 카카오톡 패키지명 설정"되어있나요?

Kakao Developers

세팅부
image
image
image

호출부
image
Kakao_AUTH_URL는 위에 말씀드린 url 입니다.
잘못된게 있을까요?

ERR_CLEARTEXT_NOT_PERMTTED 에러와 함께" 웹페이지를 사용할 수 없음"이라는 문구가 표기되고있습니다.
url scheme이 intent로 넘어오지않습니다.

Kakao_AUTH_URL 및 호출부라는 것 자체가 필요없는데요.

전체 코드블럭 첨부 부탁드려요.

이미지

woongjin.co.kr;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import com.unity3d.player.UnityPlayer;

import org.json.JSONException;
import org.json.JSONObject;

import java.net.URISyntaxException;
import java.util.jar.JarException;

public class WJWebView extends Activity
{
public static final int OPEN_TYPE_LOGIN = 100;
public static final int OPEN_TYPE_LOGIN_KAKAO = 101;

private WebView         _webView;
private WebSettings     _webSettings;

private Button          _btnClose;

private int             _openType = 0;

@Override
protected void onCreate(@Nullable Bundle bundle)
{
	requestWindowFeature(Window.FEATURE_NO_TITLE);
	super.onCreate(bundle);
	setContentView(R.layout.wjwebview);

	Intent intent = getIntent();
	String url = intent.getStringExtra("url");
	_openType = intent.getIntExtra("opentype", 0);

	_btnClose = (Button)findViewById(R.id.btnClose);
	_btnClose.setOnClickListener(new View.OnClickListener()
	{
		@Override
		public void onClick(View v)
		{
			Close();
		}
	});

	_webView = (WebView)findViewById(R.id.webView);


	_webView.setWebViewClient(new WJWebViewClient(this)); // 클릭시 새창 안뜨게
	_webSettings = _webView.getSettings(); //세부 세팅 등록
	_webSettings.setJavaScriptEnabled(true); // 웹페이지 자바스클비트 허용 여부

	if(_openType == OPEN_TYPE_LOGIN_KAKAO)
	{
		_webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
		_webSettings.setSupportMultipleWindows(true);
		//return;
	}
	_webSettings.setUserAgentString("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12");
	_webSettings.setSupportMultipleWindows(false); // 새창 띄우기 허용 여부
	_webSettings.setJavaScriptCanOpenWindowsAutomatically(false); // 자바스크립트 새창 띄우기(멀티뷰) 허용 여부
	_webSettings.setLoadWithOverviewMode(true); // 메타태그 허용 여부
	_webSettings.setUseWideViewPort(true); // 화면 사이즈 맞추기 허용 여부
	_webSettings.setSupportZoom(false); // 화면 줌 허용 여부
	_webSettings.setBuiltInZoomControls(false); // 화면 확대 축소 허용 여부
	//		_webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 컨텐츠 사이즈 맞추기
	_webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 브라우저 캐시 허용 여부
	_webSettings.setDomStorageEnabled(true); // 로컬저장소 허용 여부

// _webView.evaluateJavascript();

	_webView.addJavascriptInterface(this, "WJPlugin");
	_webView.loadUrl(url);
}

public void Test()
{

// _webView.loadUrl();
}

@JavascriptInterface
public void KakaoSyncAgreeCancelCallback()
{
	Close();
}

@JavascriptInterface
public void Callback(String data)
{
	if(_openType == OPEN_TYPE_LOGIN)
	{
		UnityPlayer.UnitySendMessage(MainPlugin.UNITY_RECEIVER, "OnComplete_SnsSignIn", data);
	}
	else if(_openType == OPEN_TYPE_LOGIN_KAKAO)
	{
		UnityPlayer.UnitySendMessage(MainPlugin.UNITY_RECEIVER, "OnComplete_SnsSignIn", data);
	}

	Close();
}

@JavascriptInterface
public void Close()
{
	Log.d("Unity", "WJWebView Close");
	UnityPlayer.UnitySendMessage("AOSManager", "WebViewClose", "");
	finish();
}

}

class WJWebViewClient extends WebViewClient
{
private WJWebView _parent;

public WJWebViewClient(WJWebView parent)
{
	_parent = parent;
}

@Override
public void onPageFinished(WebView view, String url)
{
	super.onPageFinished(view, url);

	Log.d("Unity11111111111111111111111", url);
	if(url.startsWith(MainPlugin.NAVER_OAUTH2_CALLBACK) == true || url.startsWith(MainPlugin.APPLE_OAUTH2_CALLBACK) == true|| url.startsWith(MainPlugin.KakaoSyncCallBack) == true)
	{
		Log.d("Unity!@!@!@!@!@!@!@!@!@!@!@!@!@", url);
		view.loadUrl("javascript:window.WJPlugin.Callback(document.body.textContent);");
	}
	else if(url.startsWith(MainPlugin.FB_OAUTH_CALLBACK) == true)
	{
		view.loadUrl("javascript:window.WJPlugin.Callback('"+ url + "');");
	}

	if(url.startsWith(MainPlugin.KakaoSyncAgreeCancel) == true){
		Log.d("Unity66666666666666", url);
		view.loadUrl("javascript:window.WJPlugin.KakaoSyncAgreeCancelCallback();");
	}
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request){

	Log.d("unity url", request.getUrl().toString());

	if (request.getUrl().getScheme() == "intent") {
		try {
			Log.d("unity333333333333333333", "ACTIVITY: ${intent.`package`}");
			// Intent 생성
			Intent intent = Intent.parseUri(request.getUrl().toString(), Intent.URI_INTENT_SCHEME);

			// 실행 가능한 앱이 있으면 앱 실행
			if (intent.resolveActivity(MainPlugin._context.getPackageManager()) != null) {
				MainPlugin._context.startActivity(intent);
				//view.loadUrl("javascript:self.close();");
				Log.d("unity", "ACTIVITY: ${intent.`package`}");
				Log.d("unity444444444444444444444", "ACTIVITY: ${intent.`package`}");
				return true;
			}
			else{
				Log.d("unity55555555555555555555", "ACTIVITY: ${intent.`package`}");
				view.loadUrl("https://play.google.com/store/apps/details?id=com.kakao.talk");
			}

			// Fallback URL이 있으면 현재 웹뷰에 로딩
			String fallbackUrl = intent.getStringExtra(MainPlugin.KakaoSyncCallBack);
			if (fallbackUrl != null) {
				view.loadUrl(fallbackUrl);
				Log.d("unity", "FALLBACK: $fallbackUrl");
				return true;
			}

			Log.e("unity", "Could not parse anythings");

		} catch (URISyntaxException e) {
			Log.e("unity", "Invalid intent request", e);
		}
	}
	Log.e("unity", "fail url");
	// 나머지 서비스 로직 구현
	return false;
}

}

웹뷰로 호출중입니다.

다른 구문들로인해 정상작동하지않는 것 같은데요.

빈프로젝트에 웹뷰 띄우시고 아무설정없이 해당 페이지 호출해보시겠어요?

해결하였습니다 감사합니다

1개의 좋아요