Procházet zdrojové kódy

iOS bug #3377: work around bugs in some third party iOS libraries (e.g. Google admob) where they assume the optional UIApplicationDelegate ?window? property always exists and will crash if it doesn?t.

Alex Szpakowski před 9 roky
rodič
revize
787a54c84b

+ 6 - 0
src/video/uikit/SDL_uikitappdelegate.h

@@ -36,6 +36,12 @@
 
 - (void)hideLaunchScreen;
 
+/* This property is marked as optional, and is only intended to be used when
+ * the app's UI is storyboard-based. SDL is not storyboard-based, however
+ * several major third-party ad APIs (e.g. Google admob) incorrectly assume this
+ * property always exists, and will crash if it doesn't. */
+@property (nonatomic) UIWindow *window;
+
 @end
 
 /* vi: set ts=4 sw=4 expandtab: */

+ 21 - 1
src/video/uikit/SDL_uikitappdelegate.m

@@ -422,6 +422,26 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
     return YES;
 }
 
+- (UIWindow *)window
+{
+    SDL_VideoDevice *_this = SDL_GetVideoDevice();
+    if (_this) {
+        SDL_Window *window = NULL;
+        for (window = _this->windows; window != NULL; window = window->next) {
+            SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
+            if (data != nil) {
+                return data.uiwindow;
+            }
+        }
+    }
+    return nil;
+}
+
+- (void)setWindow:(UIWindow *)window
+{
+    /* Do nothing. */
+}
+
 - (void)applicationWillTerminate:(UIApplication *)application
 {
     SDL_SendAppEvent(SDL_APP_TERMINATING);
@@ -467,7 +487,7 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
     SDL_VideoDevice *_this = SDL_GetVideoDevice();
     if (_this) {
         SDL_Window *window;
-        for (window = _this->windows; window != nil; window = window->next) {
+        for (window = _this->windows; window != NULL; window = window->next) {
             SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
             SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
         }