// // SceneDelegate.swift // Fableon // // Created by 湖北秦九 on 2025/9/15. // import UIKit import YYText import MJRefresh import Kingfisher class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? private var onLineTimer: Timer? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } NotificationCenter.default.addObserver(self, selector: #selector(networkStatusDidChangeNotification), name: FANetworkMonitor.networkStatusDidChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(languageDidChange), name: FALanguageManager.languageDidChange, object: nil) FATool.sceneDelegate = self FATool.windowScene = windowScene window = UIWindow(windowScene: windowScene) window?.makeKeyAndVisible() startApp() onLineTimer = Timer.scheduledTimer(timeInterval: 60 * 10, target: YYTextWeakProxy(target: self), selector: #selector(handleOnLine), userInfo: nil, repeats: true) if let webpageURL = connectionOptions.userActivities.first?.webpageURL { self.handleOpenAppMessage(webpageURL: webpageURL) } else if let url = connectionOptions.urlContexts.first?.url { self.handleOpenAppMessage(webpageURL: url) } requestFirebase() requestApns() //加载开屏广告 FAOpenAdManager.manager.showAdIfAvailable() //加载激励广告 FARewardedAdManager.manager.load() } func sceneDidDisconnect(_ scene: UIScene) { } func sceneDidBecomeActive(_ scene: UIScene) { FATool.requestIDFAAuthorization(nil) self.handleOnLine() FAStatAPI.requestEnterApp() self.setBadgeCount(0) } func sceneWillResignActive(_ scene: UIScene) { FAStatAPI.requestLeaveApp() } func sceneWillEnterForeground(_ scene: UIScene) { FAStatAPI.uploadApnsAuthorizationStatus() DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self.handleOpenAppMessage(webpageURL: nil) } } func sceneDidEnterBackground(_ scene: UIScene) { FAAdjustStateManager.manager.allowOpenMessage = true if #available(iOS 16.1, *) { startWidgeLiveActivity() } } } extension SceneDelegate { private func startApp() { let languageManager = FALanguageManager.manager if languageManager.languageDataLanguageKey != languageManager.currentLanguageKey { let vc = FATool.getLanuchViewController() window?.rootViewController = vc // window?.makeKeyAndVisible() languageManager.updateLanguageData { [weak self] finish in guard let self = self else { return } self.setRootVC() } } else { languageManager.updateLanguageData(completer: nil) setRootVC() } } private func setRootVC() { ///是否首次开启过 let hasOpenApp = UserDefaults.standard.object(forKey: kFAHasBeenOpenedAPPDefaultsKey) as? Bool if hasOpenApp != true { //首次安装不展示广告 FAOpenAdManager.manager.openAdVC.view.isHidden = true let vc = FAAppStartViewController() vc.openAppBlock = { [weak self] in guard let self = self else { return } UserDefaults.standard.set(true, forKey: kFAHasBeenOpenedAPPDefaultsKey) self.setTabBarController() self.retryHandleOpenAppMessage() } window?.rootViewController = vc // window?.makeKeyAndVisible() } else { self.setTabBarController() self.retryHandleOpenAppMessage() } } private func setTabBarController() { FAAdjustStateManager.manager.isOpenApp = true window?.rootViewController = FATabBarController() // window?.addSubview(FAOpenAdManager.manager.openAdVC.view) } } extension SceneDelegate { @objc private func handleOnLine() { FAStatAPI.requestStatOnLine() } @objc private func networkStatusDidChangeNotification() { let localizedData = FALanguageManager.manager.languageData ?? [:] if FANetworkMonitor.manager.isReachable == true { handleOnLine() self.retryHandleOpenAppMessage() FAIapManager.manager.preloadingProducts() ///缺少语言数据,重新获取语言数据 if localizedData.isEmpty { self.startApp() } // FATool.requestIDFAAuthorization(nil) } } @objc private func languageDidChange() { MJRefreshConfig.default.languageCode = FALanguageManager.manager.mjLanguageKey setTabBarController() } @available(iOS 16.1, *) private func startWidgeLiveActivity() { guard let model = FATool.widgetLiveActivityModel, let imageUrl = URL(string: model.image_url ?? "") else { return } KingfisherManager.shared.retrieveImage(with: imageUrl) { result in switch result { case .success(let imageResult): let image = imageResult.image guard let data = image.compressImageSize(toByte: 9 * 1024) else { return } guard let filePath = FAActivityManager.coverFileUrl else { return } do { try data.write(to: filePath, options: .atomic) FAActivityManager.liveActivity(with: model.name ?? "", videoId: model.short_play_id ?? "", videoEpisode: model.current_episode ?? "") } catch { } default: break } } } }