Skip to content

Commit 9ff6d05

Browse files
committed
feat: IAMs now display when triggers added before first fetch
- Addresses issue where in-app messages wouldn't display on cold starts if their triggers were added very early (before IAM fetch completed). - Tracks triggers added before first fetch completes, then applies the isTriggerChanged flag to matching messages when they are received from the server, ensuring redisplay logic works correctly.
1 parent c2ba503 commit 9ff6d05

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ @interface OSMessagingController ()
149149
/// set when we attempt getInAppMessagesFromServer and no onesignal ID is available yet
150150
@property (strong, nonatomic, nullable) NSString *shouldFetchOnUserChangeWithSubscriptionID;
151151

152+
/// Tracks whether the first IAM fetch has completed since this cold start
153+
@property (nonatomic) BOOL hasCompletedFirstFetch;
154+
155+
/// Tracks trigger keys added early on cold start (before first fetch completes), for redisplay logic
156+
@property (strong, nonatomic, nonnull) NSMutableSet<NSString *> *earlySessionTriggers;
157+
152158
@end
153159

154160
@implementation OSMessagingController
@@ -218,6 +224,8 @@ - (instancetype)init {
218224
self.messageDisplayQueue = [NSMutableArray new];
219225
self.clickListeners = [NSMutableArray new];
220226
self.lifecycleListeners = [NSMutableArray new];
227+
self.hasCompletedFirstFetch = NO;
228+
self.earlySessionTriggers = [NSMutableSet new];
221229

222230
let standardUserDefaults = OneSignalUserDefaults.initStandard;
223231

@@ -404,6 +412,23 @@ - (void)updateInAppMessagesFromServer:(NSArray<OSInAppMessageInternal *> *)newMe
404412
self.messages = newMessages;
405413
self.calledLoadTags = NO;
406414
[self resetRedisplayMessagesBySession];
415+
416+
// Apply isTriggerChanged for messages that match triggers added too early on cold start
417+
if (self.earlySessionTriggers.count > 0) {
418+
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Processing triggers added early on cold start: %@", self.earlySessionTriggers]];
419+
for (OSInAppMessageInternal *message in self.messages) {
420+
if ([self.redisplayedInAppMessages objectForKey:message.messageId] &&
421+
[self.triggerController hasSharedTriggers:message newTriggersKeys:self.earlySessionTriggers.allObjects]) {
422+
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Setting isTriggerChanged=YES for message %@", message]];
423+
message.isTriggerChanged = YES;
424+
}
425+
}
426+
[self.earlySessionTriggers removeAllObjects];
427+
}
428+
429+
// Mark that first fetch has completed
430+
self.hasCompletedFirstFetch = YES;
431+
407432
[self evaluateMessages];
408433
[self deleteOldRedisplayedInAppMessages];
409434
}
@@ -806,6 +831,13 @@ - (void)evaluateRedisplayedInAppMessages:(NSArray<NSString *> *)newTriggersKeys
806831
#pragma mark Trigger Methods
807832
- (void)addTriggers:(NSDictionary<NSString *, id> *)triggers {
808833
[self evaluateRedisplayedInAppMessages:triggers.allKeys];
834+
835+
// Track triggers added early on cold start (before first fetch completes) for redisplay logic
836+
if (!self.hasCompletedFirstFetch) {
837+
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Tracking triggers added early on cold start: %@", triggers]];
838+
[self.earlySessionTriggers addObjectsFromArray:triggers.allKeys];
839+
}
840+
809841
[self.triggerController addTriggers:triggers];
810842
}
811843

0 commit comments

Comments
 (0)