Skip to content

Commit 2d391d3

Browse files
committed
Add unattributed outcomes for IAM click
* Add send outcomes and unique outcomes for button and image click * Add test for new case
1 parent 2aecd87 commit 2d391d3

17 files changed

+495
-57
lines changed
-16 KB
Binary file not shown.

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@
8989
7A72EB0F23E252C700B4D50F /* OSInAppMessageDisplayStats.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A72EB0D23E252C200B4D50F /* OSInAppMessageDisplayStats.m */; };
9090
7A72EB1023E252C700B4D50F /* OSInAppMessageDisplayStats.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A72EB0D23E252C200B4D50F /* OSInAppMessageDisplayStats.m */; };
9191
7A72EB1223E252DD00B4D50F /* OSInAppMessageDisplayStats.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A72EB1123E252D400B4D50F /* OSInAppMessageDisplayStats.h */; };
92+
7A880F2B23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A880F2A23FB45FB0081F5E8 /* OSInAppMessageOutcome.m */; };
93+
7A880F2C23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A880F2A23FB45FB0081F5E8 /* OSInAppMessageOutcome.m */; };
94+
7A880F2D23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A880F2A23FB45FB0081F5E8 /* OSInAppMessageOutcome.m */; };
9295
7A9173A2231971E5007848FA /* OneSignalReceiveReceiptsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A9173A1231971E5007848FA /* OneSignalReceiveReceiptsController.m */; };
9396
7AD8DDE7234BD3BE00747A8A /* OneSignalUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AD8DDE6234BD3BE00747A8A /* OneSignalUserDefaults.m */; };
9497
7ADE379422E8B69C00263048 /* OneSignalOutcomeEventsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ADE379322E8B69C00263048 /* OneSignalOutcomeEventsController.m */; };
@@ -404,6 +407,8 @@
404407
7A674F1A2360D82E001F9ACD /* OSBaseFocusTimeProcessor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OSBaseFocusTimeProcessor.m; sourceTree = "<group>"; };
405408
7A72EB0D23E252C200B4D50F /* OSInAppMessageDisplayStats.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OSInAppMessageDisplayStats.m; sourceTree = "<group>"; };
406409
7A72EB1123E252D400B4D50F /* OSInAppMessageDisplayStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OSInAppMessageDisplayStats.h; sourceTree = "<group>"; };
410+
7A880F2923FB45CE0081F5E8 /* OSInAppMessageOutcome.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OSInAppMessageOutcome.h; sourceTree = "<group>"; };
411+
7A880F2A23FB45FB0081F5E8 /* OSInAppMessageOutcome.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OSInAppMessageOutcome.m; sourceTree = "<group>"; };
407412
7A9173A1231971E5007848FA /* OneSignalReceiveReceiptsController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalReceiveReceiptsController.m; sourceTree = "<group>"; };
408413
7A9173A3231971F8007848FA /* OneSignalReceiveReceiptsController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalReceiveReceiptsController.h; sourceTree = "<group>"; };
409414
7AD8DDE6234BD3BE00747A8A /* OneSignalUserDefaults.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalUserDefaults.m; sourceTree = "<group>"; };
@@ -944,6 +949,8 @@
944949
CAB269DE21B2038B00F8A43C /* OSInAppMessageBridgeEvent.m */,
945950
7A72EB1123E252D400B4D50F /* OSInAppMessageDisplayStats.h */,
946951
7A72EB0D23E252C200B4D50F /* OSInAppMessageDisplayStats.m */,
952+
7A880F2923FB45CE0081F5E8 /* OSInAppMessageOutcome.h */,
953+
7A880F2A23FB45FB0081F5E8 /* OSInAppMessageOutcome.m */,
947954
);
948955
name = Model;
949956
sourceTree = "<group>";
@@ -1237,6 +1244,7 @@
12371244
912412121E73342200E41FD7 /* OneSignalAlertViewDelegate.m in Sources */,
12381245
CA36A42D208FDEFB003EFA9A /* NSURL+OneSignal.m in Sources */,
12391246
912412421E73342200E41FD7 /* UNUserNotificationCenter+OneSignal.m in Sources */,
1247+
7A880F2B23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */,
12401248
9124123A1E73342200E41FD7 /* OneSignalWebView.m in Sources */,
12411249
9D3300F523145AF3000F0A83 /* OneSignalViewHelper.m in Sources */,
12421250
9124123E1E73342200E41FD7 /* UIApplicationDelegate+OneSignal.m in Sources */,
@@ -1307,6 +1315,7 @@
13071315
912412131E73342200E41FD7 /* OneSignalAlertViewDelegate.m in Sources */,
13081316
0338566B1FBBD2270002F7C1 /* OSNotificationPayload.m in Sources */,
13091317
9DDFEEF323189C0E00EAE0BB /* OneSignalViewHelper.m in Sources */,
1318+
7A880F2C23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */,
13101319
912412431E73342200E41FD7 /* UNUserNotificationCenter+OneSignal.m in Sources */,
13111320
CA47439F2190FEA80020DC8C /* OSTrigger.m in Sources */,
13121321
9124123B1E73342200E41FD7 /* OneSignalWebView.m in Sources */,
@@ -1355,6 +1364,7 @@
13551364
7A1232B2235E1BE6002B6CE3 /* OneSignalUserDefaults.m in Sources */,
13561365
7AF8FDBD2332A5C200A19245 /* OSIndirectNotification.m in Sources */,
13571366
7AF8FDBC2332A5A600A19245 /* OSOutcomesUtils.m in Sources */,
1367+
7A880F2D23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */,
13581368
7AF8FDBB2332A58900A19245 /* OneSignalSessionManager.m in Sources */,
13591369
9D1BD9622379F41B00A064F7 /* OSOutcomeEvent.m in Sources */,
13601370
9D1BD96F237B57CA00A064F7 /* OneSignalCacheCleaner.m in Sources */,

iOS_SDK/OneSignalSDK/Source/OSInAppMessageAction.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
*/
2727

2828
#import <Foundation/Foundation.h>
29+
#import "OSInAppMessageOutcome.h"
2930
#import "OSJSONHandling.h"
3031
#import "OneSignal.h"
3132

@@ -47,6 +48,9 @@ typedef NS_ENUM(NSUInteger, OSInAppMessageActionUrlType) {
4748
// The unique identifier for this click
4849
@property (strong, nonatomic, nonnull) NSString *clickId;
4950

51+
// The outcome to send for this action
52+
@property (strong, nonatomic, nullable) NSArray<OSInAppMessageOutcome *> *outcomes;
53+
5054
// Determines where the URL is loaded, ie. app opens a webview
5155
@property (nonatomic) OSInAppMessageActionUrlType urlActionType;
5256

iOS_SDK/OneSignalSDK/Source/OSInAppMessageAction.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ + (instancetype)instanceWithJson:(NSDictionary *)json {
7070
else
7171
action.closesMessage = true; // Default behavior
7272

73+
NSMutableArray *outcomes = [NSMutableArray new];
74+
75+
if ([json[@"outcomes"] isKindOfClass:[NSArray class]]) {
76+
NSArray *outcomesString = json[@"outcomes"];
77+
78+
for (NSDictionary *outcomeJson in outcomesString) {
79+
[outcomes addObject:[OSInAppMessageOutcome instanceWithJson:outcomeJson]];
80+
}
81+
}
82+
action.outcomes = outcomes;
83+
7384
return action;
7485
}
7586

iOS_SDK/OneSignalSDK/Source/OSInAppMessageBridgeEvent.m

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ + (instancetype)instanceWithJson:(NSDictionary *)json {
7474
return instance;
7575
}
7676

77+
- (NSString *)description{
78+
return [NSString stringWithFormat:@"OSInAppMessageBridgeEvent type: %lu\nrenderingComplete: %@\nresize: %@\nuserAction: %@", (unsigned long)_type, _renderingComplete, _resize, _userAction];
79+
}
80+
7781
@end
7882

7983

@@ -95,6 +99,10 @@ + (instancetype)instanceWithJson:(NSDictionary *)json {
9599

96100
return instance;
97101
}
102+
103+
- (NSString *)description {
104+
return [NSString stringWithFormat:@"OSInAppMessageBridgeEventRenderingComplete height: %@\ndisplayLocation: %lu", _height, (unsigned long)_displayLocation];
105+
}
98106
@end
99107

100108
@implementation OSInAppMessageBridgeEventResize
@@ -110,4 +118,8 @@ + (instancetype)instanceWithJson:(NSDictionary *)json {
110118

111119
return instance;
112120
}
121+
122+
- (NSString *)description {
123+
return [NSString stringWithFormat:@"OSInAppMessageBridgeEventResize height: %@", _height];
124+
}
113125
@end
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Modified MIT License
3+
*
4+
* Copyright 2020 OneSignal
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* 1. The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* 2. All copies of substantial portions of the Software may only be used in connection
17+
* with services provided by OneSignal.
18+
*
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
#import <Foundation/Foundation.h>
29+
#import "OSJSONHandling.h"
30+
#import "OneSignal.h"
31+
32+
@interface OSInAppMessageOutcome : NSObject <OSJSONDecodable>
33+
34+
@property (strong, nonatomic, nonnull) NSString *name;
35+
@property (strong, nonatomic, nonnull) NSNumber *weight;
36+
@property (nonatomic) BOOL unique;
37+
38+
@end
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* Modified MIT License
3+
*
4+
* Copyright 2020 OneSignal
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* 1. The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* 2. All copies of substantial portions of the Software may only be used in connection
17+
* with services provided by OneSignal.
18+
*
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
#import "OSInAppMessageOutcome.h"
29+
30+
@implementation OSInAppMessageOutcome
31+
32+
+ (instancetype)instanceWithData:(NSData *)data {
33+
NSError *error;
34+
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
35+
36+
if (error || !json) {
37+
[OneSignal onesignal_Log:ONE_S_LL_ERROR message:[NSString stringWithFormat:@"Unable to decode in-app message outcome JSON: %@", error.description ?: @"No Data"]];
38+
return nil;
39+
}
40+
41+
return [self instanceWithJson:json];
42+
}
43+
44+
+ (instancetype)instanceWithJson:(NSDictionary *)json {
45+
OSInAppMessageOutcome *outcome = [OSInAppMessageOutcome new];
46+
47+
if ([json[@"name"] isKindOfClass:[NSString class]]) {
48+
outcome.name = json[@"name"];
49+
}
50+
if ([json[@"weight"] isKindOfClass:[NSNumber class]]) {
51+
outcome.weight = json[@"weight"];
52+
} else {
53+
outcome.weight = @0;
54+
}
55+
if ([json[@"unique"] isKindOfClass:[NSNumber class]]) {
56+
outcome.unique = json[@"unique"];
57+
} else {
58+
outcome.unique = NO;
59+
}
60+
61+
return outcome;
62+
}
63+
64+
+ (instancetype _Nullable)instancePreviewFromPayload:(OSNotificationPayload * _Nonnull)payload {
65+
return nil;
66+
}
67+
68+
@end

iOS_SDK/OneSignalSDK/Source/OSMessagingController.m

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
#import "OSInAppMessageAction.h"
3535
#import "OSInAppMessageController.h"
3636

37+
@interface OneSignal ()
38+
39+
+ (void)sendClickActionOutcomeWithValue:(NSString * _Nonnull)name value:(NSNumber * _Nonnull)value;
40+
+ (void)sendClickActionUniqueOutcome:(NSString * _Nonnull)name;
41+
+ (void)sendClickActionOutcome:(NSString * _Nonnull)name;
42+
43+
@end
44+
3745
@interface OSMessagingController ()
3846

3947
@property (strong, nonatomic, nullable) UIWindow *window;
@@ -465,51 +473,68 @@ - (BOOL)isClickAvailable:(OSInAppMessage *)message withClickId:(NSString *)click
465473
return ([message.displayStats isRedisplayEnabled] && [message isClickAvailable:clickId]) || ![_clickedClickIds containsObject:clickId];
466474
}
467475

468-
- (void)messageViewDidSelectAction:(OSInAppMessage *)message withAction:(OSInAppMessageAction *)action {
469-
// Assign firstClick BOOL based on message being clicked previously or not
470-
action.firstClick = [message takeActionAsUnique];
471-
472-
if (action.clickUrl)
473-
[self handleMessageActionWithURL:action];
474-
475-
if (self.actionClickBlock)
476-
self.actionClickBlock(action);
477-
476+
- (void)sendClickRESTCall:(OSInAppMessage *)message withAction:(OSInAppMessageAction *)action {
478477
let clickId = action.clickId;
479-
478+
480479
// Make sure no click tracking is performed for IAM previews
481480
// If the IAM clickId exists within the cached clickedClickIds return early so the click is not tracked
482481
// unless that click is from an IAM with redisplay
483482
// Handles body, button, or image clicks
484483
if (message.isPreview || ![self isClickAvailable:message withClickId:clickId])
485484
return;
486-
487485
// Add clickId to clickedClickIds
488486
[self.clickedClickIds addObject:clickId];
489487
// Track clickId per IAM
490488
[message addClickId:clickId];
491-
489+
492490
let metricsRequest = [OSRequestInAppMessageClicked withAppId:OneSignal.app_id
493491
withPlayerId:OneSignal.currentSubscriptionState.userId
494492
withMessageId:message.messageId
495493
forVariantId:message.variantId
496494
withAction:action];
495+
496+
[OneSignalClient.sharedClient executeRequest:metricsRequest
497+
onSuccess:^(NSDictionary *result) {
498+
NSString *successMessage = [NSString stringWithFormat:@"In App Message with id: %@, successful POST click update for click id: %@, with result: %@", message.messageId, action.clickId, result];
499+
[OneSignal onesignal_Log:ONE_S_LL_DEBUG message:successMessage];
500+
501+
// Save the updated clickedClickIds since click was tracked successfully
502+
[OneSignalUserDefaults.initStandard saveSetForKey:OS_IAM_CLICKED_SET_KEY withValue:self.clickedClickIds];
503+
}
504+
onFailure:^(NSError *error) {
505+
NSString *errorMessage = [NSString stringWithFormat:@"In App Message with id: %@, failed POST click update for click id: %@, with error: %@", message.messageId, action.clickId, error];
506+
[OneSignal onesignal_Log:ONE_S_LL_ERROR message:errorMessage];
507+
508+
// Remove clickId from local clickedClickIds since click was not tracked
509+
[self.clickedClickIds removeObject:action.clickId];
510+
}];
511+
}
512+
513+
- (void)sendOutcomes:(NSArray<OSInAppMessageOutcome *>*)outcomes {
514+
for (OSInAppMessageOutcome *outcome in outcomes) {
515+
if (outcome.unique) {
516+
[OneSignal sendClickActionUniqueOutcome:outcome.name];
517+
} else if (outcome.weight > 0) {
518+
[OneSignal sendClickActionOutcomeWithValue:outcome.name value:outcome.weight];
519+
} else {
520+
[OneSignal sendClickActionOutcome:outcome.name];
521+
}
522+
}
523+
}
524+
525+
- (void)messageViewDidSelectAction:(OSInAppMessage *)message withAction:(OSInAppMessageAction *)action {
526+
// Assign firstClick BOOL based on message being clicked previously or not
527+
action.firstClick = [message takeActionAsUnique];
497528

498-
[OneSignalClient.sharedClient executeRequest:metricsRequest
499-
onSuccess:^(NSDictionary *result) {
500-
NSString *successMessage = [NSString stringWithFormat:@"In App Message with id: %@, successful POST click update for click id: %@, with result: %@", message.messageId, action.clickId, result];
501-
[OneSignal onesignal_Log:ONE_S_LL_DEBUG message:successMessage];
502-
503-
// Save the updated clickedClickIds since click was tracked successfully
504-
[OneSignalUserDefaults.initStandard saveSetForKey:OS_IAM_CLICKED_SET_KEY withValue:self.clickedClickIds];
505-
}
506-
onFailure:^(NSError *error) {
507-
NSString *errorMessage = [NSString stringWithFormat:@"In App Message with id: %@, failed POST click update for click id: %@, with error: %@", message.messageId, action.clickId, error];
508-
[OneSignal onesignal_Log:ONE_S_LL_ERROR message:errorMessage];
509-
510-
// Remove clickId from local clickedClickIds since click was not tracked
511-
[self.clickedClickIds removeObject:action.clickId];
512-
}];
529+
if (action.clickUrl)
530+
[self handleMessageActionWithURL:action];
531+
532+
if (self.actionClickBlock)
533+
self.actionClickBlock(action);
534+
535+
[self sendClickRESTCall:message withAction:action];
536+
537+
[self sendOutcomes:action.outcomes];
513538
}
514539

515540
/*

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2610,6 +2610,19 @@ + (void)sendUniqueOutcome:(NSString * _Nonnull)name onSuccess:(OSSendOutcomeSucc
26102610
[_outcomeEventsController sendUniqueOutcomeEvent:name appId:app_id deviceType:[NSNumber numberWithInt:DEVICE_TYPE_PUSH] successBlock:success];
26112611
}
26122612

2613+
+ (void)sendClickActionUniqueOutcome:(NSString * _Nonnull)name {
2614+
// return if the user has not granted privacy permissions
2615+
if ([self shouldLogMissingPrivacyConsentErrorWithMethodName:@"sendUniqueOutcome:onSuccess:"])
2616+
return;
2617+
2618+
if (!_outcomeEventsController) {
2619+
[self onesignal_Log:ONE_S_LL_ERROR message:@"Make sure OneSignal init is called first"];
2620+
return;
2621+
}
2622+
2623+
[_outcomeEventsController sendUniqueClickOutcomeEvent:name appId:app_id deviceType:[NSNumber numberWithInt:DEVICE_TYPE_PUSH]];
2624+
}
2625+
26132626
+ (void)sendOutcomeWithValue:(NSString * _Nonnull)name value:(NSNumber * _Nonnull)value {
26142627
[self sendOutcomeWithValue:name value:value onSuccess:nil];
26152628
}
@@ -2633,6 +2646,23 @@ + (void)sendOutcomeWithValue:(NSString * _Nonnull)name value:(NSNumber * _Nonnul
26332646
[_outcomeEventsController sendOutcomeEventWithValue:name value:value appId:app_id deviceType:[NSNumber numberWithInt:DEVICE_TYPE_PUSH] successBlock:success];
26342647
}
26352648

2649+
+ (void)sendClickActionOutcomeWithValue:(NSString * _Nonnull)name value:(NSNumber * _Nonnull)value {
2650+
// return if the user has not granted privacy permissions
2651+
if ([self shouldLogMissingPrivacyConsentErrorWithMethodName:@"sendClickOutcomeWithValue:value:"])
2652+
return;
2653+
2654+
if (!_outcomeEventsController) {
2655+
[self onesignal_Log:ONE_S_LL_ERROR message:@"Make sure OneSignal init is called first"];
2656+
return;
2657+
}
2658+
2659+
[_outcomeEventsController sendClickOutcomeEventWithValue:name value:value appId:app_id deviceType:[NSNumber numberWithInt:DEVICE_TYPE_PUSH]];
2660+
}
2661+
2662+
+ (void)sendClickActionOutcome:(NSString * _Nonnull)name {
2663+
[self sendClickActionOutcomeWithValue:name value:@0];
2664+
}
2665+
26362666
+ (BOOL)isValidOutcomeEntry:(NSString * _Nonnull)name {
26372667
if (!name || [name length] == 0) {
26382668
[self onesignal_Log:ONE_S_LL_ERROR message:@"Outcome name must not be null or empty"];

0 commit comments

Comments
 (0)