// // SplashView.swift // SodaLive // // Created by klaus on 2023/08/09. // import SwiftUI import FirebaseRemoteConfig struct SplashView: View { @State private var isShowForcedUpdatePopup = false @State private var isShowUpdatePopup = false @StateObject var liveViewModel = LiveViewModel() var body: some View { ZStack(alignment: .top) { Image("splash_bg") .resizable() .scaledToFill() .edgesIgnoringSafeArea(.all) HStack(spacing: 0) { Spacer() Image("splash_text") .padding(.top, 94) .padding(.trailing, 38) } if isShowUpdatePopup { SodaDialog( title: "업데이트", desc: "최신 업데이트가 있습니다.\n업데이트 하시겠습니까?", confirmButtonTitle: "업데이트", confirmButtonAction: { UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:]) }, cancelButtonTitle: "다음에", cancelButtonAction: { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { AppState.shared.setAppStep(step: .main) } } ) } if isShowForcedUpdatePopup { SodaDialog( title: "업데이트", desc: "필수 업데이트가 있습니다.\n업데이트 후 사용가능합니다.", confirmButtonTitle: "업데이트", confirmButtonAction: { UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:]) } ) } } .onAppear { fetchLastestVersion() } } private func fetchLastestVersion() { let remoteConfig = RemoteConfig.remoteConfig() let configSettings = RemoteConfigSettings() configSettings.minimumFetchInterval = 300 remoteConfig.configSettings = configSettings remoteConfig.fetch { status, error in if status == .success { remoteConfig.activate { changed, error in checkAppVersion(latestVersion: remoteConfig["ios_latest_version"].stringValue) } } else { DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { withAnimation { if AppState.shared.pushRoomId > 0 { liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId) } else if AppState.shared.pushChannelId > 0 { AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId)) } else if AppState.shared.pushAudioContentId > 0 { AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId)) } else { AppState.shared.setAppStep(step: .main) } } } } } } private func checkAppVersion(latestVersion: String?) { let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String if let latestVersion = latestVersion, let version = version { let latestVersions = latestVersion.split(separator: ".") let versions = version.split(separator: ".") let latestMajor = Int(latestVersions[0])! let latestMinor = Int(latestVersions[1])! let latestPatch = Int(latestVersions[2])! let major = Int(versions[0])! let minor = Int(versions[1])! let patch = Int(versions[2])! if latestMajor > major || (latestMajor == major && latestMinor > minor) { self.isShowForcedUpdatePopup = true } else if latestMajor == major && latestMinor == minor && latestPatch > patch { self.isShowUpdatePopup = true } else { DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { withAnimation { if AppState.shared.pushRoomId > 0 { liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId) } else if AppState.shared.pushChannelId > 0 { AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId)) } else if AppState.shared.pushAudioContentId > 0 { AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId)) } else { AppState.shared.setAppStep(step: .main) } } } } } else { DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { withAnimation { if AppState.shared.pushRoomId > 0 { liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId) } else if AppState.shared.pushChannelId > 0 { AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId)) } else if AppState.shared.pushAudioContentId > 0 { AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId)) } else { AppState.shared.setAppStep(step: .main) } } } } } } struct SplashView_Previews: PreviewProvider { static var previews: some View { SplashView() } }