Skip to content

Commit 208bc8d

Browse files
authored
Merge pull request #1278 from OneSignal/5.0.0/support_multiple_listeners
[5.0.0] Support multiple IAM + Notification Lifecycle Listeners
2 parents 7e03af4 + f2a38f4 commit 208bc8d

File tree

11 files changed

+175
-50
lines changed

11 files changed

+175
-50
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Scheme
3+
LastUpgradeVersion = "1410"
4+
version = "1.3">
5+
<BuildAction
6+
parallelizeBuildables = "YES"
7+
buildImplicitDependencies = "YES">
8+
<BuildActionEntries>
9+
<BuildActionEntry
10+
buildForTesting = "YES"
11+
buildForRunning = "YES"
12+
buildForProfiling = "YES"
13+
buildForArchiving = "YES"
14+
buildForAnalyzing = "YES">
15+
<BuildableReference
16+
BuildableIdentifier = "primary"
17+
BlueprintIdentifier = "9112E8811E724C320022A1CB"
18+
BuildableName = "OneSignalExample.app"
19+
BlueprintName = "OneSignalExample"
20+
ReferencedContainer = "container:OneSignalExample.xcodeproj">
21+
</BuildableReference>
22+
</BuildActionEntry>
23+
</BuildActionEntries>
24+
</BuildAction>
25+
<TestAction
26+
buildConfiguration = "Debug"
27+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29+
shouldUseLaunchSchemeArgsEnv = "YES">
30+
<Testables>
31+
</Testables>
32+
</TestAction>
33+
<LaunchAction
34+
buildConfiguration = "Debug"
35+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
36+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
37+
launchStyle = "0"
38+
useCustomWorkingDirectory = "NO"
39+
ignoresPersistentStateOnLaunch = "NO"
40+
debugDocumentVersioning = "YES"
41+
debugServiceExtension = "internal"
42+
allowLocationSimulation = "YES">
43+
<BuildableProductRunnable
44+
runnableDebuggingMode = "0">
45+
<BuildableReference
46+
BuildableIdentifier = "primary"
47+
BlueprintIdentifier = "9112E8811E724C320022A1CB"
48+
BuildableName = "OneSignalExample.app"
49+
BlueprintName = "OneSignalExample"
50+
ReferencedContainer = "container:OneSignalExample.xcodeproj">
51+
</BuildableReference>
52+
</BuildableProductRunnable>
53+
</LaunchAction>
54+
<ProfileAction
55+
buildConfiguration = "Release"
56+
shouldUseLaunchSchemeArgsEnv = "YES"
57+
savedToolIdentifier = ""
58+
useCustomWorkingDirectory = "NO"
59+
debugDocumentVersioning = "YES">
60+
<BuildableProductRunnable
61+
runnableDebuggingMode = "0">
62+
<BuildableReference
63+
BuildableIdentifier = "primary"
64+
BlueprintIdentifier = "9112E8811E724C320022A1CB"
65+
BuildableName = "OneSignalExample.app"
66+
BlueprintName = "OneSignalExample"
67+
ReferencedContainer = "container:OneSignalExample.xcodeproj">
68+
</BuildableReference>
69+
</BuildableProductRunnable>
70+
</ProfileAction>
71+
<AnalyzeAction
72+
buildConfiguration = "Debug">
73+
</AnalyzeAction>
74+
<ArchiveAction
75+
buildConfiguration = "Release"
76+
revealArchiveInOrganizer = "YES">
77+
</ArchiveAction>
78+
</Scheme>

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OSInAppMessages.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
@property (strong, nonatomic, nonnull) NSString *messageId;
3535

36-
// Convert the object into a NSDictionary
36+
// Dictionary of properties available on OSInAppMessage only
3737
- (NSDictionary *_Nonnull)jsonRepresentation;
3838

3939
@end
@@ -78,18 +78,22 @@ typedef NS_ENUM(NSUInteger, OSInAppMessageActionUrlType) {
7878

7979
@interface OSInAppMessageWillDisplayEvent : NSObject
8080
@property (nonatomic, readonly, nonnull) OSInAppMessage *message;
81+
- (NSDictionary *_Nonnull)jsonRepresentation;
8182
@end
8283

8384
@interface OSInAppMessageDidDisplayEvent : NSObject
8485
@property (nonatomic, readonly, nonnull) OSInAppMessage *message;
86+
- (NSDictionary *_Nonnull)jsonRepresentation;
8587
@end
8688

8789
@interface OSInAppMessageWillDismissEvent : NSObject
8890
@property (nonatomic, readonly, nonnull) OSInAppMessage *message;
91+
- (NSDictionary *_Nonnull)jsonRepresentation;
8992
@end
9093

9194
@interface OSInAppMessageDidDismissEvent : NSObject
9295
@property (nonatomic, readonly, nonnull) OSInAppMessage *message;
96+
- (NSDictionary *_Nonnull)jsonRepresentation;
9397
@end
9498

9599
@interface OSInAppMessageClickEvent : NSObject

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ NS_ASSUME_NONNULL_BEGIN
6666

6767
- (void)addInAppMessageClickListener:(NSObject<OSInAppMessageClickListener> *_Nullable)listener;
6868
- (void)removeInAppMessageClickListener:(NSObject<OSInAppMessageClickListener> *_Nullable)listener;
69-
- (void)setInAppMessageDelegate:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)delegate;
70-
- (void)removeInAppMessageDelegate:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)delegate;
69+
- (void)addInAppMessageLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener;
70+
- (void)removeInAppMessageLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener;
7171

7272
@end
7373

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,63 @@
3939
#import "OSSessionManager.h"
4040

4141
@implementation OSInAppMessageWillDisplayEvent
42+
4243
- (OSInAppMessageWillDisplayEvent*)initWithInAppMessage:(OSInAppMessage *)message {
4344
_message = message;
4445
return self;
4546
}
47+
48+
- (NSDictionary *)jsonRepresentation {
49+
NSMutableDictionary *json = [NSMutableDictionary new];
50+
json[@"message"] = [self.message jsonRepresentation];
51+
return json;
52+
}
53+
4654
@end
4755

4856
@implementation OSInAppMessageDidDisplayEvent
57+
4958
- (OSInAppMessageDidDisplayEvent*)initWithInAppMessage:(OSInAppMessage *)message {
5059
_message = message;
5160
return self;
5261
}
62+
63+
- (NSDictionary *)jsonRepresentation {
64+
NSMutableDictionary *json = [NSMutableDictionary new];
65+
json[@"message"] = [self.message jsonRepresentation];
66+
return json;
67+
}
68+
5369
@end
5470

5571
@implementation OSInAppMessageWillDismissEvent
72+
5673
- (OSInAppMessageWillDismissEvent*)initWithInAppMessage:(OSInAppMessage *)message {
5774
_message = message;
5875
return self;
5976
}
77+
78+
- (NSDictionary *)jsonRepresentation {
79+
NSMutableDictionary *json = [NSMutableDictionary new];
80+
json[@"message"] = [self.message jsonRepresentation];
81+
return json;
82+
}
83+
6084
@end
6185

6286
@implementation OSInAppMessageDidDismissEvent
87+
6388
- (OSInAppMessageDidDismissEvent*)initWithInAppMessage:(OSInAppMessage *)message {
6489
_message = message;
6590
return self;
6691
}
92+
93+
- (NSDictionary *)jsonRepresentation {
94+
NSMutableDictionary *json = [NSMutableDictionary new];
95+
json[@"message"] = [self.message jsonRepresentation];
96+
return json;
97+
}
98+
6799
@end
68100

69101
@interface OSMessagingController ()
@@ -91,7 +123,7 @@ @interface OSMessagingController ()
91123

92124
@property (nonatomic) NSMutableArray<NSObject<OSInAppMessageClickListener> *> *clickListeners;
93125

94-
@property (weak, nonatomic, nullable) NSObject<OSInAppMessageLifecycleListener> *inAppMessageDelegate;
126+
@property (nonatomic) NSMutableArray<NSObject<OSInAppMessageLifecycleListener> *> *lifecycleListeners;
95127

96128
@property (strong, nullable) OSInAppMessageViewController *viewController;
97129

@@ -169,6 +201,7 @@ - (instancetype)init {
169201
[self initializeTriggerController];
170202
self.messageDisplayQueue = [NSMutableArray new];
171203
self.clickListeners = [NSMutableArray new];
204+
self.lifecycleListeners = [NSMutableArray new];
172205

173206
let standardUserDefaults = OneSignalUserDefaults.initStandard;
174207

@@ -309,43 +342,47 @@ - (void)removeInAppMessageClickListener:(NSObject<OSInAppMessageClickListener> *
309342
[_clickListeners removeObject:listener];
310343
}
311344

312-
- (void)setInAppMessageDelegate:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)delegate {
313-
_inAppMessageDelegate = delegate;
345+
- (void)addInAppMessageLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener {
346+
[_lifecycleListeners addObject:listener];
314347
}
315348

316-
- (void)removeInAppMessageDelegate:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)delegate {
317-
_inAppMessageDelegate = nil;
349+
- (void)removeInAppMessageLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener {
350+
[_lifecycleListeners removeObject:listener];
318351
}
319352

320353
- (void)onWillDisplayInAppMessage:(OSInAppMessageInternal *)message {
321-
if (self.inAppMessageDelegate &&
322-
[self.inAppMessageDelegate respondsToSelector:@selector(onWillDisplayInAppMessage:)]) {
323-
OSInAppMessageWillDisplayEvent *event = [[OSInAppMessageWillDisplayEvent alloc] initWithInAppMessage:message];
324-
[self.inAppMessageDelegate onWillDisplayInAppMessage:event];
354+
for (NSObject<OSInAppMessageLifecycleListener> *listener in _lifecycleListeners) {
355+
if ([listener respondsToSelector:@selector(onWillDisplayInAppMessage:)]) {
356+
OSInAppMessageWillDisplayEvent *event = [[OSInAppMessageWillDisplayEvent alloc] initWithInAppMessage:message];
357+
[listener onWillDisplayInAppMessage:event];
358+
}
325359
}
326360
}
327361

328362
- (void)onDidDisplayInAppMessage:(OSInAppMessageInternal *)message {
329-
if (self.inAppMessageDelegate &&
330-
[self.inAppMessageDelegate respondsToSelector:@selector(onDidDisplayInAppMessage:)]) {
331-
OSInAppMessageDidDisplayEvent *event = [[OSInAppMessageDidDisplayEvent alloc] initWithInAppMessage:message];
332-
[self.inAppMessageDelegate onDidDisplayInAppMessage:event];
363+
for (NSObject<OSInAppMessageLifecycleListener> *listener in _lifecycleListeners) {
364+
if ([listener respondsToSelector:@selector(onDidDisplayInAppMessage:)]) {
365+
OSInAppMessageDidDisplayEvent *event = [[OSInAppMessageDidDisplayEvent alloc] initWithInAppMessage:message];
366+
[listener onDidDisplayInAppMessage:event];
367+
}
333368
}
334369
}
335370

336371
- (void)onWillDismissInAppMessage:(OSInAppMessageInternal *)message {
337-
if (self.inAppMessageDelegate &&
338-
[self.inAppMessageDelegate respondsToSelector:@selector(onWillDismissInAppMessage:)]) {
339-
OSInAppMessageWillDismissEvent *event = [[OSInAppMessageWillDismissEvent alloc] initWithInAppMessage:message];
340-
[self.inAppMessageDelegate onWillDismissInAppMessage:event];
372+
for (NSObject<OSInAppMessageLifecycleListener> *listener in _lifecycleListeners) {
373+
if ([listener respondsToSelector:@selector(onWillDismissInAppMessage:)]) {
374+
OSInAppMessageWillDismissEvent *event = [[OSInAppMessageWillDismissEvent alloc] initWithInAppMessage:message];
375+
[listener onWillDismissInAppMessage:event];
376+
}
341377
}
342378
}
343379

344380
- (void)onDidDismissInAppMessage:(OSInAppMessageInternal *)message {
345-
if (self.inAppMessageDelegate &&
346-
[self.inAppMessageDelegate respondsToSelector:@selector(onDidDismissInAppMessage:)]) {
347-
OSInAppMessageDidDismissEvent *event = [[OSInAppMessageDidDismissEvent alloc] initWithInAppMessage:message];
348-
[self.inAppMessageDelegate onDidDismissInAppMessage:event];
381+
for (NSObject<OSInAppMessageLifecycleListener> *listener in _lifecycleListeners) {
382+
if ([listener respondsToSelector:@selector(onDidDismissInAppMessage:)]) {
383+
OSInAppMessageDidDismissEvent *event = [[OSInAppMessageDidDismissEvent alloc] initWithInAppMessage:message];
384+
[listener onDidDismissInAppMessage:event];
385+
}
349386
}
350387
}
351388

@@ -565,10 +602,10 @@ - (void)setDataForRedisplay:(OSInAppMessageInternal *)message {
565602
BOOL messageDismissed = [_seenInAppMessages containsObject:message.messageId];
566603
let redisplayMessageSavedData = [_redisplayedInAppMessages objectForKey:message.messageId];
567604

568-
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Redisplay dismissed: %@ and data: %@", messageDismissed ? @"YES" : @"NO", redisplayMessageSavedData.jsonRepresentation.description]];
605+
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Redisplay dismissed: %@ and data: %@", messageDismissed ? @"YES" : @"NO", redisplayMessageSavedData.jsonRepresentationInternal.description]];
569606

570607
if (messageDismissed && redisplayMessageSavedData) {
571-
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Redisplay IAM: %@", message.jsonRepresentation.description]];
608+
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:[NSString stringWithFormat:@"Redisplay IAM: %@", message.jsonRepresentationInternal.description]];
572609

573610
message.displayStats.displayQuantity = redisplayMessageSavedData.displayStats.displayQuantity;
574611
message.displayStats.lastDisplayTime = redisplayMessageSavedData.displayStats.lastDisplayTime;

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Model/OSInAppMessageClickEvent.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ - (instancetype)initWithInAppMessage:(OSInAppMessageInternal *)message clickResu
3838

3939
- (NSDictionary *)jsonRepresentation {
4040
let json = [NSMutableDictionary new];
41-
json[@"message"] = self.message;
41+
json[@"message"] = [self.message jsonRepresentation];
4242
json[@"result"] = [self.result jsonRepresentation];
4343
return json;
4444
}

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Model/OSInAppMessageInternal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ NS_ASSUME_NONNULL_BEGIN
5959
- (void)addClickId:(NSString *)clickId;
6060

6161
- (BOOL)isFinished;
62+
// Dictionary of properties available on OSInAppMessageInternal
63+
- (NSDictionary *_Nonnull)jsonRepresentationInternal;
6264

6365
@end
6466

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Model/OSInAppMessageInternal.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ + (instancetype)instancePreviewFromNotification:(OSNotification *)notification {
165165
return message;
166166
}
167167

168-
-(NSDictionary *)jsonRepresentation {
168+
- (NSDictionary *)jsonRepresentationInternal {
169169
let json = [NSMutableDictionary new];
170170

171171
json[@"messageId"] = self.messageId;

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/OneSignalInAppMessages.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ + (void)removeClickListener:(NSObject<OSInAppMessageClickListener> *_Nullable)li
6464

6565
+ (void)addLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener {
6666
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"In app message lifecycle listener added successfully"];
67-
[OSMessagingController.sharedInstance setInAppMessageDelegate:listener];
67+
[OSMessagingController.sharedInstance addInAppMessageLifecycleListener:listener];
6868
}
6969

7070
+ (void)removeLifecycleListener:(NSObject<OSInAppMessageLifecycleListener> *_Nullable)listener {
7171
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"In app message lifecycle listener removed successfully"];
72-
[OSMessagingController.sharedInstance removeInAppMessageDelegate:listener];
72+
[OSMessagingController.sharedInstance removeInAppMessageLifecycleListener:listener];
7373
}
7474

7575
+ (void)addTrigger:(NSString * _Nonnull)key withValue:(NSString * _Nonnull)value {

iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ NS_SWIFT_NAME(onClick(event:));
8080
@interface OSNotificationsManager : NSObject <OSNotifications>
8181

8282
@property (class, weak, nonatomic, nullable) id<OneSignalNotificationsDelegate> delegate;
83-
@property (class, weak, nonatomic, nullable) NSObject<OSNotificationLifecycleListener> *lifecycleListener;
8483

8584
+ (Class<OSNotifications> _Nonnull)Notifications;
8685
+ (void)start;

0 commit comments

Comments
 (0)