Skip to content

Commit 933933e

Browse files
authored
Merge pull request #1233 from OneSignal/fix/foregrounding_detection
Update backgrounded logic to determine displaying cached IAMs
2 parents 37a9089 + 579c0de commit 933933e

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ - (void)didBecomeActive {
9090

9191
- (void)willResignActive {
9292
[OneSignal onesignalLog:ONE_S_LL_VERBOSE message:@"application/scene willResignActive"];
93-
93+
[OneSignalTracker willResignActiveTriggered];
9494
if ([OneSignal appId]) {
9595
[OneSignalTracker onFocus:YES];
9696
[OneSignal sendTagsOnBackground];
@@ -99,7 +99,7 @@ - (void)willResignActive {
9999

100100
- (void)didEnterBackground {
101101
[OneSignal onesignalLog:ONE_S_LL_VERBOSE message:@"application/scene didEnterBackground"];
102-
102+
[OneSignalTracker didEnterBackgroundTriggered];
103103
if ([OneSignal appId])
104104
[OneSignalLocation onFocus:NO];
105105
}

iOS_SDK/OneSignalSDK/Source/OneSignalTracker.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,7 @@
3131

3232
+ (void)onFocus:(BOOL)toBackground;
3333
+ (void)onSessionEnded:(NSArray<OSInfluence *> *) lastInfluences;
34+
+ (void)willResignActiveTriggered;
35+
+ (void)didEnterBackgroundTriggered;
3436

3537
@end

iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,29 @@ @implementation OneSignalTracker
5858
static UIBackgroundTaskIdentifier focusBackgroundTask;
5959
static NSTimeInterval lastOpenedTime;
6060
static BOOL lastOnFocusWasToBackground = YES;
61+
static BOOL willResignActiveTriggered = NO;
62+
static BOOL didEnterBackgroundTriggered = NO;
6163

6264
+ (void)resetLocals {
6365
[OSFocusTimeProcessorFactory resetUnsentActiveTime];
64-
focusBackgroundTask = 0;
66+
focusBackgroundTask = 0;
6567
lastOpenedTime = 0;
6668
lastOnFocusWasToBackground = YES;
69+
[self resetBackgroundDetection];
6770
}
6871

6972
+ (void)setLastOpenedTime:(NSTimeInterval)lastOpened {
7073
lastOpenedTime = lastOpened;
7174
}
7275

76+
+ (void)willResignActiveTriggered {
77+
willResignActiveTriggered = YES;
78+
}
79+
80+
+ (void)didEnterBackgroundTriggered {
81+
didEnterBackgroundTriggered = YES;
82+
}
83+
7384
+ (void)beginBackgroundFocusTask {
7485
focusBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
7586
[OneSignalTracker endBackgroundFocusTask];
@@ -81,10 +92,26 @@ + (void)endBackgroundFocusTask {
8192
focusBackgroundTask = UIBackgroundTaskInvalid;
8293
}
8394

95+
/**
96+
Returns true if application truly did come from a backgrounded state.
97+
Returns false if the application bypassed `didEnterBackground` after entering `willResignActive`.
98+
This can happen if the app resumes after a native dialog displays over the app or after the app is in a suspended state and not backgrounded.
99+
**/
100+
+ (BOOL)applicationForegroundedFromBackgroundedState {
101+
return !(willResignActiveTriggered && !didEnterBackgroundTriggered);
102+
}
103+
104+
+ (void)resetBackgroundDetection {
105+
willResignActiveTriggered = NO;
106+
didEnterBackgroundTriggered = NO;
107+
}
108+
84109
+ (void)onFocus:(BOOL)toBackground {
85110
// return if the user has not granted privacy permissions
86-
if ([OneSignal requiresUserPrivacyConsent])
111+
if ([OneSignal requiresUserPrivacyConsent]) {
112+
[self resetBackgroundDetection];
87113
return;
114+
}
88115

89116
// Prevent the onFocus to be called twice when app being terminated
90117
// - Both WillResignActive and willTerminate
@@ -101,6 +128,10 @@ + (void)onFocus:(BOOL)toBackground {
101128

102129
+ (void)applicationForegrounded {
103130
[OneSignal onesignalLog:ONE_S_LL_DEBUG message:@"Application Foregrounded started"];
131+
132+
BOOL fromBackgroundedState = [self applicationForegroundedFromBackgroundedState];
133+
[self resetBackgroundDetection];
134+
104135
[OSFocusTimeProcessorFactory cancelFocusCall];
105136

106137
if (OneSignal.appEntryState != NOTIFICATION_CLICK)
@@ -115,7 +146,10 @@ + (void)applicationForegrounded {
115146
// This checks if notification permissions changed when app was backgrounded
116147
[OneSignal sendNotificationTypesUpdate];
117148
[[OSSessionManager sharedSessionManager] attemptSessionUpgrade:OneSignal.appEntryState];
118-
[OneSignal receivedInAppMessageJson:nil];
149+
if (fromBackgroundedState) {
150+
// Use cached IAMs if app truly went into the background
151+
[OneSignal receivedInAppMessageJson:nil];
152+
}
119153
}
120154

121155
let wasBadgeSet = [OneSignal clearBadgeCount:false];

0 commit comments

Comments
 (0)