Skip to content

Commit 3d2b2ef

Browse files
authored
Merge pull request #544 from OneSignal/fix_iam_preview_constraint_crash
Fix iam preview constraint crash
2 parents 79df764 + 3acae59 commit 3d2b2ef

File tree

4 files changed

+33
-16
lines changed

4 files changed

+33
-16
lines changed

iOS_SDK/OneSignalSDK/Source/OSInAppMessageViewController.m

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ @interface OSInAppMessageViewController ()
7979
// We start the timer once the message is displayed (not during loading the content)
8080
@property (weak, nonatomic, nullable) NSTimer *dismissalTimer;
8181

82+
// BOOL to track when an IAM has started UI setup so we know when to bypass UI changes on dismissal or not
83+
// This is a fail safe for cases where global contraints are nil and we try to modify them on dismissal of an IAM
84+
@property (nonatomic) BOOL didPageRenderingComplete;
85+
8286
@end
8387

8488
@implementation OSInAppMessageViewController
@@ -154,9 +158,6 @@ - (void)addAppEnterBackgroundObserver {
154158
- (void)setupInitialMessageUI {
155159
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"Setting up In-App Message"];
156160

157-
// Remove all of the constraints connected to the messageView
158-
[self.messageView removeConstraints:[self.messageView constraints]];
159-
160161
self.messageView.delegate = self;
161162

162163
[self.messageView setupWebViewConstraints];
@@ -175,7 +176,7 @@ - (void)setupInitialMessageUI {
175176
}
176177

177178
- (void)displayMessage {
178-
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"Displaying In App Message"];
179+
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"Displaying In-App Message"];
179180

180181
// Sets up the message view in a hidden position while we wait
181182
[self setupInitialMessageUI];
@@ -231,9 +232,11 @@ - (void)loadMessageContent {
231232
}
232233

233234
- (void)loadPreviewMessageContent {
234-
[self.message loadPreviewMessageHTMLContentWithUUID:self.message.messageId success:[self messageContentOnSuccess] failure:^(NSError *error) {
235-
[self encounteredErrorLoadingMessageContent:error];
236-
}];
235+
[self.message loadPreviewMessageHTMLContentWithUUID:self.message.messageId
236+
success:[self messageContentOnSuccess]
237+
failure:^(NSError *error) {
238+
[self encounteredErrorLoadingMessageContent:error];
239+
}];
237240
}
238241

239242
- (void)encounteredErrorLoadingMessageContent:(NSError * _Nullable)error {
@@ -392,6 +395,13 @@ Dismisses the message view with a given direction (up or down) and velocity
392395
*/
393396
- (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity {
394397

398+
// If the rendering event never occurs any constraints being adjusted for dismissal will be nil
399+
// and we should bypass dismissal adjustments and animations and skip straight to the OSMessagingController callback for dismissing
400+
if (!self.didPageRenderingComplete) {
401+
[self.delegate messageViewControllerWasDismissed];
402+
return;
403+
}
404+
395405
// Inactivate the current Y constraints
396406
self.finalYConstraint.active = false;
397407
self.initialYConstraint.active = false;
@@ -407,7 +417,7 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity {
407417
distance = self.view.frame.size.height - self.messageView.frame.origin.y + 8.0f;
408418
[self.messageView.topAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:8.0f].active = true;
409419
}
410-
420+
411421
var dismissAnimationDuration = velocity != 0.0f ? distance / fabs(velocity) : 0.3f;
412422

413423
var animationOption = UIViewAnimationOptionCurveLinear;
@@ -430,7 +440,8 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity {
430440
return;
431441

432442
[self dismissViewControllerAnimated:false completion:nil];
433-
443+
444+
self.didPageRenderingComplete = false;
434445
[self.delegate messageViewControllerWasDismissed];
435446
}];
436447
}
@@ -600,6 +611,10 @@ - (void)jsEventOccurredWithBody:(NSData *)body {
600611

601612
if (event) {
602613
if (event.type == OSInAppMessageBridgeEventTypePageRenderingComplete) {
614+
615+
// BOOL set to true since the JS event fired, meaning the WebView was populated properly with the IAM code
616+
self.didPageRenderingComplete = true;
617+
603618
self.message.position = event.renderingComplete.displayLocation;
604619
self.message.height = event.renderingComplete.height;
605620

iOS_SDK/OneSignalSDK/Source/OSMessagingController.m

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,14 @@ - (void)presentInAppPreviewMessage:(OSInAppMessage *)message {
171171

172172
- (void)displayMessage:(OSInAppMessage *)message {
173173
self.isInAppMessageShowing = true;
174+
174175
self.viewController = [[OSInAppMessageViewController alloc] initWithMessage:message];
175176
self.viewController.delegate = self;
176177

177178
dispatch_async(dispatch_get_main_queue(), ^{
178179
[[self.viewController view] setNeedsLayout];
180+
[self messageViewImpressionRequest:message];
179181
});
180-
181-
[self messageViewImpressionRequest:message];
182182
}
183183

184184
/*
@@ -294,12 +294,11 @@ - (void)messageViewControllerWasDismissed {
294294
[self displayMessage:self.messageDisplayQueue.firstObject];
295295
return;
296296
} else {
297-
// Hide and null our reference to the window to ensure there are no leaks
297+
// Hide the window and call makeKeyWindow to ensure the IAM will not be shown
298298
self.window.hidden = true;
299299
[UIApplication.sharedApplication.delegate.window makeKeyWindow];
300-
self.window = nil;
301300

302-
// Evaulate any IAMs (could be new or have now satisfied trigger conditions)
301+
// Evaulate any IAMs (could be new IAM or added trigger conditions)
303302
[self evaluateMessages];
304303
}
305304
}

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,9 +1873,8 @@ + (void)handleNotificationOpened:(NSDictionary*)messageDict
18731873
return;
18741874

18751875
OSNotificationPayload *payload = [OSNotificationPayload parseWithApns:messageDict];
1876-
if ([OneSignalHelper handleIAMPreview:payload]) {
1876+
if ([OneSignalHelper handleIAMPreview:payload])
18771877
return;
1878-
}
18791878

18801879
onesignal_Log(ONE_S_LL_VERBOSE, @"handleNotificationOpened:isActive called!");
18811880

iOS_SDK/OneSignalSDK/Source/OneSignalHelper.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,10 +436,14 @@ + (void)handleNotificationAction:(OSNotificationActionType)actionType actionID:(
436436
+ (BOOL)handleIAMPreview:(OSNotificationPayload *)payload {
437437
NSString *uuid = [payload additionalData][ONESIGNAL_IAM_PREVIEW];
438438
if (uuid) {
439+
440+
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"IAM Preview Detected, Begin Handling"];
439441
OSInAppMessage *message = [OSInAppMessage instancePreviewFromPayload:payload];
440442
[[OSMessagingController sharedInstance] presentInAppPreviewMessage:message];
441443
return YES;
442444
}
445+
446+
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"IAM Preview Not Detected, Handle Normal Notification"];
443447
return NO;
444448
}
445449

0 commit comments

Comments
 (0)