Skip to content

Commit c32c5e4

Browse files
authored
Add multiple instance callbacks (#540)
1 parent 88f37d8 commit c32c5e4

File tree

11 files changed

+125
-31
lines changed

11 files changed

+125
-31
lines changed

LeanplumSDK/LeanplumSDK.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@
214214
6A29EAC528EB56AD0024880E /* MigrationManager+ResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A29EAC328EB56AD0024880E /* MigrationManager+ResponseHandler.swift */; };
215215
6A29EAF528EF37090024880E /* IdentityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A29EAF428EF37090024880E /* IdentityManager.swift */; };
216216
6A29EAF628EF37090024880E /* IdentityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A29EAF428EF37090024880E /* IdentityManager.swift */; };
217+
6A2E4C20292BAB3400385536 /* CleverTapInstanceCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A2E4C1E292BAB3400385536 /* CleverTapInstanceCallback.h */; settings = {ATTRIBUTES = (Public, ); }; };
218+
6A2E4C21292BAB3400385536 /* CleverTapInstanceCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A2E4C1E292BAB3400385536 /* CleverTapInstanceCallback.h */; settings = {ATTRIBUTES = (Public, ); }; };
219+
6A2E4C22292BAB3400385536 /* CleverTapInstanceCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A2E4C1F292BAB3400385536 /* CleverTapInstanceCallback.m */; };
220+
6A2E4C23292BAB3400385536 /* CleverTapInstanceCallback.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A2E4C1F292BAB3400385536 /* CleverTapInstanceCallback.m */; };
217221
6A37A89628EF6E6C00F4339F /* Wrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A37A89528EF6E6C00F4339F /* Wrapper.swift */; };
218222
6A37A89728EF6E6C00F4339F /* Wrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A37A89528EF6E6C00F4339F /* Wrapper.swift */; };
219223
6A37A89928EF738200F4339F /* MigrationManager+API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A37A89828EF738200F4339F /* MigrationManager+API.swift */; };
@@ -813,6 +817,8 @@
813817
6A29EABD28EA13B60024880E /* PropertyWrappers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PropertyWrappers.swift; sourceTree = "<group>"; };
814818
6A29EAC328EB56AD0024880E /* MigrationManager+ResponseHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MigrationManager+ResponseHandler.swift"; sourceTree = "<group>"; };
815819
6A29EAF428EF37090024880E /* IdentityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentityManager.swift; sourceTree = "<group>"; };
820+
6A2E4C1E292BAB3400385536 /* CleverTapInstanceCallback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CleverTapInstanceCallback.h; sourceTree = "<group>"; };
821+
6A2E4C1F292BAB3400385536 /* CleverTapInstanceCallback.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CleverTapInstanceCallback.m; sourceTree = "<group>"; };
816822
6A37A89528EF6E6C00F4339F /* Wrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wrapper.swift; sourceTree = "<group>"; };
817823
6A37A89828EF738200F4339F /* MigrationManager+API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MigrationManager+API.swift"; sourceTree = "<group>"; };
818824
6A37A89B28EF748800F4339F /* Dictionary+MapKeys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+MapKeys.swift"; sourceTree = "<group>"; };
@@ -920,6 +926,8 @@
920926
075AAD5B26847EC3007CA1BD /* MessageTemplates */,
921927
075AAD8526847EC3007CA1BD /* Notifications */,
922928
075AAD9526847EC3007CA1BD /* Utilities */,
929+
6A2E4C1E292BAB3400385536 /* CleverTapInstanceCallback.h */,
930+
6A2E4C1F292BAB3400385536 /* CleverTapInstanceCallback.m */,
923931
);
924932
path = Classes;
925933
sourceTree = "<group>";
@@ -1468,6 +1476,7 @@
14681476
075AAE9C26847EC4007CA1BD /* Leanplum_Reachability.h in Headers */,
14691477
075AAE1826847EC4007CA1BD /* LPFileTransferManager.h in Headers */,
14701478
075AAE7E26847EC4007CA1BD /* LPAES.h in Headers */,
1479+
6A2E4C20292BAB3400385536 /* CleverTapInstanceCallback.h in Headers */,
14711480
075AAE9726847EC4007CA1BD /* Leanplum_SocketIO.h in Headers */,
14721481
075AAE3026847EC4007CA1BD /* LPVar.h in Headers */,
14731482
075AAE0626847EC4007CA1BD /* LPRequestBatch.h in Headers */,
@@ -1555,6 +1564,7 @@
15551564
6A714B0B26F8B317004A34A9 /* Leanplum_Reachability.h in Headers */,
15561565
6A714B0C26F8B317004A34A9 /* LPFileTransferManager.h in Headers */,
15571566
6A714B0D26F8B317004A34A9 /* LPAES.h in Headers */,
1567+
6A2E4C21292BAB3400385536 /* CleverTapInstanceCallback.h in Headers */,
15581568
6A714B0E26F8B317004A34A9 /* Leanplum_SocketIO.h in Headers */,
15591569
6A714B0F26F8B317004A34A9 /* LPVar.h in Headers */,
15601570
6A714B1026F8B317004A34A9 /* LPRequestBatch.h in Headers */,
@@ -1940,6 +1950,7 @@
19401950
6A07FDA22811911000995BE3 /* ActionManager+FileDownload.swift in Sources */,
19411951
075AAE8126847EC4007CA1BD /* LPSwizzle.m in Sources */,
19421952
6AD978542774F2F700A7C6C6 /* NotificationsProxy+iOS9.swift in Sources */,
1953+
6A2E4C22292BAB3400385536 /* CleverTapInstanceCallback.m in Sources */,
19431954
075AAE6A26847EC4007CA1BD /* LPLocalNotificationsManager.m in Sources */,
19441955
C9D064DC2775DB1100A7A5F9 /* Dictionary+Equatable.swift in Sources */,
19451956
075AAE1C26847EC4007CA1BD /* LPNetworkFactory.m in Sources */,
@@ -2068,6 +2079,7 @@
20682079
6A07FDA32811911000995BE3 /* ActionManager+FileDownload.swift in Sources */,
20692080
6A714B9126F8B317004A34A9 /* LPSwizzle.m in Sources */,
20702081
6AD978552774F2F700A7C6C6 /* NotificationsProxy+iOS9.swift in Sources */,
2082+
6A2E4C23292BAB3400385536 /* CleverTapInstanceCallback.m in Sources */,
20712083
6A714B9226F8B317004A34A9 /* LPLocalNotificationsManager.m in Sources */,
20722084
C9D064DD2775DB1100A7A5F9 /* Dictionary+Equatable.swift in Sources */,
20732085
6A714B9326F8B317004A34A9 /* LPNetworkFactory.m in Sources */,
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// CleverTapInstanceCallback.h
3+
// LeanplumSDK
4+
//
5+
// Created by Nikola Zagorchev on 21.11.22.
6+
// Copyright © 2022 Leanplum. All rights reserved.
7+
8+
#import <Foundation/Foundation.h>
9+
// Forward declaration for CleverTap instance
10+
@class CleverTap;
11+
12+
NS_ASSUME_NONNULL_BEGIN
13+
14+
typedef void (^LeanplumCleverTapInstanceBlock)(CleverTap* instance);
15+
16+
@interface CleverTapInstanceCallback : NSObject
17+
18+
- (instancetype)init NS_UNAVAILABLE;
19+
- (instancetype)initWithCallback:(LeanplumCleverTapInstanceBlock)block;
20+
21+
- (void)onInstance:(CleverTap *)instance;
22+
23+
@end
24+
25+
NS_ASSUME_NONNULL_END
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//
2+
// CleverTapInstanceCallback.m
3+
// LeanplumSDK
4+
//
5+
// Created by Nikola Zagorchev on 21.11.22.
6+
// Copyright © 2022 Leanplum. All rights reserved.
7+
8+
#import "CleverTapInstanceCallback.h"
9+
10+
@interface CleverTapInstanceCallback()
11+
@property (atomic, nonnull) LeanplumCleverTapInstanceBlock block;
12+
@end
13+
14+
@implementation CleverTapInstanceCallback
15+
16+
- (instancetype)initWithCallback:(LeanplumCleverTapInstanceBlock)block
17+
{
18+
self = [super init];
19+
if (self) {
20+
self.block = block;
21+
}
22+
return self;
23+
}
24+
25+
- (void)onInstance:(CleverTap *)instance
26+
{
27+
self.block(instance);
28+
}
29+
30+
@end

LeanplumSDK/LeanplumSDK/Classes/Internal/Leanplum.m

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,9 +2621,14 @@ + (void)enableProvisionalPushNotifications
26212621
[[Leanplum notificationsManager] enableProvisionalPush];
26222622
}
26232623

2624-
+ (void)onCleverTapInstanceInitialized:(LeanplumCleverTapInstanceBlock)block
2624+
+ (void)addCleverTapInstanceCallback:(CleverTapInstanceCallback *)callback
26252625
{
2626-
[[MigrationManager shared] setInstanceCallback:block];
2626+
[[MigrationManager shared] addInstanceCallback:callback];
2627+
}
2628+
2629+
+ (void)removeCleverTapInstanceCallback:(CleverTapInstanceCallback *)callback
2630+
{
2631+
[[MigrationManager shared] removeInstanceCallback:callback];
26272632
}
26282633

26292634
- (void) dealloc {

LeanplumSDK/LeanplumSDK/Classes/Leanplum.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@
6464
#import "LPLogManager.h"
6565
#import "LPRequestSenderTimer.h"
6666
#import "LPRequestSender.h"
67-
// Forward declaration for CleverTap instance
68-
@class CleverTap;
67+
#import "CleverTapInstanceCallback.h"
6968

7069
NS_ASSUME_NONNULL_BEGIN
7170

@@ -147,7 +146,6 @@ typedef BOOL (^LeanplumActionBlock)(LPActionContext* context);
147146
typedef void (^LeanplumHandleNotificationBlock)(void);
148147
typedef void (^LeanplumShouldHandleNotificationBlock)(NSDictionary *userInfo, LeanplumHandleNotificationBlock response);
149148
typedef void (^LeanplumPushSetupBlock)(void);
150-
typedef void (^LeanplumCleverTapInstanceBlock)(CleverTap* instance);
151149
/**@}*/
152150

153151
/**
@@ -805,12 +803,23 @@ NS_SWIFT_NAME(setDeviceLocation(latitude:longitude:city:region:country:type:));
805803

806804
/**
807805
* Block to call when CleverTapAPI instance is created.
808-
* CleverTapSDK must be imported to use this method.
806+
* __CleverTapSDK must be imported to use this method.__
809807
* Use the instance for any CleverTap work.
810808
*
811-
* @param block Null value will remove the callback.
809+
* @remark CleverTapSDK must be imported to use the `CleverTapInstanceCallback`.
810+
*
811+
* @param callback Null value will remove the callback.
812+
*/
813+
+ (void)addCleverTapInstanceCallback:(CleverTapInstanceCallback *)callback
814+
NS_SWIFT_NAME(addCleverTapInstance(callback:));
815+
816+
/**
817+
* Removes the callback for the CleverTap instance.
818+
*
819+
* @param callback Callback to remove.
812820
*/
813-
+ (void)onCleverTapInstanceInitialized:(LeanplumCleverTapInstanceBlock)block;
821+
+ (void)removeCleverTapInstanceCallback:(CleverTapInstanceCallback *)callback
822+
NS_SWIFT_NAME(removeCleverTapInstance(callback:));
814823

815824
@end
816825

LeanplumSDK/LeanplumSDK/Classes/LeanplumSDK.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,4 @@ FOUNDATION_EXPORT const unsigned char LeanplumSDKVersionString[];
109109
#import "UIDevice+IdentifierAddition.h"
110110
#import "Leanplum_AsyncSocket.h"
111111
#import "Leanplum_WebSocket.h"
112+
#import "CleverTapInstanceCallback.h"

LeanplumSDK/LeanplumSDK/ClassesSwift/Migration/MigrationManager+API.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,15 @@
6363
wrapper?.setTrafficSourceInfo(info)
6464
}
6565

66-
func setInstanceCallback(_ callback: @escaping ((Any) -> Void)) {
67-
instanceCallback = callback
66+
func addInstanceCallback(_ callback: CleverTapInstanceCallback) {
67+
instanceCallbacks.append(callback)
68+
wrapper?.addInstanceCallback(callback)
69+
}
70+
71+
func removeInstanceCallback(_ callback: CleverTapInstanceCallback) {
72+
guard let index = instanceCallbacks.firstIndex(of: callback) else { return }
73+
instanceCallbacks.remove(at: index)
74+
wrapper?.removeInstanceCallback(callback)
6875
}
6976

7077
func setLogLevel(_ level: LeanplumLogLevel) {

LeanplumSDK/LeanplumSDK/ClassesSwift/Migration/MigrationManager.swift

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Foundation
1616
@objc public static let shared: MigrationManager = .init()
1717

1818
var wrapper: Wrapper?
19+
var instanceCallbacks: [CleverTapInstanceCallback] = []
1920

2021
@StringOptionalUserDefaults(key: Constants.HashKey)
2122
var migrationHash: String?
@@ -43,12 +44,6 @@ import Foundation
4344

4445
private let lock = NSLock()
4546

46-
var instanceCallback: ((Any) -> Void)? {
47-
didSet {
48-
wrapper?.setInstanceCallback(instanceCallback)
49-
}
50-
}
51-
5247
// Expose to ObjC
5348
@objc public var useLeanplum: Bool {
5449
migrationState.useLeanplum
@@ -73,7 +68,7 @@ import Foundation
7368
wrapper = CTWrapper(accountId: id, accountToken: token,
7469
accountRegion: accountRegion,
7570
userId: user, deviceId: device,
76-
callback: instanceCallback)
71+
callbacks: instanceCallbacks)
7772

7873
if Leanplum.hasStarted() {
7974
Log.debug("[Wrapper] Leanplum has already started, launching CleverTap as well.")

LeanplumSDK/LeanplumSDK/ClassesSwift/Migration/Wrapper/CTWrapper.swift

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class CTWrapper: Wrapper {
2828

2929
// MARK: Initialization
3030
var cleverTapInstance: CleverTap?
31-
var instanceCallback: ((Any) -> Void)?
31+
var instanceCallbacks: [CleverTapInstanceCallback]
3232

3333
var accountId: String
3434
var accountToken: String
@@ -40,12 +40,12 @@ class CTWrapper: Wrapper {
4040
accountRegion: String,
4141
userId: String,
4242
deviceId: String,
43-
callback: ((Any) -> Void)?) {
43+
callbacks: [CleverTapInstanceCallback]) {
4444
Log.debug("[Wrapper] Wrapper Instantiated")
4545
self.accountId = accountId
4646
self.accountToken = accountToken
4747
self.accountRegion = accountRegion
48-
self.instanceCallback = callback
48+
self.instanceCallbacks = callbacks
4949

5050
identityManager = IdentityManager(userId: userId, deviceId: deviceId)
5151
setLogLevel(LPLogManager.logLevel())
@@ -76,20 +76,28 @@ class CTWrapper: Wrapper {
7676
cleverTapInstance?.profilePush([Constants.AnonymousDeviceUserProperty: identityManager.deviceId])
7777
}
7878
}
79-
triggerInstanceCallback()
79+
triggerInstanceCallbacks()
8080
}
8181

8282
// MARK: Callback
83-
func setInstanceCallback(_ callback: ((Any) -> Void)?) {
84-
instanceCallback = callback
85-
triggerInstanceCallback()
83+
func addInstanceCallback(_ callback: CleverTapInstanceCallback) {
84+
instanceCallbacks.append(callback)
85+
if let instance = cleverTapInstance {
86+
callback.onInstance(instance)
87+
}
8688
}
8789

88-
private func triggerInstanceCallback() {
89-
guard let callback = instanceCallback, let instance = cleverTapInstance else {
90-
return
90+
func removeInstanceCallback(_ callback: CleverTapInstanceCallback) {
91+
guard let index = instanceCallbacks.firstIndex(of: callback) else { return }
92+
instanceCallbacks.remove(at: index)
93+
}
94+
95+
private func triggerInstanceCallbacks() {
96+
guard let instance = cleverTapInstance else { return }
97+
98+
for callback in instanceCallbacks {
99+
callback.onInstance(instance)
91100
}
92-
callback(instance)
93101
}
94102

95103
// MARK: Tracking

LeanplumSDK/LeanplumSDK/ClassesSwift/Migration/Wrapper/Wrapper.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ protocol Wrapper {
1010
/// equivalent to Leanplum start
1111
func launch()
1212

13-
/// Sets instance callback when wrapper has initialized
14-
func setInstanceCallback(_ callback: ((Any) -> Void)?)
13+
/// Adds instance callback, executed when wrapper has initialized
14+
func addInstanceCallback(_ callback: CleverTapInstanceCallback)
15+
16+
func removeInstanceCallback(_ callback: CleverTapInstanceCallback)
1517

1618
func track(_ eventName: String?, value: Double, info: String?, params: [String: Any])
1719

0 commit comments

Comments
 (0)