From 8317b223a5c445c8fcd010cba0a1df695e415605 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Tue, 30 Sep 2025 15:43:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=99=A8=E9=87=8A=E6=94=BE=E7=BC=BA=E5=A4=B1=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9B=91=E5=90=AC=EF=BC=8C=E4=BB=A5=E8=87=B3?= =?UTF-8?q?=E4=BA=8E=20Unity=20=E5=90=8E=E5=8F=B0=E8=BF=9B=E5=89=8D?= =?UTF-8?q?=E5=8F=B0=E4=BC=9A=E5=8D=A1=E6=AD=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/Classes/UnityPlayerUtils.swift | 88 +++++++++++++++++++----------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/ios/Classes/UnityPlayerUtils.swift b/ios/Classes/UnityPlayerUtils.swift index 315e525a4..e8651698a 100755 --- a/ios/Classes/UnityPlayerUtils.swift +++ b/ios/Classes/UnityPlayerUtils.swift @@ -78,20 +78,23 @@ var sharedApplication: UIApplication? private var _isUnityPaused = false private var _isUnityReady = false private var _isUnityLoaded = false - + + // 添加观察者属性 + private var unityReadyObserver: NSObjectProtocol? + func initUnity() { if (self.unityIsInitiallized()) { self.ufw?.showUnityWindow() return } - + self.ufw = UnityFrameworkLoad() - + self.ufw?.setDataBundleId("com.unity3d.framework") - + registerUnityListener() self.ufw?.runEmbedded(withArgc: gArgc, argv: gArgv, appLaunchOpts: appLaunchOpts) - + if self.ufw?.appController() != nil { controller = self.ufw?.appController() controller?.unityMessageHandler = self.unityMessageHandlers @@ -100,63 +103,63 @@ var sharedApplication: UIApplication? } _isUnityLoaded = true } - + // check if unity is initiallized func unityIsInitiallized() -> Bool { if self.ufw != nil { return true } - + return false } - + // Create new unity player func createPlayer(completed: @escaping (_ view: UIView?) -> Void) { if self.unityIsInitiallized() && self._isUnityReady { completed(controller?.rootView) return } - - NotificationCenter.default.addObserver(forName: NSNotification.Name("UnityReady"), object: nil, queue: OperationQueue.main, using: { note in + + unityReadyObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name("UnityReady"), object: nil, queue: OperationQueue.main, using: { note in self._isUnityReady = true completed(controller?.rootView) }) - + DispatchQueue.main.async { -// if (sharedApplication == nil) { -// sharedApplication = UIApplication.shared -// } - + // if (sharedApplication == nil) { + // sharedApplication = UIApplication.shared + // } + // Always keep Flutter window on top -// let flutterUIWindow = sharedApplication?.keyWindow -// flutterUIWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) // Always keep Flutter window in top -// sharedApplication?.keyWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) - + // let flutterUIWindow = sharedApplication?.keyWindow + // flutterUIWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) // Always keep Flutter window in top + // sharedApplication?.keyWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) + self.initUnity() - + unity_warmed_up = true self._isUnityReady = true self._isUnityLoaded = true - + self.listenAppState() - + completed(controller?.rootView) } - + } - + func registerUnityListener() { if self.unityIsInitiallized() { self.ufw?.register(self) } } - + func unregisterUnityListener() { if self.unityIsInitiallized() { self.ufw?.unregisterFrameworkListener(self) } } - + @objc public func unityDidUnload(_ notification: Notification!) { unregisterUnityListener() @@ -164,15 +167,15 @@ var sharedApplication: UIApplication? self._isUnityReady = false self._isUnityLoaded = false } - + @objc func handleAppStateDidChange(notification: Notification?) { if !self._isUnityReady { return } - + let unityAppController = self.ufw?.appController() as? UnityAppController let application = UIApplication.shared - + if notification?.name == UIApplication.willResignActiveNotification { unityAppController?.applicationWillResignActive(application) } else if notification?.name == UIApplication.didEnterBackgroundNotification { @@ -187,8 +190,8 @@ var sharedApplication: UIApplication? unityAppController?.applicationDidReceiveMemoryWarning(application) } } - - + + // Listener for app lifecycle eventa func listenAppState() { for name in [ @@ -206,6 +209,28 @@ var sharedApplication: UIApplication? object: nil) } } + + func removeNotifications() { + for name in [ + UIApplication.didBecomeActiveNotification, + UIApplication.didEnterBackgroundNotification, + UIApplication.willTerminateNotification, + UIApplication.willResignActiveNotification, + UIApplication.willEnterForegroundNotification, + UIApplication.didReceiveMemoryWarningNotification + ] { + NotificationCenter.default.removeObserver( + self, + name: name, + object: nil) + } + + if let observer = unityReadyObserver { + NotificationCenter.default.removeObserver(observer) + unityReadyObserver = nil + } + } + // Pause unity player func pause() { self.ufw?.pause(true) @@ -220,6 +245,7 @@ var sharedApplication: UIApplication? // Unoad unity player func unload() { + self.removeNotifications() self.ufw?.unloadApplication() }