Skip to content

Commit 5b0b249

Browse files
authored
Merge pull request #949 from OneSignal/fix/iam_display_twice
Fixing IAM displaying twice on cold start
2 parents 9e6feb0 + 419df98 commit 5b0b249

File tree

6 files changed

+70
-8
lines changed

6 files changed

+70
-8
lines changed

iOS_SDK/OneSignalSDK/Source/OSMessagingController.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ - (instancetype)init {
160160

161161
- (void)updateInAppMessagesFromCache {
162162
self.messages = [OneSignalUserDefaults.initStandard getSavedCodeableDataForKey:OS_IAM_MESSAGES_ARRAY defaultValue:[NSArray new]];
163-
164163
[self evaluateMessages];
165164
}
166165

@@ -241,8 +240,9 @@ - (void)presentInAppMessage:(OSInAppMessage *)message {
241240
[self.messageDisplayQueue addObject:message];
242241

243242
// Return early if an IAM is already showing
244-
if (self.isInAppMessageShowing)
243+
if (self.isInAppMessageShowing) {
245244
return;
245+
}
246246
// Return early if the app is not active
247247
if (![UIApplication applicationIsActive]) {
248248
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"Pause IAMs display due to app inactivity"];
@@ -286,7 +286,6 @@ - (void)displayMessage:(OSInAppMessage *)message {
286286
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"In app messages will not show while paused"];
287287
return;
288288
}
289-
290289
self.isInAppMessageShowing = true;
291290
[self showMessage:message];
292291
}
@@ -485,7 +484,8 @@ - (BOOL)hasMessageTriggerChanged:(OSInAppMessage *)message {
485484
- (BOOL)shouldShowInAppMessage:(OSInAppMessage *)message {
486485
return ![self.seenInAppMessages containsObject:message.messageId] &&
487486
[self.triggerController messageMatchesTriggers:message] &&
488-
![message isFinished];
487+
![message isFinished] &&
488+
OneSignal.isRegisterUserFinished;
489489
}
490490

491491
- (void)handleMessageActionWithURL:(OSInAppMessageAction *)action {

iOS_SDK/OneSignalSDK/Source/OSStateSynchronizer.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ + (void)setEmailUserId:(NSString *)emailUserId;
4848
+ (void)saveExternalIdAuthToken:(NSString *)hashToken;
4949
+ (void)saveSMSNumber:(NSString *)smsNumber withAuthToken:(NSString *)smsAuthToken userId:(NSString *)smsPlayerId;
5050
+ (void)registerUserFinished;
51-
51+
+ (void)registerUserSuccessful;
5252
@end
5353

5454
@interface OSStateSynchronizer ()
@@ -129,7 +129,7 @@ - (void)registerUserWithState:(OSUserState *)registrationState withSuccess:(OSMu
129129

130130
[OneSignalClient.sharedClient executeSimultaneousRequests:requests withSuccess:^(NSDictionary<NSString *, NSDictionary *> *results) {
131131
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"on_session result: %@", results]];
132-
[OneSignal registerUserFinished];
132+
[OneSignal registerUserSuccessful];
133133

134134
// If the external user ID was sent as part of this request, we need to save it
135135
// Cache the external id if it exists within the registration payload
@@ -186,6 +186,7 @@ - (void)registerUserWithState:(OSUserState *)registrationState withSuccess:(OSMu
186186
for (NSString *key in @[OS_PUSH, OS_EMAIL])
187187
[OneSignal onesignal_Log:ONE_S_LL_ERROR message:[NSString stringWithFormat: @"Encountered error during %@ registration with OneSignal: %@", key, errors[key]]];
188188

189+
[OneSignal registerUserFinished];
189190
if (failureBlock)
190191
failureBlock(errors);
191192
}];

iOS_SDK/OneSignalSDK/Source/OSSubscription.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ + (void)fireChangesObserver:(OSSubscriptionState*)state {
181181
OSSubscriptionStateChanges* stateChanges = [OSSubscriptionStateChanges alloc];
182182
stateChanges.from = OneSignal.lastSubscriptionState;
183183
stateChanges.to = [state copy];
184-
if (OneSignal.isRegisterUserFinished) {
184+
if (OneSignal.isRegisterUserSuccessful) {
185185
BOOL hasReceiver = [OneSignal.subscriptionStateChangesObserver notifyChange:stateChanges];
186186

187187
if (hasReceiver) {

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,10 +471,15 @@ + (NSString*)mUserId {
471471
+ (void)setUserId:(NSString *)userId {
472472
self.currentSubscriptionState.userId = userId;
473473
}
474-
474+
// This is set to true even if register user fails
475475
+ (void)registerUserFinished {
476476
_registerUserFinished = true;
477477
}
478+
// If successful then register user is also finished
479+
+ (void)registerUserSuccessful {
480+
_registerUserSuccessful = true;
481+
[OneSignal registerUserFinished];
482+
}
478483

479484
+ (NSString *)mEmailAuthToken {
480485
return self.currentEmailSubscriptionState.emailAuthCode;
@@ -593,6 +598,7 @@ + (void)clearStatics {
593598
_outcomeEventsController = nil;
594599

595600
_registerUserFinished = false;
601+
_registerUserSuccessful = false;
596602

597603
_delayedSMSParameters = nil;
598604
}
@@ -1663,6 +1669,11 @@ + (BOOL)isRegisterUserFinished {
16631669
return _registerUserFinished || isOnSessionSuccessfulForCurrentState;
16641670
}
16651671

1672+
static BOOL _registerUserSuccessful = false;
1673+
+ (BOOL)isRegisterUserSuccessful {
1674+
return _registerUserSuccessful || isOnSessionSuccessfulForCurrentState;
1675+
}
1676+
16661677
+ (BOOL)shouldRegisterNow {
16671678
// return if the user has not granted privacy permissions
16681679
if ([self shouldLogMissingPrivacyConsentErrorWithMethodName:nil])
@@ -1832,6 +1843,7 @@ + (OSUserState *)createUserState {
18321843
+ (void)registerUserInternal {
18331844
[OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"registerUserInternal"];
18341845
_registerUserFinished = false;
1846+
_registerUserSuccessful = false;
18351847

18361848
// return if the user has not granted privacy permissions
18371849
if ([self shouldLogMissingPrivacyConsentErrorWithMethodName:nil])
@@ -1938,6 +1950,7 @@ + (void)registerUserInternal {
19381950
callbackSet.failureBlock(error);
19391951
}
19401952
}
1953+
[OSMessagingController.sharedInstance updateInAppMessagesFromCache];
19411954
}];
19421955
}
19431956

iOS_SDK/OneSignalSDK/Source/OneSignalInternal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@
7979

8080
@property (class, readonly) BOOL didCallDownloadParameters;
8181
@property (class, readonly) BOOL downloadedParameters;
82+
//Indicates we have attempted to register the user and it has succeeded or failed
8283
@property (class, readonly) BOOL isRegisterUserFinished;
84+
//Indicates that registering the user was successful
85+
@property (class, readonly) BOOL isRegisterUserSuccessful;
8386

8487
@property (class) NSObject<OneSignalNotificationSettings>* _Nonnull osNotificationSettings;
8588
@property (class) OSPermissionState* _Nonnull currentPermissionState;

iOS_SDK/OneSignalSDK/UnitTests/InAppMessagingIntegrationTests.m

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,51 @@ - (void)testIAMWithRedisplay {
439439
XCTAssertTrue(secondLastDisplayTime - firstInterval >= delay);
440440
}
441441

442+
- (void)testCachedIAMsDonotDisplayUntilRegisterUser {
443+
let limit = 5;
444+
let delay = 30;
445+
446+
let message = [OSInAppMessageTestHelper testMessageWithRedisplayLimit:limit delay:@(delay)];
447+
//Time interval mock
448+
NSDateComponents* comps = [[NSDateComponents alloc]init];
449+
comps.year = 2019;
450+
comps.month = 6;
451+
comps.day = 10;
452+
comps.hour = 10;
453+
comps.minute = 1;
454+
455+
NSCalendar* calendar = [NSCalendar currentCalendar];
456+
NSDate* date = [calendar dateFromComponents:comps];
457+
NSTimeInterval firstInterval = [date timeIntervalSince1970];
458+
NSMutableSet <NSString *> *seenMessages = [NSMutableSet new];
459+
[OSMessagingControllerOverrider setSeenMessages:seenMessages];
460+
461+
message.displayStats.lastDisplayTime = firstInterval - delay;
462+
// Save IAM to messages cache
463+
[OneSignalUserDefaults.initStandard saveCodeableDataForKey:OS_IAM_MESSAGES_ARRAY withValue:@[message]];
464+
465+
[OSMessagingControllerOverrider setMockDateGenerator: ^NSTimeInterval(void) {
466+
return firstInterval;
467+
}];
468+
469+
[OneSignal setAppId:@"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"];
470+
471+
[[OSMessagingController sharedInstance] updateInAppMessagesFromCache];
472+
473+
[OneSignal pauseInAppMessages:false];
474+
475+
// IAM should not be shown since we have not initialized OneSignal
476+
XCTAssertEqual(0, OSMessagingControllerOverrider.messageDisplayQueue.count);
477+
XCTAssertFalse(OSMessagingControllerOverrider.isInAppMessageShowing);
478+
479+
[self initOneSignalWithInAppMessage:message];
480+
XCTAssertEqual(1, OSMessagingControllerOverrider.messageDisplayQueue.count);
481+
XCTAssertTrue(OSMessagingControllerOverrider.isInAppMessageShowing);
482+
[OSMessagingControllerOverrider dismissCurrentMessage];
483+
XCTAssertEqual(0, OSMessagingControllerOverrider.messageDisplayQueue.count);
484+
XCTAssertFalse(OSMessagingControllerOverrider.isInAppMessageShowing);
485+
}
486+
442487
- (void)testIAMClickLaunchesAPIRequestMultipleTimes_Redisplay {
443488
let limit = 5;
444489
let delay = 60;

0 commit comments

Comments
 (0)