swiftUI 2.0 버전 카카오 로그인구현

카카오 로그인 구현중 swiftUI 2.0을 이용하여 구현진행하고있는데 appdelegate도없고 scenedelegate 도없는데 공식개발문서 업데이트가 진행되어있지않아 포럼남겨봅니다.

안녕하세요.

관련 내용은 [카카오 로그인] > [iOS] > 카카오톡으로 로그인에서 확인하실 수 있습니다.

감사합니다 :slight_smile:

1개의 좋아요

SceneDelegate 가 swiftUI 2.0 , ios 14버전을 채택하면서 사라졌는데 해당이슈는 어떻게 컨트롤할수있을까요?

확인 후 답변 드리겠습니다.

import SwiftUI
import KakaoSDKCommon
import KakaoSDKAuth
import KakaoSDKStory
import KakaoSDKLink

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        print("didFinishLaunchingWithOptions called!")
        return true
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            return AuthController.handleOpenUrl(url: url, options: options)
        }
        
        if (StoryApi.isStoryPostUrl(url)) {
            //do something
            print("storyPostUrl: \(url.absoluteString))")
        }
        
        if (LinkApi.isKakaoLinkUrl(url)) {
            //do something
            print("linkUrl: \(url.absoluteString))")
        }
        return false
    }
}


@main
struct YourApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

위와 같은 방법으로 쓰시면 될것같습니다.
해당내용 가이드 추가해야겠네요.

2개의 좋아요

엡딜리게이트에 해당값을 입력을해도 카카오로그인에대한 리턴값을 받아오지 않네요 현재사용하고있는코드는

import SwiftUI
import KakaoSDKCommon
import KakaoSDKAuth
import KakaoSDKStory
import KakaoSDKLink

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        KakaoSDKCommon.initSDK(appKey: "고유키")
        return true
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if (AuthApi.isKakaoTalkLoginUrl(url)) {
            return AuthController.handleOpenUrl(url: url, options: options)
        }
        
        if (StoryApi.isStoryPostUrl(url)) {
            //do something
            print("storyPostUrl: \(url.absoluteString))")
        }
        
        if (LinkApi.isKakaoLinkUrl(url)) {
            //do something
            print("linkUrl: \(url.absoluteString))")
        }
        return false
    }
}

메인뷰

import SwiftUI
import KakaoSDKCommon

@main
struct kakaologinApp: App {

@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate



var body: some Scene {
    WindowGroup {
        ContentView()
    }
}

}

import SwiftUI
import KakaoSDKAuth
import KakaoSDKUser

struct ContentView: View {

@State var test : String = "테스트"
var body: some View {
    VStack{
        
        Text(self.test)
        Text("Hello, world!")
            
            
            .padding()
            .onAppear(){
                
                
                
                
                if (AuthApi.isKakaoTalkLoginAvailable()) {
                    
              
                    
                    AuthApi.shared.loginWithKakaoTalk {(oauthToken, error) in
                        if let error = error {
                            print(error)
                        }
                        else {
                            print("loginWithKakaoTalk() success.")

                            //do something
                            print("토큰 \(String(describing: oauthToken))")
                            
                            self.test = "토큰 \(String(describing: oauthToken))"
                        }
                    }
                    
                    
                    
                }
            }
        
        
    }
    
}

}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

appDelegate의 didFinishLaunchingWithOptions 을 제외한 delegate 메소드들은 contentView(rootView) 자체 이벤트로 받아야 하네요.

대략적인 코드레이아웃은 아래와 같이 쓰시면 될것같습니다.

import SwiftUI
import KakaoSDKCommon
import KakaoSDKAuth

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        print("didFinishLaunchingWithOptions called!")
        
        KakaoSDKCommon.initSDK(appKey: "*****63823bdbefb87c2c66c3f******", loggingEnable:true)
        
        return true
    }
}

@main
struct YourApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL(perform: { url in
                    if (AuthApi.isKakaoTalkLoginUrl(url)) {
                        _ = AuthController.handleOpenUrl(url: url)
                    }
                })
        }
    }
}

KakaoSDKCommon.initSDK(appKey:) 도 SwiftUI life cycle의 적절한 초기 진입부에 위치시킨다면
굳이 appDelegate 내에서 호출할 필요가 없을듯합니다.

디벨로퍼사이트의 가이드 업데이트는 최대한 빠르게 업데이트 하겠습니다.

3개의 좋아요

답변감사합니다! 저도 비슷한 방식으로 어제밤에 해결해서 답글 달준비하고있었는데 역시 능력이 !! 저기 상단부분에 앱 고유 코드 적혀있는데 삭제해야하지않을까요??

3개의 좋아요

아 어차피 샘플앱 앱키라서 상관은 없습니다. 노티 감사해요 ㅎ