@@ -78,20 +78,23 @@ var sharedApplication: UIApplication?
78
78
private var _isUnityPaused = false
79
79
private var _isUnityReady = false
80
80
private var _isUnityLoaded = false
81
-
81
+
82
+ // 添加观察者属性
83
+ private var unityReadyObserver : NSObjectProtocol ?
84
+
82
85
func initUnity( ) {
83
86
if ( self . unityIsInitiallized ( ) ) {
84
87
self . ufw? . showUnityWindow ( )
85
88
return
86
89
}
87
-
90
+
88
91
self . ufw = UnityFrameworkLoad ( )
89
-
92
+
90
93
self . ufw? . setDataBundleId ( " com.unity3d.framework " )
91
-
94
+
92
95
registerUnityListener ( )
93
96
self . ufw? . runEmbedded ( withArgc: gArgc, argv: gArgv, appLaunchOpts: appLaunchOpts)
94
-
97
+
95
98
if self . ufw? . appController ( ) != nil {
96
99
controller = self . ufw? . appController ( )
97
100
controller? . unityMessageHandler = self . unityMessageHandlers
@@ -100,79 +103,79 @@ var sharedApplication: UIApplication?
100
103
}
101
104
_isUnityLoaded = true
102
105
}
103
-
106
+
104
107
// check if unity is initiallized
105
108
func unityIsInitiallized( ) -> Bool {
106
109
if self . ufw != nil {
107
110
return true
108
111
}
109
-
112
+
110
113
return false
111
114
}
112
-
115
+
113
116
// Create new unity player
114
117
func createPlayer( completed: @escaping ( _ view: UIView ? ) -> Void ) {
115
118
if self . unityIsInitiallized ( ) && self . _isUnityReady {
116
119
completed ( controller? . rootView)
117
120
return
118
121
}
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
121
124
self . _isUnityReady = true
122
125
completed ( controller? . rootView)
123
126
} )
124
-
127
+
125
128
DispatchQueue . main. async {
126
- // if (sharedApplication == nil) {
127
- // sharedApplication = UIApplication.shared
128
- // }
129
-
129
+ // if (sharedApplication == nil) {
130
+ // sharedApplication = UIApplication.shared
131
+ // }
132
+
130
133
// 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
+
135
138
self . initUnity ( )
136
-
139
+
137
140
unity_warmed_up = true
138
141
self . _isUnityReady = true
139
142
self . _isUnityLoaded = true
140
-
143
+
141
144
self . listenAppState ( )
142
-
145
+
143
146
completed ( controller? . rootView)
144
147
}
145
-
148
+
146
149
}
147
-
150
+
148
151
func registerUnityListener( ) {
149
152
if self . unityIsInitiallized ( ) {
150
153
self . ufw? . register ( self )
151
154
}
152
155
}
153
-
156
+
154
157
func unregisterUnityListener( ) {
155
158
if self . unityIsInitiallized ( ) {
156
159
self . ufw? . unregisterFrameworkListener ( self )
157
160
}
158
161
}
159
-
162
+
160
163
@objc
161
164
public func unityDidUnload( _ notification: Notification ! ) {
162
165
unregisterUnityListener ( )
163
166
self . ufw = nil
164
167
self . _isUnityReady = false
165
168
self . _isUnityLoaded = false
166
169
}
167
-
170
+
168
171
@objc func handleAppStateDidChange( notification: Notification ? ) {
169
172
if !self . _isUnityReady {
170
173
return
171
174
}
172
-
175
+
173
176
let unityAppController = self . ufw? . appController ( ) as? UnityAppController
174
177
let application = UIApplication . shared
175
-
178
+
176
179
if notification? . name == UIApplication . willResignActiveNotification {
177
180
unityAppController? . applicationWillResignActive ( application)
178
181
} else if notification? . name == UIApplication . didEnterBackgroundNotification {
@@ -187,8 +190,8 @@ var sharedApplication: UIApplication?
187
190
unityAppController? . applicationDidReceiveMemoryWarning ( application)
188
191
}
189
192
}
190
-
191
-
193
+
194
+
192
195
// Listener for app lifecycle eventa
193
196
func listenAppState( ) {
194
197
for name in [
@@ -206,6 +209,28 @@ var sharedApplication: UIApplication?
206
209
object: nil )
207
210
}
208
211
}
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
+
209
234
// Pause unity player
210
235
func pause( ) {
211
236
self . ufw? . pause ( true )
@@ -220,6 +245,7 @@ var sharedApplication: UIApplication?
220
245
221
246
// Unoad unity player
222
247
func unload( ) {
248
+ self . removeNotifications ( )
223
249
self . ufw? . unloadApplication ( )
224
250
}
225
251
0 commit comments