Skip to content

Commit be65c89

Browse files
authored
Merge pull request #1290 from OneSignal/5.0.0/create_user_error
[5.0.0] Allow the SDK the chance to recover from failed Create User
2 parents 7d7f13d + c2a9be3 commit be65c89

20 files changed

+283
-129
lines changed

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,13 @@ typedef enum {ATTRIBUTED, NOT_ATTRIBUTED} FocusAttributionState;
184184
#define focusAttributionStateString(enum) [@[@"ATTRIBUTED", @"NOT_ATTRIBUTED"] objectAtIndex:enum]
185185

186186
// OneSignal Background Task Identifiers
187-
#define ATTRIBUTED_FOCUS_TASK @"ATTRIBUTED_FOCUS_TASK"
188-
#define UNATTRIBUTED_FOCUS_TASK @"UNATTRIBUTED_FOCUS_TASK"
189-
#define USER_MANAGER_BACKGROUND_TASK @"USER_MANAGER_BACKGROUND_TASK"
187+
#define ATTRIBUTED_FOCUS_TASK @"ATTRIBUTED_FOCUS_TASK"
188+
#define UNATTRIBUTED_FOCUS_TASK @"UNATTRIBUTED_FOCUS_TASK"
189+
#define SEND_SESSION_TIME_TO_USER_TASK @"SEND_SESSION_TIME_TO_USER_TASK"
190+
#define OPERATION_REPO_BACKGROUND_TASK @"OPERATION_REPO_BACKGROUND_TASK"
191+
#define IDENTITY_EXECUTOR_BACKGROUND_TASK @"IDENTITY_EXECUTOR_BACKGROUND_TASK_"
192+
#define PROPERTIES_EXECUTOR_BACKGROUND_TASK @"PROPERTIES_EXECUTOR_BACKGROUND_TASK_"
193+
#define SUBSCRIPTION_EXECUTOR_BACKGROUND_TASK @"SUBSCRIPTION_EXECUTOR_BACKGROUND_TASK_"
190194

191195
// OneSignal constants
192196
#define OS_PUSH @"push"

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ - (void)presentInAppPreviewMessage:(OSInAppMessageInternal *)message {
448448
- (void)displayMessage:(OSInAppMessageInternal *)message {
449449
// Check if the app disabled IAMs for this device before showing an IAM
450450
if (_isInAppMessagingPaused && !message.isPreview) {
451+
[self cleanUpInAppWindow];
451452
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"In app messages will not show while paused"];
452453
return;
453454
}
@@ -749,6 +750,19 @@ - (void)messageViewControllerWasDismissed:(OSInAppMessageInternal *)message disp
749750
}
750751
}
751752

753+
- (void)cleanUpInAppWindow {
754+
self.viewController = nil;
755+
if (self.window) {
756+
/*
757+
Hide the top level IAM window
758+
After the IAM window is hidden, iOS will automatically promote the main window
759+
This also re-shows the keyboard automatically if it had focus in a text input
760+
*/
761+
self.window.hidden = true;
762+
self.window = nil;
763+
}
764+
}
765+
752766
- (void)setAndPersistTimeSinceLastMessage {
753767
NSDate *timeSinceLastMessage = [NSDate new];
754768
[self.triggerController timeSinceLastMessage:timeSinceLastMessage];
@@ -768,21 +782,12 @@ - (void)evaluateMessageDisplayQueue {
768782
[self displayMessage:self.messageDisplayQueue.firstObject];
769783
return;
770784
} else {
771-
[self hideWindow];
785+
[self cleanUpInAppWindow];
772786
// Evaulate any IAMs (could be new IAM or added trigger conditions)
773787
[self evaluateMessages];
774788
}
775789
}
776790

777-
/*
778-
Hide the top level IAM window
779-
After the IAM window is hidden, iOS will automatically promote the main window
780-
This also re-shows the keyboard automatically if it had focus in a text input
781-
*/
782-
- (void)hideWindow {
783-
self.window.hidden = true;
784-
}
785-
786791
- (void)persistInAppMessageForRedisplay:(OSInAppMessageInternal *)message {
787792
// If the IAM doesn't have the re display prop or is a preview IAM there is no need to save it
788793
if (![message.displayStats isRedisplayEnabled] || message.isPreview) {

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/UI/OSInAppMessageViewController.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,15 @@ @interface OSInAppMessageViewController ()
9595

9696
@implementation OSInAppMessageViewController
9797

98+
OSInAppMessageInternal *_dismissingMessage = nil;
99+
98100
- (instancetype _Nonnull)initWithMessage:(OSInAppMessageInternal *)inAppMessage delegate:(id<OSInAppMessageViewControllerDelegate>)delegate {
99101
if (self = [super init]) {
100102
self.message = inAppMessage;
101103
self.delegate = delegate;
102104
self.useHeightMargin = YES;
103105
self.useWidthMargin = YES;
106+
_dismissingMessage = nil;
104107
}
105108

106109
return self;
@@ -490,6 +493,10 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity {
490493
[self.delegate messageViewControllerWasDismissed:self.message displayed:NO];
491494
return;
492495
}
496+
497+
if (_dismissingMessage == self.message) {
498+
return;
499+
}
493500

494501
[self.delegate messageViewControllerWillDismiss:self.message];
495502

@@ -521,7 +528,7 @@ - (void)dismissCurrentInAppMessage:(BOOL)up withVelocity:(double)velocity {
521528
animationOption = UIViewAnimationOptionCurveEaseIn;
522529
dismissAnimationDuration = MIN_DISMISSAL_ANIMATION_DURATION;
523530
}
524-
531+
_dismissingMessage = self.message;
525532
[UIView animateWithDuration:dismissAnimationDuration delay:0.0f options:animationOption animations:^{
526533
self.view.backgroundColor = [UIColor clearColor];
527534
self.view.alpha = 0.0f;

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSEventProducer.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public class OSEventProducer<THandler>: NSObject {
3333
var subscriber: THandler?
3434

3535
public func subscribe(_ handler: THandler) {
36-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSEventProducer.subscribe() called with handler: \(handler)")
3736
// TODO: UM do we want to synchronize on subscribers
3837
subscriber = handler // TODO: UM style, implicit or explicit self?
3938
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStore.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ open class OSModelStore<TModel: OSModel>: NSObject {
8787
}
8888

8989
public func add(id: String, model: TModel, hydrating: Bool) {
90-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSModelStore add() called with model \(model)")
9190
// TODO: Check if we are adding the same model? Do we replace?
9291
// For example, calling addEmail multiple times with the same email
9392
// Check API endpoint for behavior
@@ -127,6 +126,8 @@ open class OSModelStore<TModel: OSModel>: NSObject {
127126
self.changeSubscription.fire { modelStoreListener in
128127
modelStoreListener.onRemoved(model)
129128
}
129+
} else {
130+
OneSignalLog.onesignalLog(.LL_ERROR, message: "OSModelStore cannot remove \(id) because it doesn't exist in the store.")
130131
}
131132
}
132133

@@ -151,8 +152,6 @@ open class OSModelStore<TModel: OSModel>: NSObject {
151152

152153
extension OSModelStore: OSModelChangedHandler {
153154
public func onModelUpdated(args: OSModelChangedArgs, hydrating: Bool) {
154-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSModelStore.onChanged() called with OSModelChangedArgs: \(args)")
155-
156155
// persist the changed models to storage
157156
OneSignalUserDefaults.initShared().saveCodeableData(forKey: self.storeKey, withValue: self.models)
158157

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ extension OSModelStoreListener {
5252
}
5353

5454
public func onAdded(_ model: OSModel) {
55-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSModelStoreListener.onAdded() with model \(model)")
5655
guard let addedModel = model as? Self.TModel else {
5756
// log error
5857
return
@@ -63,7 +62,6 @@ extension OSModelStoreListener {
6362
}
6463

6564
public func onUpdated(_ args: OSModelChangedArgs) {
66-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSModelStoreListener.onUpdated() with args \(args)")
6765
if let delta = getUpdateModelDelta(args) {
6866
OSOperationRepo.sharedInstance.enqueueDelta(delta)
6967
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationExecutor.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public protocol OSOperationExecutor {
3535

3636
func enqueueDelta(_ delta: OSDelta)
3737
func cacheDeltaQueue()
38-
func processDeltaQueue()
38+
func processDeltaQueue(inBackground: Bool)
3939

40-
func processRequestQueue()
40+
func processRequestQueue(inBackground: Bool)
4141
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSOperationRepo.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public class OSOperationRepo: NSObject {
4343

4444
// TODO: This should come from a config, plist, method, remote params
4545
var pollIntervalSeconds = 5
46+
public var paused = false
4647

4748
/**
4849
Initilize this Operation Repo. Read from the cache. Executors may not be available by this time.
@@ -107,13 +108,23 @@ public class OSOperationRepo: NSObject {
107108
OneSignalUserDefaults.initShared().saveCodeableData(forKey: OS_OPERATION_REPO_DELTA_QUEUE_KEY, withValue: self.deltaQueue)
108109
}
109110

110-
@objc public func flushDeltaQueue() {
111+
@objc public func flushDeltaQueue(inBackground: Bool = false) {
112+
guard !paused else {
113+
OneSignalLog.onesignalLog(.LL_DEBUG, message: "OSOperationRepo not flushing queue due to being paused")
114+
return
115+
}
116+
111117
guard !OneSignalConfigManager.shouldAwaitAppIdAndLogMissingPrivacyConsent(forMethod: nil) else {
112118
return
113119
}
120+
121+
if (inBackground) {
122+
OSBackgroundTaskManager.beginBackgroundTask(OPERATION_REPO_BACKGROUND_TASK)
123+
}
124+
114125
start()
115126
if !deltaQueue.isEmpty {
116-
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSOperationRepo flushDeltaQueue with queue: \(deltaQueue)")
127+
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSOperationRepo flushDeltaQueue in background: \(inBackground) with queue: \(deltaQueue)")
117128
}
118129

119130
var index = 0
@@ -135,7 +146,12 @@ public class OSOperationRepo: NSObject {
135146
}
136147

137148
for executor in executors {
138-
executor.processDeltaQueue()
149+
executor.processDeltaQueue(inBackground: inBackground)
150+
}
151+
152+
if (inBackground) {
153+
OSBackgroundTaskManager.endBackgroundTask(OPERATION_REPO_BACKGROUND_TASK)
139154
}
155+
140156
}
141157
}

iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
appId:(NSString * _Nonnull)appId
5353
pushSubscriptionId:(NSString * _Nonnull)pushSubscriptionId
5454
onesignalId:(NSString * _Nonnull)onesignalId
55-
influenceParams:(NSArray<OSFocusInfluenceParam *> *_Nonnull)influenceParams;
55+
influenceParams:(NSArray<OSFocusInfluenceParam *> * _Nonnull)influenceParams
56+
onSuccess:(OSResultSuccessBlock _Nonnull)successBlock
57+
onFailure:(OSFailureBlock _Nonnull)failureBlock;
5658

5759
@end

iOS_SDK/OneSignalSDK/OneSignalOutcomes/Source/OutcomeEvents/OneSignalOutcomeEventsController.m

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,22 +108,24 @@ - (void)sendSessionEndOutcomes:(NSNumber * _Nonnull)timeElapsed
108108
appId:(NSString * _Nonnull)appId
109109
pushSubscriptionId:(NSString * _Nonnull)pushSubscriptionId
110110
onesignalId:(NSString * _Nonnull)onesignalId
111-
influenceParams:(NSArray<OSFocusInfluenceParam *> * _Nonnull)influenceParams {
112-
// Don't send influenced session with time < 1 seconds
113-
if ([timeElapsed intValue] < 1) {
114-
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"sendSessionEndOutcomes not sending active time %@", timeElapsed]];
115-
return;
116-
}
117-
// TODO: What to do onSuccess and onFailure
111+
influenceParams:(NSArray<OSFocusInfluenceParam *> * _Nonnull)influenceParams
112+
onSuccess:(OSResultSuccessBlock _Nonnull)successBlock
113+
onFailure:(OSFailureBlock _Nonnull)failureBlock {
118114
[OneSignalClient.sharedClient executeRequest:[OSRequestSendSessionEndOutcomes
119115
withActiveTime:timeElapsed
120116
appId:appId
121117
pushSubscriptionId:pushSubscriptionId
122118
onesignalId:onesignalId
123119
influenceParams:influenceParams] onSuccess:^(NSDictionary *result) {
124-
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:@"sendSessionEndOutcomes attributed succeed"];
120+
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:@"OneSignalOutcomeEventsController:sendSessionEndOutcomes attributed succeed"];
121+
if (successBlock) {
122+
successBlock(result);
123+
}
125124
} onFailure:^(NSError *error) {
126-
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:@"sendSessionEndOutcomes attributed failed"];
125+
[OneSignalLog onesignalLog:ONE_S_LL_ERROR message:@"OneSignalOutcomeEventsController:sendSessionEndOutcomes attributed failed"];
126+
if (failureBlock) {
127+
failureBlock(error);
128+
}
127129
}];
128130
}
129131

0 commit comments

Comments
 (0)