현재 운영중에 APP 에서는 KAKAO SDK V1 을 사용중인데..

 

아래와 같은 메일을 받았다..

 

결론은 SDK 버전 업그레이드를 하라는 이야기..

 

Kakao developers 에 보면 잘 설명이 나와 있다.

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android#migration

 

Kakao Developers

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

developers.kakao.com

 

앱 개발자가 아닌.. 내가 보고 했으니..Java 를 하신다면 SDK 버전 변경하는데 문제는 없을꺼 같다.

 

bulid.gradle 수정 (SDK V2 url 로 변경한다)

repositories {
    mavenCentral()
    // KAKAO SDK V1
    //maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
    // KAKAO SDK V2
    maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/'}
}

서비스하는 앱에서는 로그인만 사용하기 때문에 로그인 부분만 추가하였다

dependencies {
    // 카카오로그인
    // SDK V1
    //implementation group: 'com.kakao.sdk', name: 'usermgmt', version: project.KAKAO_SDK_VERSION     // 카카오 로그인 sdk를 사용하기 위해 필요.
    // SDK V2
    implementation "com.kakao.sdk:v2-user:2.12.0" // 카카오 로그인
    //implementation "com.kakao.sdk:v2-all:2.12.0" // 전체 모듈 설치, 2.11.0 버전부터 지원
}

 

AndroidManifest.xml 에 있는 KAKAO KEY 값을 가져와서 init 처리를 하였다

public class GlobalApplication extends Application {

	@Override
    public void onCreate() {
        super.onCreate();

        /* KAKAO SDK V1 */
        //KakaoSDK.init(new KakaoSDKAdapter());

        /* KAKAO SDK V2 */
        String kakaoAppkey = "";
        try {
            ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            if (ai.metaData != null) {
                kakaoAppkey = ai.metaData.getString("com.kakao.sdk.AppKey");
            }
        } catch (PackageManager.NameNotFoundException e) {
            // if we can't find it in the manifest, just return null
        }

        KakaoSdk.init(this, kakaoAppkey);
    }

}

 

아래와 같은 클래스를 만들어서 SDK V2로 로그인 처리를 하였다.

기존에 V1에서 사용하는 키해시 값이 아닌 다른 값을 리턴 받을 수 있다.

새로운 키해시 값을 받는다면 kakao develop 사이트에서 해당 APP에 들어가

해시값을 추가해주어야한다

public class KakaoV2Callback {

	public KakaoV2Callback(){
		String keyHash = getKeyHash();
		Log.e("KakaoV2Callback KeyHash : ", keyHash);

		if(UserApiClient.getInstance().isKakaoTalkLoginAvailable(MainActivity.this)){
			// 카카오톡으로 로그인
			login();
		}else{
			// 카카오계정으로 로그인
			accountLogin();
		}

	}

	// 카카오톡으로 로그인
	public void login(){
		String TAG = "login()";
		UserApiClient.getInstance().loginWithKakaoTalk(MainActivity.this,(oAuthToken, error) -> {
			if (error != null) {
				Log.e(TAG, "로그인 실패", error);
			} else if (oAuthToken != null) {
				Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
				getUserInfo(oAuthToken.getAccessToken());
			}
			return null;
		});
	}

	// 카카오계정으로 로그인
	public void accountLogin(){
		String TAG = "accountLogin()";
		UserApiClient.getInstance().loginWithKakaoAccount(MainActivity.this,(oAuthToken, error) -> {
			if (error != null) {
				Log.e(TAG, "로그인 실패", error);
			} else if (oAuthToken != null) {
				Log.i(TAG, "로그인 성공(토큰) : " + oAuthToken.getAccessToken());
				getUserInfo(oAuthToken.getAccessToken());
			}
			return null;
		});
	}

	public void getUserInfo(String accessToken){
		String TAG = "getUserInfo()";
		UserApiClient.getInstance().me((user, meError) -> {
			if (meError != null) {
				Log.e(TAG, "사용자 정보 요청 실패", meError);
			} else {
				{
					Log.i("SessionKakaoV2Callback getUserInfo() - 사용자 정보 요청 성공 : ",
							"\n회원번호 : "+user.getId() +
							"\n이메일 : "+user.getKakaoAccount().getEmail());
				}
				Account user1 = user.getKakaoAccount();


				try {
					String email = user.getKakaoAccount().getEmail();
					String nickname = user.getKakaoAccount().getProfile().getNickname();
					String profileImagePath = user.getKakaoAccount().getProfile().getProfileImageUrl();
					String thumnailPath = user.getKakaoAccount().getProfile().getThumbnailImageUrl();

					long id = user.getId();

					JSONObject jsonAccount = new JSONObject();
					jsonAccount.put("email", email);
					jsonAccount.put("nickname", nickname);
					jsonAccount.put("profileImagePath", profileImagePath);
					jsonAccount.put("thumnailPath", thumnailPath);
					jsonAccount.put("id", id);
					

					JSONObject jsonObject = new JSONObject();
					jsonObject.put("accessToken", accessToken);      // getAccessToken
					jsonObject.put("userInfo", jsonAccount);      // 사용자정보
					
					Log.i(TAG, "jsonObject", jsonObject);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return null;
		});
	}

	// 키해시 얻기
	public String getKeyHash(){
		try{
			PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);
			if(packageInfo == null) return null;
			for(Signature signature: packageInfo.signatures){
				try{
					MessageDigest md = MessageDigest.getInstance("SHA");
					md.update(signature.toByteArray());
					return android.util.Base64.encodeToString(md.digest(), Base64.NO_WRAP);
				}catch (NoSuchAlgorithmException e){
					Log.w("getKeyHash", "Unable to get MessageDigest. signature="+signature, e);
				}
			}
		}catch(PackageManager.NameNotFoundException e){
			Log.w("getPackageInfo", "Unable to getPackageInfo");
		}
		return null;
	}
}

 

참고한 블로그 : https://kakao-tam.tistory.com/115

 

 

안드로이드는 이제 해결 되었으니...

 

iOS 작업 시작..

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기