Files
sodalive-ios/SodaLive/Sources/App/SodaLiveApp.swift
T

110 lines
4.3 KiB
Swift

//
// SodaLiveApp.swift
// SodaLive
//
// Created by klaus on 2023/08/09.
//
import SwiftUI
import Kingfisher
import FBSDKCoreKit
import AppsFlyerLib
import GoogleSignIn
import KakaoSDKCommon
import KakaoSDKAuth
import LineSDK
@main
struct SodaLiveApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@ObservedObject var viewModel = AppViewModel()
@StateObject var canPgPaymentViewModel = CanPgPaymentViewModel()
@StateObject private var languageEnvironment = LanguageContainer.environment
init() {
configureImageCache()
// 앱 시작 직후, 초기 네트워크 요청도 올바른 언어 헤더를 갖도록 동기 초기화
LanguageHeaderProvider.initialize()
guard !Self.isRunningForPreviews else { return }
KakaoSDK.initSDK(appKey: KAKAO_APP_KEY)
}
private static var isRunningForPreviews: Bool {
ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
}
private func configureImageCache() {
// Kingfisher 전역 캐시 상한 설정
let cache = ImageCache.default
// 총 메모리 비용(바이트). 이미지 1장이 수 MB 수준이므로 80~150MB 범위 권장
cache.memoryStorage.config.totalCostLimit = 120 * 1024 * 1024
// 객체 개수 제한(옵션)
cache.memoryStorage.config.countLimit = 200
// 메모리 만료 정책(옵션)
cache.memoryStorage.config.expiration = .seconds(300)
// 디스크 캐시 용량 제한(옵션)
cache.diskStorage.config.sizeLimit = 500 * 1024 * 1024
}
var body: some Scene {
WindowGroup {
ContentView(canPgPaymentViewModel: canPgPaymentViewModel)
.environment(\.locale, languageEnvironment.locale)
.task {
guard !Self.isRunningForPreviews else { return }
await LanguageContainer.service.bootstrap()
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
CreatorCommunityMediaPlayerManager.shared.pauseContent()
// 백그라운드 전환 시 메모리 캐시 정리
ImageCache.default.cleanExpiredMemoryCache()
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didReceiveMemoryWarningNotification)) { _ in
// 메모리 경고 수신 시 캐시 즉시 해제
ImageCache.default.clearMemoryCache()
}
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
guard !Self.isRunningForPreviews else { return }
UIApplication.shared.applicationIconBadgeNumber = 0
AppsFlyerLib.shared().start()
if !AppState.shared.alreadyUpdatedMarketingInfo {
viewModel.fetchAndUpdateIdfa()
viewModel.getMemberInfo()
}
}
.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(),
comps.host?.lowercased() == "payverse",
comps.path.lowercased() == "/result" {
canPgPaymentViewModel.handleVerifyOpenURL(url)
} else {
if AppDeepLinkHandler.handle(url: url) {
return
}
_ = LoginManager.shared.application(UIApplication.shared, open: url, options: [:])
ApplicationDelegate.shared.application(UIApplication.shared, open: url, options: [:])
AppsFlyerLib.shared().handleOpen(url)
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
}