diff --git a/SodaLive.xcworkspace/xcshareddata/swiftpm/Package.resolved b/SodaLive.xcworkspace/xcshareddata/swiftpm/Package.resolved index 7baeae5..f8297a9 100644 --- a/SodaLive.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/SodaLive.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "1f28da3687662a2a9efe60ffc2ca2499be411b5b0a1e07f72559059c40728121", + "originHash" : "23fbb8fc47a95510f46840139efb1770d536256f32ac2ba9f74cf03ee90a3979", "pins" : [ { "identity" : "abseil-cpp-binary", @@ -127,6 +127,15 @@ "version" : "100.0.0" } }, + { + "identity" : "kakao-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kakao/kakao-ios-sdk", + "state" : { + "revision" : "5978979157a5a0521c9c56fd0156aec794caa21c", + "version" : "2.27.2" + } + }, { "identity" : "kingfisher", "kind" : "remoteSourceControl", diff --git a/SodaLive/Resources/Debug/SodaLive-dev-Info.plist b/SodaLive/Resources/Debug/SodaLive-dev-Info.plist index e5ffe0e..cf91aa8 100644 --- a/SodaLive/Resources/Debug/SodaLive-dev-Info.plist +++ b/SodaLive/Resources/Debug/SodaLive-dev-Info.plist @@ -1,269 +1,278 @@ - - GIDClientID - 758414412471-3cf403jb4s405eu17qrfrcbs9ofhq369.apps.googleusercontent.com - CFBundleURLTypes - - - CFBundleURLSchemes - - fb608674328645232 - com.googleusercontent.apps.758414412471-3cf403jb4s405eu17qrfrcbs9ofhq369 - - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - voiceon-test - - - - FacebookAppID - 608674328645232 - FacebookAutoLogAppEventsEnabled - - FacebookClientToken - 3775e6ea83236a685d264b6c5a1bbb4d - FacebookDisplayName - 보이스온 - Test1 - FirebaseAppDelegateProxyEnabled - - GADApplicationIdentifier - ca-app-pub-1299501215847962~3447556960 - NSAdvertisingAttributionReportEndpoint - https://appsflyer-skadnetwork.com/ - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - NSMicrophoneUsageDescription - 마이크 접근이 필요합니다. - NSCameraUsageDescription - 사진을 촬영하려면 카메라 접근이 필요합니다. - NSPhotoLibraryUsageDescription - 사진을 선택하려면 사진 라이브러리 접근이 필요합니다. - NSUserTrackingUsageDescription - 맞춤형 광고 제공을 위해 추적을 허용해 주세요. - SKAdNetworkItems - - - SKAdNetworkIdentifier - cstr6suwn9.skadnetwork - - - SKAdNetworkIdentifier - 4fzdc2evr5.skadnetwork - - - SKAdNetworkIdentifier - 4pfyvq9l8r.skadnetwork - - - SKAdNetworkIdentifier - 2fnua5tdw4.skadnetwork - - - SKAdNetworkIdentifier - ydx93a7ass.skadnetwork - - - SKAdNetworkIdentifier - 5a6flpkh64.skadnetwork - - - SKAdNetworkIdentifier - p78axxw29g.skadnetwork - - - SKAdNetworkIdentifier - v72qych5uu.skadnetwork - - - SKAdNetworkIdentifier - ludvb6z3bs.skadnetwork - - - SKAdNetworkIdentifier - cp8zw746q7.skadnetwork - - - SKAdNetworkIdentifier - 3sh42y64q3.skadnetwork - - - SKAdNetworkIdentifier - c6k4g5qg8m.skadnetwork - - - SKAdNetworkIdentifier - s39g8k73mm.skadnetwork - - - SKAdNetworkIdentifier - 3qy4746246.skadnetwork - - - SKAdNetworkIdentifier - f38h382jlk.skadnetwork - - - SKAdNetworkIdentifier - hs6bdukanm.skadnetwork - - - SKAdNetworkIdentifier - v4nxqhlyqp.skadnetwork - - - SKAdNetworkIdentifier - wzmmz9fp6w.skadnetwork - - - SKAdNetworkIdentifier - yclnxrl5pm.skadnetwork - - - SKAdNetworkIdentifier - t38b2kh725.skadnetwork - - - SKAdNetworkIdentifier - 7ug5zh24hu.skadnetwork - - - SKAdNetworkIdentifier - gta9lk7p23.skadnetwork - - - SKAdNetworkIdentifier - vutu7akeur.skadnetwork - - - SKAdNetworkIdentifier - y5ghdn5j9k.skadnetwork - - - SKAdNetworkIdentifier - n6fk4nfna4.skadnetwork - - - SKAdNetworkIdentifier - v9wttpbfk9.skadnetwork - - - SKAdNetworkIdentifier - n38lu8286q.skadnetwork - - - SKAdNetworkIdentifier - 47vhws6wlr.skadnetwork - - - SKAdNetworkIdentifier - kbd757ywx3.skadnetwork - - - SKAdNetworkIdentifier - 9t245vhmpl.skadnetwork - - - SKAdNetworkIdentifier - eh6m2bh4zr.skadnetwork - - - SKAdNetworkIdentifier - a2p9lx4jpn.skadnetwork - - - SKAdNetworkIdentifier - 22mmun2rn5.skadnetwork - - - SKAdNetworkIdentifier - 4468km3ulz.skadnetwork - - - SKAdNetworkIdentifier - 2u9pt9hc89.skadnetwork - - - SKAdNetworkIdentifier - 8s468mfl3y.skadnetwork - - - SKAdNetworkIdentifier - klf5c3l5u5.skadnetwork - - - SKAdNetworkIdentifier - ppxm28t8ap.skadnetwork - - - SKAdNetworkIdentifier - ecpz2srf59.skadnetwork - - - SKAdNetworkIdentifier - uw77j35x4d.skadnetwork - - - SKAdNetworkIdentifier - pwa73g5rt2.skadnetwork - - - SKAdNetworkIdentifier - mlmmfzh3r3.skadnetwork - - - SKAdNetworkIdentifier - 578prtvx9j.skadnetwork - - - SKAdNetworkIdentifier - 4dzt52r2t5.skadnetwork - - - SKAdNetworkIdentifier - e5fvkxwrpn.skadnetwork - - - SKAdNetworkIdentifier - 8c4e2ghe7u.skadnetwork - - - SKAdNetworkIdentifier - zq492l623r.skadnetwork - - - SKAdNetworkIdentifier - 3rd42ekr43.skadnetwork - - - SKAdNetworkIdentifier - 3qcr597p9d.skadnetwork - - - UIAppFonts - - Pretendard-Bold.otf - Pretendard-Medium.otf - Pretendard-Light.otf - Pretendard-Regular.otf - NotoSansJP-Bold.ttf - NotoSansJP-Medium.ttf - NotoSansJP-Light.ttf - NotoSansJP-Regular.ttf - - UIBackgroundModes - - audio - fetch - remote-notification - - + + CFBundleURLTypes + + + CFBundleURLSchemes + + fb608674328645232 + com.googleusercontent.apps.758414412471-3cf403jb4s405eu17qrfrcbs9ofhq369 + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + voiceon-test + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + kakao20cf19413d63bfdfd30e8e6dff933d33 + + + + FacebookAppID + 608674328645232 + FacebookAutoLogAppEventsEnabled + + FacebookClientToken + 3775e6ea83236a685d264b6c5a1bbb4d + FacebookDisplayName + 보이스온 - Test1 + FirebaseAppDelegateProxyEnabled + + GADApplicationIdentifier + ca-app-pub-1299501215847962~3447556960 + GIDClientID + 758414412471-3cf403jb4s405eu17qrfrcbs9ofhq369.apps.googleusercontent.com + NSAdvertisingAttributionReportEndpoint + https://appsflyer-skadnetwork.com/ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SKAdNetworkItems + + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + + UIAppFonts + + Pretendard-Bold.otf + Pretendard-Medium.otf + Pretendard-Light.otf + Pretendard-Regular.otf + NotoSansJP-Bold.ttf + NotoSansJP-Medium.ttf + NotoSansJP-Light.ttf + NotoSansJP-Regular.ttf + + UIBackgroundModes + + audio + fetch + remote-notification + + LSApplicationQueriesSchemes + + + kakaokompassauth + + kakaolink + + kakaoplus + + diff --git a/SodaLive/Resources/Info.plist b/SodaLive/Resources/Info.plist index f45e800..d6510f8 100644 --- a/SodaLive/Resources/Info.plist +++ b/SodaLive/Resources/Info.plist @@ -1,269 +1,278 @@ - - GIDClientID - 983594297130-m6bv7lvc1lsetsvv3rk92etqc98uopqj.apps.googleusercontent.com - CFBundleURLTypes - - - CFBundleURLSchemes - - fb612448298237287 - com.googleusercontent.apps.983594297130-m6bv7lvc1lsetsvv3rk92etqc98uopqj - - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - voiceon - - - - FacebookAppID - 612448298237287 - FacebookAutoLogAppEventsEnabled - - FacebookClientToken - 32af760f4a7b7cb7e3b1e7ffd0b0da70 - FacebookDisplayName - 보이스온 - FirebaseAppDelegateProxyEnabled - - GADApplicationIdentifier - ca-app-pub-1299501215847962~8852459715 - NSAdvertisingAttributionReportEndpoint - https://appsflyer-skadnetwork.com/ - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - NSMicrophoneUsageDescription - 마이크 접근이 필요합니다. - NSCameraUsageDescription - 사진을 촬영하려면 카메라 접근이 필요합니다. - NSPhotoLibraryUsageDescription - 사진을 선택하려면 사진 라이브러리 접근이 필요합니다. - NSUserTrackingUsageDescription - 맞춤형 광고 제공을 위해 추적을 허용해 주세요. - SKAdNetworkItems - - - SKAdNetworkIdentifier - cstr6suwn9.skadnetwork - - - SKAdNetworkIdentifier - 4fzdc2evr5.skadnetwork - - - SKAdNetworkIdentifier - 4pfyvq9l8r.skadnetwork - - - SKAdNetworkIdentifier - 2fnua5tdw4.skadnetwork - - - SKAdNetworkIdentifier - ydx93a7ass.skadnetwork - - - SKAdNetworkIdentifier - 5a6flpkh64.skadnetwork - - - SKAdNetworkIdentifier - p78axxw29g.skadnetwork - - - SKAdNetworkIdentifier - v72qych5uu.skadnetwork - - - SKAdNetworkIdentifier - ludvb6z3bs.skadnetwork - - - SKAdNetworkIdentifier - cp8zw746q7.skadnetwork - - - SKAdNetworkIdentifier - 3sh42y64q3.skadnetwork - - - SKAdNetworkIdentifier - c6k4g5qg8m.skadnetwork - - - SKAdNetworkIdentifier - s39g8k73mm.skadnetwork - - - SKAdNetworkIdentifier - 3qy4746246.skadnetwork - - - SKAdNetworkIdentifier - f38h382jlk.skadnetwork - - - SKAdNetworkIdentifier - hs6bdukanm.skadnetwork - - - SKAdNetworkIdentifier - v4nxqhlyqp.skadnetwork - - - SKAdNetworkIdentifier - wzmmz9fp6w.skadnetwork - - - SKAdNetworkIdentifier - yclnxrl5pm.skadnetwork - - - SKAdNetworkIdentifier - t38b2kh725.skadnetwork - - - SKAdNetworkIdentifier - 7ug5zh24hu.skadnetwork - - - SKAdNetworkIdentifier - gta9lk7p23.skadnetwork - - - SKAdNetworkIdentifier - vutu7akeur.skadnetwork - - - SKAdNetworkIdentifier - y5ghdn5j9k.skadnetwork - - - SKAdNetworkIdentifier - n6fk4nfna4.skadnetwork - - - SKAdNetworkIdentifier - v9wttpbfk9.skadnetwork - - - SKAdNetworkIdentifier - n38lu8286q.skadnetwork - - - SKAdNetworkIdentifier - 47vhws6wlr.skadnetwork - - - SKAdNetworkIdentifier - kbd757ywx3.skadnetwork - - - SKAdNetworkIdentifier - 9t245vhmpl.skadnetwork - - - SKAdNetworkIdentifier - eh6m2bh4zr.skadnetwork - - - SKAdNetworkIdentifier - a2p9lx4jpn.skadnetwork - - - SKAdNetworkIdentifier - 22mmun2rn5.skadnetwork - - - SKAdNetworkIdentifier - 4468km3ulz.skadnetwork - - - SKAdNetworkIdentifier - 2u9pt9hc89.skadnetwork - - - SKAdNetworkIdentifier - 8s468mfl3y.skadnetwork - - - SKAdNetworkIdentifier - klf5c3l5u5.skadnetwork - - - SKAdNetworkIdentifier - ppxm28t8ap.skadnetwork - - - SKAdNetworkIdentifier - ecpz2srf59.skadnetwork - - - SKAdNetworkIdentifier - uw77j35x4d.skadnetwork - - - SKAdNetworkIdentifier - pwa73g5rt2.skadnetwork - - - SKAdNetworkIdentifier - mlmmfzh3r3.skadnetwork - - - SKAdNetworkIdentifier - 578prtvx9j.skadnetwork - - - SKAdNetworkIdentifier - 4dzt52r2t5.skadnetwork - - - SKAdNetworkIdentifier - e5fvkxwrpn.skadnetwork - - - SKAdNetworkIdentifier - 8c4e2ghe7u.skadnetwork - - - SKAdNetworkIdentifier - zq492l623r.skadnetwork - - - SKAdNetworkIdentifier - 3rd42ekr43.skadnetwork - - - SKAdNetworkIdentifier - 3qcr597p9d.skadnetwork - - - UIAppFonts - - Pretendard-Bold.otf - Pretendard-Medium.otf - Pretendard-Light.otf - Pretendard-Regular.otf - NotoSansJP-Bold.ttf - NotoSansJP-Medium.ttf - NotoSansJP-Light.ttf - NotoSansJP-Regular.ttf - - UIBackgroundModes - - audio - fetch - remote-notification - - + + CFBundleURLTypes + + + CFBundleURLSchemes + + fb612448298237287 + com.googleusercontent.apps.983594297130-m6bv7lvc1lsetsvv3rk92etqc98uopqj + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + voiceon + + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + kakao231cf78acfa8252fca38b9eedf87c5cb + + + + FacebookAppID + 612448298237287 + FacebookAutoLogAppEventsEnabled + + FacebookClientToken + 32af760f4a7b7cb7e3b1e7ffd0b0da70 + FacebookDisplayName + 보이스온 + FirebaseAppDelegateProxyEnabled + + GADApplicationIdentifier + ca-app-pub-1299501215847962~8852459715 + GIDClientID + 983594297130-m6bv7lvc1lsetsvv3rk92etqc98uopqj.apps.googleusercontent.com + NSAdvertisingAttributionReportEndpoint + https://appsflyer-skadnetwork.com/ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SKAdNetworkItems + + + SKAdNetworkIdentifier + cstr6suwn9.skadnetwork + + + SKAdNetworkIdentifier + 4fzdc2evr5.skadnetwork + + + SKAdNetworkIdentifier + 4pfyvq9l8r.skadnetwork + + + SKAdNetworkIdentifier + 2fnua5tdw4.skadnetwork + + + SKAdNetworkIdentifier + ydx93a7ass.skadnetwork + + + SKAdNetworkIdentifier + 5a6flpkh64.skadnetwork + + + SKAdNetworkIdentifier + p78axxw29g.skadnetwork + + + SKAdNetworkIdentifier + v72qych5uu.skadnetwork + + + SKAdNetworkIdentifier + ludvb6z3bs.skadnetwork + + + SKAdNetworkIdentifier + cp8zw746q7.skadnetwork + + + SKAdNetworkIdentifier + 3sh42y64q3.skadnetwork + + + SKAdNetworkIdentifier + c6k4g5qg8m.skadnetwork + + + SKAdNetworkIdentifier + s39g8k73mm.skadnetwork + + + SKAdNetworkIdentifier + 3qy4746246.skadnetwork + + + SKAdNetworkIdentifier + f38h382jlk.skadnetwork + + + SKAdNetworkIdentifier + hs6bdukanm.skadnetwork + + + SKAdNetworkIdentifier + v4nxqhlyqp.skadnetwork + + + SKAdNetworkIdentifier + wzmmz9fp6w.skadnetwork + + + SKAdNetworkIdentifier + yclnxrl5pm.skadnetwork + + + SKAdNetworkIdentifier + t38b2kh725.skadnetwork + + + SKAdNetworkIdentifier + 7ug5zh24hu.skadnetwork + + + SKAdNetworkIdentifier + gta9lk7p23.skadnetwork + + + SKAdNetworkIdentifier + vutu7akeur.skadnetwork + + + SKAdNetworkIdentifier + y5ghdn5j9k.skadnetwork + + + SKAdNetworkIdentifier + n6fk4nfna4.skadnetwork + + + SKAdNetworkIdentifier + v9wttpbfk9.skadnetwork + + + SKAdNetworkIdentifier + n38lu8286q.skadnetwork + + + SKAdNetworkIdentifier + 47vhws6wlr.skadnetwork + + + SKAdNetworkIdentifier + kbd757ywx3.skadnetwork + + + SKAdNetworkIdentifier + 9t245vhmpl.skadnetwork + + + SKAdNetworkIdentifier + eh6m2bh4zr.skadnetwork + + + SKAdNetworkIdentifier + a2p9lx4jpn.skadnetwork + + + SKAdNetworkIdentifier + 22mmun2rn5.skadnetwork + + + SKAdNetworkIdentifier + 4468km3ulz.skadnetwork + + + SKAdNetworkIdentifier + 2u9pt9hc89.skadnetwork + + + SKAdNetworkIdentifier + 8s468mfl3y.skadnetwork + + + SKAdNetworkIdentifier + klf5c3l5u5.skadnetwork + + + SKAdNetworkIdentifier + ppxm28t8ap.skadnetwork + + + SKAdNetworkIdentifier + ecpz2srf59.skadnetwork + + + SKAdNetworkIdentifier + uw77j35x4d.skadnetwork + + + SKAdNetworkIdentifier + pwa73g5rt2.skadnetwork + + + SKAdNetworkIdentifier + mlmmfzh3r3.skadnetwork + + + SKAdNetworkIdentifier + 578prtvx9j.skadnetwork + + + SKAdNetworkIdentifier + 4dzt52r2t5.skadnetwork + + + SKAdNetworkIdentifier + e5fvkxwrpn.skadnetwork + + + SKAdNetworkIdentifier + 8c4e2ghe7u.skadnetwork + + + SKAdNetworkIdentifier + zq492l623r.skadnetwork + + + SKAdNetworkIdentifier + 3rd42ekr43.skadnetwork + + + SKAdNetworkIdentifier + 3qcr597p9d.skadnetwork + + + UIAppFonts + + Pretendard-Bold.otf + Pretendard-Medium.otf + Pretendard-Light.otf + Pretendard-Regular.otf + NotoSansJP-Bold.ttf + NotoSansJP-Medium.ttf + NotoSansJP-Light.ttf + NotoSansJP-Regular.ttf + + UIBackgroundModes + + audio + fetch + remote-notification + + LSApplicationQueriesSchemes + + + kakaokompassauth + + kakaolink + + kakaoplus + + diff --git a/SodaLive/Sources/App/SodaLiveApp.swift b/SodaLive/Sources/App/SodaLiveApp.swift index f8a986c..ac80a6f 100644 --- a/SodaLive/Sources/App/SodaLiveApp.swift +++ b/SodaLive/Sources/App/SodaLiveApp.swift @@ -11,6 +11,8 @@ import Kingfisher import FBSDKCoreKit import AppsFlyerLib import GoogleSignIn +import KakaoSDKCommon +import KakaoSDKAuth @main struct SodaLiveApp: App { @@ -26,6 +28,7 @@ struct SodaLiveApp: App { configureImageCache() // 앱 시작 직후, 초기 네트워크 요청도 올바른 언어 헤더를 갖도록 동기 초기화 LanguageHeaderProvider.initialize() + KakaoSDK.initSDK(appKey: KAKAO_APP_KEY) } private func configureImageCache() { @@ -68,6 +71,11 @@ struct SodaLiveApp: App { } .onOpenURL { url in DEBUG_LOG("I have received a URL through a custom scheme! \(url.absoluteString)") + + if KakaoSDKAuth.AuthApi.isKakaoTalkLoginUrl(url) { + _ = AuthController.handleOpenUrl(url: url) + return + } if let comps = URLComponents(url: url, resolvingAgainstBaseURL: false), url.scheme?.lowercased() == APPSCHEME.lowercased(), diff --git a/SodaLive/Sources/Debug/Utils/Constants.swift b/SodaLive/Sources/Debug/Utils/Constants.swift index f4d47dd..6b2db86 100644 --- a/SodaLive/Sources/Debug/Utils/Constants.swift +++ b/SodaLive/Sources/Debug/Utils/Constants.swift @@ -25,3 +25,5 @@ let PAYVERSE_HTML_RESOURCE = "payverse_starter_debug" let GID_CLIENT_ID = "758414412471-3cf403jb4s405eu17qrfrcbs9ofhq369.apps.googleusercontent.com" let GID_SERVER_CLIENT_ID = "758414412471-mosodbj2chno7l1j0iihldh6edmk0gk9.apps.googleusercontent.com" + +let KAKAO_APP_KEY = "20cf19413d63bfdfd30e8e6dff933d33" diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index e3aa15e..3e586a2 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -1135,6 +1135,24 @@ enum I18n { ) } } + + enum Kakao { + static var signInFailed: String { + pick( + ko: "카카오 로그인에 실패했습니다.\n다시 시도해 주세요.", + en: "Kakao sign-in failed.\nPlease try again.", + ja: "Kakaoログインに失敗しました。\nもう一度お試しください。" + ) + } + + static var tokenMissing: String { + pick( + ko: "카카오 인증 토큰을 가져오지 못했습니다.", + en: "Failed to retrieve Kakao token.", + ja: "Kakao認証トークンを取得できませんでした。" + ) + } + } } // 문자 메시지(Text Message) 관련 문자열 diff --git a/SodaLive/Sources/User/Login/LoginView.swift b/SodaLive/Sources/User/Login/LoginView.swift index 6461dfc..d118d42 100644 --- a/SodaLive/Sources/User/Login/LoginView.swift +++ b/SodaLive/Sources/User/Login/LoginView.swift @@ -132,6 +132,7 @@ struct LoginView: View { Image("ic_login_kakao") .onTapGesture { hideKeyboard() + viewModel.loginWithKakao() } Image("ic_login_google") diff --git a/SodaLive/Sources/User/Login/LoginViewModel.swift b/SodaLive/Sources/User/Login/LoginViewModel.swift index 903d542..aba09b5 100644 --- a/SodaLive/Sources/User/Login/LoginViewModel.swift +++ b/SodaLive/Sources/User/Login/LoginViewModel.swift @@ -13,6 +13,8 @@ import CryptoKit import Security import UIKit import GoogleSignIn +import KakaoSDKUser +import KakaoSDKAuth final class LoginViewModel: NSObject, ObservableObject { private let appViewModel = AppViewModel() @@ -98,6 +100,33 @@ final class LoginViewModel: NSObject, ObservableObject { } } } + + func loginWithKakao() { + let loginHandler: (OAuthToken?, Error?) -> Void = { token, error in + DispatchQueue.main.async { + if let error = error { + ERROR_LOG(error.localizedDescription) + self.errorMessage = I18n.Login.Kakao.signInFailed + self.isShowPopup = true + return + } + + guard let accessToken = token?.accessToken, !accessToken.isEmpty else { + self.errorMessage = I18n.Login.Kakao.tokenMissing + self.isShowPopup = true + return + } + + self.loginWithKakao(accessToken: accessToken) + } + } + + if KakaoSDKUser.UserApi.isKakaoTalkLoginAvailable() { + KakaoSDKUser.UserApi.shared.loginWithKakaoTalk(completion: loginHandler) + } else { + KakaoSDKUser.UserApi.shared.loginWithKakaoAccount(completion: loginHandler) + } + } private func loginWithApple(identityToken: String, nonce: String) { let pushToken = UserDefaults.string(forKey: .pushToken) @@ -153,6 +182,33 @@ final class LoginViewModel: NSObject, ObservableObject { .store(in: &subscription) } + private func loginWithKakao(accessToken: String) { + let pushToken = UserDefaults.string(forKey: .pushToken) + let marketingPid = UserDefaults.string(forKey: .marketingPid) + let request = SocialLoginRequest( + container: "ios", + pushToken: pushToken.isEmpty ? nil : pushToken, + marketingPid: marketingPid.isEmpty ? nil : marketingPid, + identityToken: nil, + nonce: nil + ) + + isLoading = true + repository.loginKakao(request: request, accessToken: accessToken) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + self.isLoading = false + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { response in + self.handleLoginResponse(response) + } + .store(in: &subscription) + } + private func presentingViewController() -> UIViewController? { return UIApplication.shared.connectedScenes .compactMap { $0 as? UIWindowScene } diff --git a/SodaLive/Sources/User/UserApi.swift b/SodaLive/Sources/User/UserApi.swift index dbd8487..96577c9 100644 --- a/SodaLive/Sources/User/UserApi.swift +++ b/SodaLive/Sources/User/UserApi.swift @@ -12,6 +12,7 @@ enum UserApi { case login(request: LoginRequest) case loginApple(request: SocialLoginRequest) case loginGoogle(request: SocialLoginRequest, idToken: String) + case loginKakao(request: SocialLoginRequest, accessToken: String) case signUp(request: SignUpRequest) case findPassword(request: ForgotPasswordRequest) case searchUser(nickname: String) @@ -54,6 +55,9 @@ extension UserApi: TargetType { case .loginGoogle: return "/member/login/google" + + case .loginKakao: + return "/member/login/kakao" case .signUp: return "/member/signup/v2" @@ -128,7 +132,7 @@ extension UserApi: TargetType { var method: Moya.Method { switch self { - case .login, .loginApple, .loginGoogle, .signUp, .findPassword, .notification, .logout, .logoutAllDevice, .signOut, .creatorFollow, .creatorUnFollow, .memberBlock, .memberUnBlock, + case .login, .loginApple, .loginGoogle, .loginKakao, .signUp, .findPassword, .notification, .logout, .logoutAllDevice, .signOut, .creatorFollow, .creatorUnFollow, .memberBlock, .memberUnBlock, .profileImageUpdate: return .post @@ -150,6 +154,9 @@ extension UserApi: TargetType { case .loginGoogle(let request, _): return .requestJSONEncodable(request) + + case .loginKakao(let request, _): + return .requestJSONEncodable(request) case .signUp(let request): return .requestJSONEncodable(request) @@ -218,6 +225,9 @@ extension UserApi: TargetType { case .loginGoogle(_, let idToken): return ["Authorization": "Bearer \(idToken)"] + + case .loginKakao(_, let accessToken): + return ["Authorization": "Bearer \(accessToken)"] default: return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"] diff --git a/SodaLive/Sources/User/UserRepository.swift b/SodaLive/Sources/User/UserRepository.swift index 93cd542..15c14aa 100644 --- a/SodaLive/Sources/User/UserRepository.swift +++ b/SodaLive/Sources/User/UserRepository.swift @@ -24,6 +24,10 @@ final class UserRepository { func loginGoogle(request: SocialLoginRequest, idToken: String) -> AnyPublisher { return api.requestPublisher(.loginGoogle(request: request, idToken: idToken)) } + + func loginKakao(request: SocialLoginRequest, accessToken: String) -> AnyPublisher { + return api.requestPublisher(.loginKakao(request: request, accessToken: accessToken)) + } func signUp(request: SignUpRequest) -> AnyPublisher { return api.requestPublisher(.signUp(request: request)) diff --git a/SodaLive/Sources/Utils/Constants.swift b/SodaLive/Sources/Utils/Constants.swift index 2c63aaf..b5d76cd 100644 --- a/SodaLive/Sources/Utils/Constants.swift +++ b/SodaLive/Sources/Utils/Constants.swift @@ -25,3 +25,5 @@ let PAYVERSE_HTML_RESOURCE = "payverse_starter" let GID_CLIENT_ID = "983594297130-m6bv7lvc1lsetsvv3rk92etqc98uopqj.apps.googleusercontent.com" let GID_SERVER_CLIENT_ID = "983594297130-5hrmkh6vpskeq6v34350kmilf74574h2.apps.googleusercontent.com" + +let KAKAO_APP_KEY = "231cf78acfa8252fca38b9eedf87c5cb"