Skip to content

Commit 8317b22

Browse files
committed
fix: 修复监听器释放缺失导致重复监听,以至于 Unity 后台进前台会卡死的问题
1 parent 4228ad0 commit 8317b22

File tree

1 file changed

+57
-31
lines changed

1 file changed

+57
-31
lines changed

ios/Classes/UnityPlayerUtils.swift

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,23 @@ var sharedApplication: UIApplication?
7878
private var _isUnityPaused = false
7979
private var _isUnityReady = false
8080
private var _isUnityLoaded = false
81-
81+
82+
// 添加观察者属性
83+
private var unityReadyObserver: NSObjectProtocol?
84+
8285
func initUnity() {
8386
if (self.unityIsInitiallized()) {
8487
self.ufw?.showUnityWindow()
8588
return
8689
}
87-
90+
8891
self.ufw = UnityFrameworkLoad()
89-
92+
9093
self.ufw?.setDataBundleId("com.unity3d.framework")
91-
94+
9295
registerUnityListener()
9396
self.ufw?.runEmbedded(withArgc: gArgc, argv: gArgv, appLaunchOpts: appLaunchOpts)
94-
97+
9598
if self.ufw?.appController() != nil {
9699
controller = self.ufw?.appController()
97100
controller?.unityMessageHandler = self.unityMessageHandlers
@@ -100,79 +103,79 @@ var sharedApplication: UIApplication?
100103
}
101104
_isUnityLoaded = true
102105
}
103-
106+
104107
// check if unity is initiallized
105108
func unityIsInitiallized() -> Bool {
106109
if self.ufw != nil {
107110
return true
108111
}
109-
112+
110113
return false
111114
}
112-
115+
113116
// Create new unity player
114117
func createPlayer(completed: @escaping (_ view: UIView?) -> Void) {
115118
if self.unityIsInitiallized() && self._isUnityReady {
116119
completed(controller?.rootView)
117120
return
118121
}
119-
120-
NotificationCenter.default.addObserver(forName: NSNotification.Name("UnityReady"), object: nil, queue: OperationQueue.main, using: { note in
122+
123+
unityReadyObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name("UnityReady"), object: nil, queue: OperationQueue.main, using: { note in
121124
self._isUnityReady = true
122125
completed(controller?.rootView)
123126
})
124-
127+
125128
DispatchQueue.main.async {
126-
// if (sharedApplication == nil) {
127-
// sharedApplication = UIApplication.shared
128-
// }
129-
129+
// if (sharedApplication == nil) {
130+
// sharedApplication = UIApplication.shared
131+
// }
132+
130133
// Always keep Flutter window on top
131-
// let flutterUIWindow = sharedApplication?.keyWindow
132-
// flutterUIWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) // Always keep Flutter window in top
133-
// sharedApplication?.keyWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1)
134-
134+
// let flutterUIWindow = sharedApplication?.keyWindow
135+
// flutterUIWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1) // Always keep Flutter window in top
136+
// sharedApplication?.keyWindow?.windowLevel = UIWindow.Level(UIWindow.Level.normal.rawValue + 1)
137+
135138
self.initUnity()
136-
139+
137140
unity_warmed_up = true
138141
self._isUnityReady = true
139142
self._isUnityLoaded = true
140-
143+
141144
self.listenAppState()
142-
145+
143146
completed(controller?.rootView)
144147
}
145-
148+
146149
}
147-
150+
148151
func registerUnityListener() {
149152
if self.unityIsInitiallized() {
150153
self.ufw?.register(self)
151154
}
152155
}
153-
156+
154157
func unregisterUnityListener() {
155158
if self.unityIsInitiallized() {
156159
self.ufw?.unregisterFrameworkListener(self)
157160
}
158161
}
159-
162+
160163
@objc
161164
public func unityDidUnload(_ notification: Notification!) {
162165
unregisterUnityListener()
163166
self.ufw = nil
164167
self._isUnityReady = false
165168
self._isUnityLoaded = false
166169
}
167-
170+
168171
@objc func handleAppStateDidChange(notification: Notification?) {
169172
if !self._isUnityReady {
170173
return
171174
}
172-
175+
173176
let unityAppController = self.ufw?.appController() as? UnityAppController
174177
let application = UIApplication.shared
175-
178+
176179
if notification?.name == UIApplication.willResignActiveNotification {
177180
unityAppController?.applicationWillResignActive(application)
178181
} else if notification?.name == UIApplication.didEnterBackgroundNotification {
@@ -187,8 +190,8 @@ var sharedApplication: UIApplication?
187190
unityAppController?.applicationDidReceiveMemoryWarning(application)
188191
}
189192
}
190-
191-
193+
194+
192195
// Listener for app lifecycle eventa
193196
func listenAppState() {
194197
for name in [
@@ -206,6 +209,28 @@ var sharedApplication: UIApplication?
206209
object: nil)
207210
}
208211
}
212+
213+
func removeNotifications() {
214+
for name in [
215+
UIApplication.didBecomeActiveNotification,
216+
UIApplication.didEnterBackgroundNotification,
217+
UIApplication.willTerminateNotification,
218+
UIApplication.willResignActiveNotification,
219+
UIApplication.willEnterForegroundNotification,
220+
UIApplication.didReceiveMemoryWarningNotification
221+
] {
222+
NotificationCenter.default.removeObserver(
223+
self,
224+
name: name,
225+
object: nil)
226+
}
227+
228+
if let observer = unityReadyObserver {
229+
NotificationCenter.default.removeObserver(observer)
230+
unityReadyObserver = nil
231+
}
232+
}
233+
209234
// Pause unity player
210235
func pause() {
211236
self.ufw?.pause(true)
@@ -220,6 +245,7 @@ var sharedApplication: UIApplication?
220245

221246
// Unoad unity player
222247
func unload() {
248+
self.removeNotifications()
223249
self.ufw?.unloadApplication()
224250
}
225251

0 commit comments

Comments
 (0)