iOS에서 cordova inappbrowser 을 이용하여 카카오툭로그인을 사용하려고 합니다.
이메일과 ID를 입력하고 로그인은 성공했는데.
결과를 전달을 하지 못하고. 현재 열려있는 창도 닫치지 않은 현상이 발생을 합니다.
어떻게 해결하는 방법이 없을까요?
@blackcard_eslim
웹뷰의 경우 현재 공식적으로는 지원하지 않고 있습니다. 혹시 해결 방법을 찾으신 경우 공유해 주시면 다른 분들께 도움이 될 것 같습니다. 감사합니다!
카카오에서 지원을 해줘야 할 부분인것 같은데…아쉽네요…
저같이 삽질 안했으면 하는 바램으로 제가 처리한 방법을 공유하겠습니다.
제가 처리한 방법은 좋은 방법같진 않습니다. 카톡 SDK를 손봐야 하는 문제가 있기에
카카오측에서 구조변경을 한다면 처리 안되는 문제가 발생할 수 있습니다.
카카오 관계자께서 이글을 보신다면 웹뷰를 이용하여 처리 할 수 있는 방안을 찾아주셨으면 합니다.
카톡 javascript SDK 파일중 아래 부분이 있습니다.
Auth.login 부분을 아래 코드로 대체 하면 cordova inappbrowser를 이용할 경우 처리 됨을 확인 할 수 있을 겁니다.
테스트는 IOS에서 해 봤고 안드로이드에선 아직 해보지 않았습니다.
이코드를 적용하여 안드로이드에서 해보신분을 결과를 남겨주세요.
Auth.login = function(settings) {
_k.processRules(settings, rules.login, 'Auth.login');
if (!_loginProxy) {
_loginProxy = getProxy({}, function(response) {
var savedSettings = getSavedSettingsWithResponseState(response, _loginSettings);
handleAuthResponse(response, savedSettings);
});
cleanups.push(function() {
_loginProxy.destroy();
_loginProxy = null;
});
}
var stateToken = _.getRandomString();
_loginSettings[stateToken] = settings;
var popup = window.open(getAuthUrl(), '_blank', POPUP_FEATURES);
if (typeof(popup.opener) === 'undefined') {
popup.addEventListener("loadstop", loadStop);
}
function loadStop(e) {
popup.executeScript({code:"var isCreate = false;"});
var loop = setInterval(function() {
var code =
"if (typeof(returnResponse) === 'function') { "+
" isCreate = true; " +
" window._kakaoAgent = '"+_k.KAKAO_AGENT+"'; " +
" window._exec = document.getElementsByTagName('script')[0].innerText.match(/reqwest\\(\\{(.|\\n)*?(\\}\\))/g)[0]; " +
" window._exec = window._exec.replace(/proxyHost.getKakaoAgent\\(\\)/g, \"'\"+window._kakaoAgent+\"'\"); " +
" window._exec = window._exec.replace(/proxyHost.getProxyOrigin\\(\\)/g, \"'\"+'"+location.origin+"'+\"'\"); " +
" window.returnResponse = function (e) {" +
" e.stateToken = clientParams[\"state\"]; "+
" window._result = e; " +
" }" +
"}";
popup.executeScript({code:code},
function( values ) {
popup.executeScript({code:'isCreate'}, function(values) {
var isCreate = values[0];
if (isCreate) {
clearInterval(loop);
popup.executeScript({code:'eval(window._exec);'});
var loop2 = setInterval(function() {
popup.executeScript( {code:'window._result'}, function(values) {
var result = values[0];
if (result !== null && typeof(result) !== 'undefined') {
clearInterval(loop2);
var savedSettings = getSavedSettingsWithResponseState(result, _loginSettings);
handleAuthResponse(result, savedSettings);
popup.close();
popup.removeEventListener('loadstop', loadStop);
popup = null;
delete popup;
}
});
});
}
});
}
);
});
}
function getAuthUrl() {
var authParams = _.buildQueryString({
client_id: _k.RUNTIME.appKey,
redirect_uri: 'kakaojs',
response_type: 'code',
state: stateToken,
proxy: 'easyXDM_Kakao_' + _loginProxy.channel + '_provider'
});
return _k.URL.authorize + '?' + authParams;
}
};
4개의 좋아요