Skip to content

Commit 7803835

Browse files
authored
Merge pull request #1552 from OneSignal/feat/custom_events
[feat] Add new user-level custom events API to SDK
2 parents f518552 + 9b7d189 commit 7803835

File tree

14 files changed

+809
-268
lines changed

14 files changed

+809
-268
lines changed

iOS_SDK/OneSignalDevApp/OneSignalDevApp/Base.lproj/Main.storyboard

Lines changed: 288 additions & 246 deletions
Large diffs are not rendered by default.

iOS_SDK/OneSignalDevApp/OneSignalDevApp/SwiftTest.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,49 @@
2828
import Foundation
2929
import OneSignalFramework
3030

31+
@objc
3132
class SwiftTest: NSObject {
3233
func testSwiftUserModel() {
3334
let token1 = OneSignal.User.pushSubscription.token
3435
let token = OneSignal.User.pushSubscription.token
3536
}
37+
38+
/**
39+
Track multiple events with different properties.
40+
Properties must pass `JSONSerialization.isValidJSONObject` to be accepted.
41+
*/
42+
@objc
43+
static func trackCustomEvents() {
44+
print("Dev App: track an event with nil properties")
45+
OneSignal.User.trackEvent(name: "null properties", properties: nil)
46+
47+
print("Dev App: track an event with empty properties")
48+
OneSignal.User.trackEvent(name: "empty properties", properties: [:])
49+
50+
let formatter = DateFormatter()
51+
formatter.dateStyle = .short
52+
53+
let mixedTypes = [
54+
"string": "somestring",
55+
"number": 5,
56+
"bool": false,
57+
"dateStr": formatter.string(from: Date())
58+
] as [String: Any]
59+
60+
let nestedDict = [
61+
"someDict": mixedTypes,
62+
"anotherDict": [
63+
"foo": "bar",
64+
"booleanVal": true,
65+
"float": Float("3.14")!
66+
]
67+
]
68+
let invalidProperties = ["date": Date()]
69+
70+
print("Dev App: track an event with a valid nested dictionary")
71+
OneSignal.User.trackEvent(name: "nested dictionary", properties: nestedDict)
72+
73+
print("Dev App: track an event with invalid dictionary types")
74+
OneSignal.User.trackEvent(name: "invalid dictionary", properties: invalidProperties)
75+
}
3676
}

iOS_SDK/OneSignalDevApp/OneSignalDevApp/ViewController.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
@property (weak, nonatomic) IBOutlet UITextField *activityId;
7979

8080
@property (weak, nonatomic) IBOutlet UITextField *languageTextField;
81+
@property (weak, nonatomic) IBOutlet UITextField *customEventsTextField;
8182

8283
@end
8384

iOS_SDK/OneSignalDevApp/OneSignalDevApp/ViewController.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,4 +277,21 @@ - (IBAction)dontRequireConsent:(id)sender {
277277
[OneSignal setConsentRequired:false];
278278
}
279279

280+
- (IBAction)trackCustomEvents:(id)sender {
281+
NSLog(@"Dev App: tracking some preset custom events");
282+
[OneSignal.User trackEventWithName:@"simple event" properties:@{@"foobarbaz": @"foobarbaz"}];
283+
NSMutableDictionary *dict = [NSMutableDictionary new];
284+
dict[@"dict"] = @{@"abc" : @"def"};
285+
dict[@"false"] = false;
286+
dict[@"int"] = @99;
287+
[OneSignal.User trackEventWithName:@"complex event" properties:dict];
288+
[SwiftTest trackCustomEvents];
289+
}
290+
291+
- (IBAction)trackNamedCustomEvent:(id)sender {
292+
NSString *name = self.customEventsTextField.text;
293+
NSLog(@"Dev App: Tracking custom event with name: %@", name);
294+
[OneSignal.User trackEventWithName:name properties:nil];
295+
}
296+
280297
@end

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
3C6299A92BEEA46C00649187 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C6299A82BEEA46C00649187 /* PrivacyInfo.xcprivacy */; };
9494
3C6299AB2BEEA4C000649187 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C6299AA2BEEA4C000649187 /* PrivacyInfo.xcprivacy */; };
9595
3C67F77A2BEB2B710085A0F0 /* SwitchUserIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C67F7792BEB2B710085A0F0 /* SwitchUserIntegrationTests.swift */; };
96+
3C68EFE52D93195E00F0896B /* OSCustomEventsExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C68EFE42D93195E00F0896B /* OSCustomEventsExecutor.swift */; };
97+
3C68EFE72D931BA600F0896B /* OSRequestCustomEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C68EFE62D931BA600F0896B /* OSRequestCustomEvents.swift */; };
9698
3C70FA672D0B68A100031066 /* OneSignalClientError.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C70FA652D0B68A100031066 /* OneSignalClientError.h */; settings = {ATTRIBUTES = (Public, ); }; };
9799
3C70FA682D0B68A100031066 /* OneSignalClientError.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C70FA662D0B68A100031066 /* OneSignalClientError.m */; };
98100
3C789DBD293C2206004CF83D /* OSFocusInfluenceParam.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A600B432453790700514A53 /* OSFocusInfluenceParam.m */; };
@@ -1269,6 +1271,8 @@
12691271
3C6299A82BEEA46C00649187 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
12701272
3C6299AA2BEEA4C000649187 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
12711273
3C67F7792BEB2B710085A0F0 /* SwitchUserIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchUserIntegrationTests.swift; sourceTree = "<group>"; };
1274+
3C68EFE42D93195E00F0896B /* OSCustomEventsExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSCustomEventsExecutor.swift; sourceTree = "<group>"; };
1275+
3C68EFE62D931BA600F0896B /* OSRequestCustomEvents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSRequestCustomEvents.swift; sourceTree = "<group>"; };
12721276
3C70FA652D0B68A100031066 /* OneSignalClientError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalClientError.h; sourceTree = "<group>"; };
12731277
3C70FA662D0B68A100031066 /* OneSignalClientError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalClientError.m; sourceTree = "<group>"; };
12741278
3C7A39D42B7C18EE0082665E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
@@ -2144,6 +2148,7 @@
21442148
isa = PBXGroup;
21452149
children = (
21462150
3C8E6E0028AC0BA10031E48A /* OSIdentityOperationExecutor.swift */,
2151+
3C68EFE42D93195E00F0896B /* OSCustomEventsExecutor.swift */,
21472152
3C8E6DFE28AB09AE0031E48A /* OSPropertyOperationExecutor.swift */,
21482153
3CE795FA28DBDCE700736BD4 /* OSSubscriptionOperationExecutor.swift */,
21492154
3C9AD6BB2B2285FB00BC1540 /* OSUserExecutor.swift */,
@@ -2166,6 +2171,7 @@
21662171
3C9AD6C62B228A9800BC1540 /* OSRequestTransferSubscription.swift */,
21672172
3C9AD6C02B22886600BC1540 /* OSRequestUpdateSubscription.swift */,
21682173
3C9AD6C42B228A7300BC1540 /* OSRequestDeleteSubscription.swift */,
2174+
3C68EFE62D931BA600F0896B /* OSRequestCustomEvents.swift */,
21692175
);
21702176
path = Requests;
21712177
sourceTree = "<group>";
@@ -4401,8 +4407,10 @@
44014407
3C277D7E2BD76E0000857606 /* OSIdentityModelRepo.swift in Sources */,
44024408
3CEE90A72BFE6ABD00B0FB5B /* OSPropertiesSupportedProperty.swift in Sources */,
44034409
3C9AD6C12B22886600BC1540 /* OSRequestUpdateSubscription.swift in Sources */,
4410+
3C68EFE72D931BA600F0896B /* OSRequestCustomEvents.swift in Sources */,
44044411
3C0EF49E28A1DBCB00E5434B /* OSUserInternalImpl.swift in Sources */,
44054412
3C8E6DFF28AB09AE0031E48A /* OSPropertyOperationExecutor.swift in Sources */,
4413+
3C68EFE52D93195E00F0896B /* OSCustomEventsExecutor.swift in Sources */,
44064414
3C9AD6CB2B228B5200BC1540 /* OSRequestIdentifyUser.swift in Sources */,
44074415
3C9AD6BC2B2285FB00BC1540 /* OSUserExecutor.swift in Sources */,
44084416
3C9AD6C32B22887700BC1540 /* OSRequestCreateUser.swift in Sources */,

iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OneSignalClientError.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,8 @@ - (instancetype)initWithCode:(NSInteger)code message:(NSString* _Nonnull)message
4646
return self;
4747
}
4848

49+
- (NSString *)description {
50+
return [NSString stringWithFormat:@"<OneSignalClientError code: %ld, message: %@, response: %@, underlyingError: %@ >", (long)_code, _message, _response, _underlyingError];
51+
}
52+
4953
@end

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ typedef enum {ATTRIBUTED, NOT_ATTRIBUTED} FocusAttributionState;
205205
#define IDENTITY_EXECUTOR_BACKGROUND_TASK @"IDENTITY_EXECUTOR_BACKGROUND_TASK_"
206206
#define PROPERTIES_EXECUTOR_BACKGROUND_TASK @"PROPERTIES_EXECUTOR_BACKGROUND_TASK_"
207207
#define SUBSCRIPTION_EXECUTOR_BACKGROUND_TASK @"SUBSCRIPTION_EXECUTOR_BACKGROUND_TASK_"
208+
#define CUSTOM_EVENTS_EXECUTOR_BACKGROUND_TASK @"CUSTOM_EVENTS_EXECUTOR_BACKGROUND_TASK_"
208209

209210
// OneSignal constants
210211
#define OS_PUSH @"push"
@@ -339,6 +340,8 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP
339340
#define OS_REMOVE_SUBSCRIPTION_DELTA @"OS_REMOVE_SUBSCRIPTION_DELTA"
340341
#define OS_UPDATE_SUBSCRIPTION_DELTA @"OS_UPDATE_SUBSCRIPTION_DELTA"
341342

343+
#define OS_CUSTOM_EVENT_DELTA @"OS_CUSTOM_EVENT_DELTA"
344+
342345
// Operation Repo
343346
#define OS_OPERATION_REPO_DELTA_QUEUE_KEY @"OS_OPERATION_REPO_DELTA_QUEUE_KEY"
344347

@@ -361,6 +364,10 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP
361364
#define OS_SUBSCRIPTION_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY"
362365
#define OS_SUBSCRIPTION_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY"
363366

367+
// Custom Events Executor
368+
#define OS_CUSTOM_EVENTS_EXECUTOR_DELTA_QUEUE_KEY @"OS_CUSTOM_EVENTS_EXECUTOR_DELTA_QUEUE_KEY"
369+
#define OS_CUSTOM_EVENTS_EXECUTOR_REQUEST_QUEUE_KEY @"OS_CUSTOM_EVENTS_EXECUTOR_REQUEST_QUEUE_KEY"
370+
364371
// Live Activies Executor
365372
#define OS_LIVE_ACTIVITIES_EXECUTOR_UPDATE_TOKENS_KEY @"OS_LIVE_ACTIVITIES_EXECUTOR_UPDATE_TOKENS_KEY"
366373
#define OS_LIVE_ACTIVITIES_EXECUTOR_START_TOKENS_KEY @"OS_LIVE_ACTIVITIES_EXECUTOR_START_TOKENS_KEY"

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationExecutor.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,8 @@ import OneSignalCore
3232
*/
3333
public protocol OSOperationExecutor {
3434
var supportedDeltas: [String] { get }
35-
var deltaQueue: [OSDelta] { get }
3635

3736
func enqueueDelta(_ delta: OSDelta)
3837
func cacheDeltaQueue()
3938
func processDeltaQueue(inBackground: Bool)
40-
41-
func processRequestQueue(inBackground: Bool)
4239
}

0 commit comments

Comments
 (0)