From 8c62aaaca17c2d46f5097970aa3518279d6dde07 Mon Sep 17 00:00:00 2001 From: emawby Date: Wed, 9 Aug 2023 16:50:27 -0700 Subject: [PATCH 1/2] Always remove the window when an IAM is dismissed Cherry pick https://github.com/OneSignal/OneSignal-iOS-SDK/pull/1276 --- .../OneSignalInAppMessages/Controller/OSMessagingController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m index 96ee6e00f..38df37104 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m @@ -448,6 +448,7 @@ - (void)presentInAppPreviewMessage:(OSInAppMessageInternal *)message { - (void)displayMessage:(OSInAppMessageInternal *)message { // Check if the app disabled IAMs for this device before showing an IAM if (_isInAppMessagingPaused && !message.isPreview) { + [self cleanUpInAppWindow]; [OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"In app messages will not show while paused"]; return; } From 9e42090a7e74c2753a3d5585d9b92d986d5a1631 Mon Sep 17 00:00:00 2001 From: emawby Date: Wed, 9 Aug 2023 17:55:00 -0700 Subject: [PATCH 2/2] Ignore the second JS dismiss event The JS dismiss event is being sent to the SDK twice. Make sure we don't dismiss twice or the second IAM in the queue will be dismissed before it is displayed --- .../Controller/OSMessagingController.m | 2 +- .../UI/OSInAppMessageViewController.m | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m index 38df37104..1a430293e 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m @@ -738,7 +738,7 @@ - (void)messageViewControllerWasDismissed:(OSInAppMessageInternal *)message disp [self persistInAppMessageForRedisplay:showingIAM]; } // Reset the IAM viewController to prepare for next IAM if one exists - [self cleanUpInAppWindow]; + self.viewController = nil; // Reset time since last IAM [self setAndPersistTimeSinceLastMessage]; diff --git a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/UI/OSInAppMessageViewController.m b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/UI/OSInAppMessageViewController.m index 3c034d22a..9645bb8d9 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/UI/OSInAppMessageViewController.m +++ b/iOS_SDK/OneSignalSDK/OneSignalInAppMessages/UI/OSInAppMessageViewController.m @@ -95,12 +95,15 @@ @interface OSInAppMessageViewController () @implementation OSInAppMessageViewController +OSInAppMessageInternal *_dismissingMessage = nil; + - (instancetype _Nonnull)initWithMessage:(OSInAppMessageInternal *)inAppMessage delegate:(id)delegate { if (self = [super init]) { self.message = inAppMessage; self.delegate = delegate; self.useHeightMargin = YES; self.useWidthMargin = YES; + _dismissingMessage = nil; } return self; @@ -490,6 +493,10 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity { [self.delegate messageViewControllerWasDismissed:self.message displayed:NO]; return; } + + if (_dismissingMessage == self.message) { + return; + } [self.delegate messageViewControllerWillDismiss:self.message]; @@ -521,7 +528,7 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity { animationOption = UIViewAnimationOptionCurveEaseIn; dismissAnimationDuration = MIN_DISMISSAL_ANIMATION_DURATION; } - + _dismissingMessage = self.message; [UIView animateWithDuration:dismissAnimationDuration delay:0.0f options:animationOption animations:^{ self.view.backgroundColor = [UIColor clearColor]; self.view.alpha = 0.0f;