From 11cd8628aab95a4d846ab632b79a427f17fa4aa5 Mon Sep 17 00:00:00 2001 From: zeng Date: Tue, 17 Jun 2025 09:40:35 +0800 Subject: [PATCH] =?UTF-8?q?W2A=E6=B5=81=E7=A8=8B=E6=A2=B3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MoviaBox/AppDelegate/AppDelegate+APNS.swift | 15 +++++-- .../AppDelegate/AppDelegate+OpenApp.swift | 44 ++++++++++++++----- MoviaBox/AppDelegate/AppDelegate.swift | 2 +- MoviaBox/AppDelegate/SceneDelegate.swift | 14 ++++-- MoviaBox/Base/View/SPApnsAlertView.swift | 3 ++ MoviaBox/Libs/APPTool/SPAPPTool.swift | 3 ++ 6 files changed, 64 insertions(+), 17 deletions(-) diff --git a/MoviaBox/AppDelegate/AppDelegate+APNS.swift b/MoviaBox/AppDelegate/AppDelegate+APNS.swift index 09651c0..5056a42 100644 --- a/MoviaBox/AppDelegate/AppDelegate+APNS.swift +++ b/MoviaBox/AppDelegate/AppDelegate+APNS.swift @@ -10,6 +10,8 @@ import FirebaseMessaging import FirebaseCore extension AppDelegate { + ///是否展示过通知提示 + static var haveBeenShownAPNS = false func registerAPNS() { FirebaseApp.configure() @@ -20,8 +22,8 @@ extension AppDelegate { center.requestAuthorization(options: [.badge, .sound, .alert]) { grant, error in if !grant { - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { - if let date = UserDefaults.standard.object(forKey: kSPApnsAlertDefaultsKey) as? Date { + if let date = UserDefaults.standard.object(forKey: kSPApnsAlertDefaultsKey) as? Date { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { #if DEBUG self.showApnsAlert() #else @@ -30,8 +32,15 @@ extension AppDelegate { } #endif } - UserDefaults.standard.set(Date(), forKey: kSPApnsAlertDefaultsKey) + } else { + Self.haveBeenShownAPNS = true + SPAPPTool.sceneDelegate?.retryHandleOpenAppMessage() } + UserDefaults.standard.set(Date(), forKey: kSPApnsAlertDefaultsKey) + + } else { + Self.haveBeenShownAPNS = true + SPAPPTool.sceneDelegate?.retryHandleOpenAppMessage() } } UIApplication.shared.registerForRemoteNotifications() diff --git a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift index e0c87ce..98dabce 100644 --- a/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift +++ b/MoviaBox/AppDelegate/AppDelegate+OpenApp.swift @@ -18,11 +18,14 @@ extension SceneDelegate { guard let url = URLContexts.first?.url else { return } + var result = false #if canImport(FacebookCore) - ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation]) + result = ApplicationDelegate.shared.application(UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation]) #endif - + if !result { + handleOpenAppMessage(webpageURL: url) + } } @@ -38,16 +41,44 @@ extension SceneDelegate { extension SceneDelegate { static var hasOpenMessage = false + ///是否需要重试 + static var isNeedRetry = false + + private static var webpageURL: URL? func handleOpenAppMessage(webpageURL: URL?) { - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + guard SPNetworkReachabilityManager.manager.isReachable == true, AppDelegate.haveBeenShownAPNS, SPAPPTool.isAppOpen else { + if let webpageURL = webpageURL { + SceneDelegate.webpageURL = webpageURL + } + Self.isNeedRetry = true + return + } + Self.isNeedRetry = false + SceneDelegate.webpageURL = nil + + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { self._handleOpenAppMessage(webpageURL: webpageURL) } } + ///重试 + func retryHandleOpenAppMessage() { + guard Self.isNeedRetry else { return } + handleOpenAppMessage(webpageURL: SceneDelegate.webpageURL) + } + private func _handleOpenAppMessage(webpageURL: URL?) { if !SPAPPTool.isAppOpen { return } + if Self.hasOpenMessage { return } + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + Self.hasOpenMessage = false + } + + Self.hasOpenMessage = true + //统计用URL var statUrlStr: String? var data: [String : Any]? @@ -63,14 +94,7 @@ extension SceneDelegate { statUrlStr = pasteStr } } - if Self.hasOpenMessage { - return - } - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { - Self.hasOpenMessage = false - } - Self.hasOpenMessage = true if data == nil { diff --git a/MoviaBox/AppDelegate/AppDelegate.swift b/MoviaBox/AppDelegate/AppDelegate.swift index 2db27bd..36619cc 100644 --- a/MoviaBox/AppDelegate/AppDelegate.swift +++ b/MoviaBox/AppDelegate/AppDelegate.swift @@ -13,7 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - + SPAPPTool.appDelegate = self self.registThirdparty(application, didFinishLaunchingWithOptions: launchOptions) diff --git a/MoviaBox/AppDelegate/SceneDelegate.swift b/MoviaBox/AppDelegate/SceneDelegate.swift index 695d48c..4596ddf 100644 --- a/MoviaBox/AppDelegate/SceneDelegate.swift +++ b/MoviaBox/AppDelegate/SceneDelegate.swift @@ -15,7 +15,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } - + SPAPPTool.sceneDelegate = self SPAPPTool.windowScene = windowScene ///监听语言切换 @@ -25,6 +25,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ///监听登录状态 // NotificationCenter.default.addObserver(self, selector: #selector(loginStateDidChangeNotification), name: SPLoginManager.loginStateDidChangeNotification, object: nil) + if let webpageURL = connectionOptions.userActivities.first?.webpageURL { + self.handleOpenAppMessage(webpageURL: webpageURL) + } window = UIWindow(windowScene: windowScene) @@ -60,7 +63,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneWillEnterForeground(_ scene: UIScene) { // Called as the scene transitions from the background to the foreground. // Use this method to undo the changes made on entering the background. - handleOpenAppMessage(webpageURL: nil) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.handleOpenAppMessage(webpageURL: nil) + } } func sceneDidEnterBackground(_ scene: UIScene) { @@ -131,7 +137,7 @@ extension SceneDelegate { @objc private func handleOpenApp() { setTabBarController() - handleOpenAppMessage(webpageURL: nil) + retryHandleOpenAppMessage() } @@ -147,6 +153,8 @@ extension SceneDelegate { ///监听网络变化 @objc private func reachabilityDidChangeNotification() { + retryHandleOpenAppMessage() + let localizedData = SPLocalizedManager.shared.localizedData ?? [:] if SPNetworkReachabilityManager.manager.isReachable == true { diff --git a/MoviaBox/Base/View/SPApnsAlertView.swift b/MoviaBox/Base/View/SPApnsAlertView.swift index 8c3dabe..4e3613f 100644 --- a/MoviaBox/Base/View/SPApnsAlertView.swift +++ b/MoviaBox/Base/View/SPApnsAlertView.swift @@ -90,9 +90,12 @@ class SPApnsAlertView: UIView { @objc private func handleLaterButton() { self.removeFromSuperview() + AppDelegate.haveBeenShownAPNS = true + SPAPPTool.sceneDelegate?.retryHandleOpenAppMessage() } @objc private func handleAllowButton() { + AppDelegate.haveBeenShownAPNS = true self.removeFromSuperview() SPAPPTool.openApnsSetting() } diff --git a/MoviaBox/Libs/APPTool/SPAPPTool.swift b/MoviaBox/Libs/APPTool/SPAPPTool.swift index 1c738ca..972ac18 100644 --- a/MoviaBox/Libs/APPTool/SPAPPTool.swift +++ b/MoviaBox/Libs/APPTool/SPAPPTool.swift @@ -12,6 +12,9 @@ class SPAPPTool: NSObject { ///app开启状态 引导页结束后变为已开启 static var isAppOpen = true + static var appDelegate: AppDelegate? + static var sceneDelegate: SceneDelegate? + static var windowScene: UIWindowScene? static var mainTabBarController: SPTabBarController?