Skip to content

Commit d469894

Browse files
committed
Fixed inner callback not firing when they are nested
* Example calling deleteTag from getTags is now fixed. * Added app_id to getTags.
1 parent 2d0552c commit d469894

File tree

2 files changed

+76
-10
lines changed

2 files changed

+76
-10
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ + (void)sendTags:(NSDictionary*)keyValuePair onSuccess:(OSResultSuccessBlock)suc
628628
// Can't send tags yet as their isn't a player_id.
629629
// tagsToSend will be sent with the POST create player call later in this case.
630630
if (self.currentSubscriptionState.userId)
631-
[self performSelector:@selector(sendTagsToServer) withObject:nil afterDelay:5];
631+
[OneSignalHelper performSelector:@selector(sendTagsToServer) onMainThreadOnObject:self withObject:nil afterDelay:5];
632632
}
633633

634634
// Called only with a delay to batch network calls.
@@ -686,11 +686,11 @@ + (void)getTags:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)fai
686686
return;
687687

688688
NSMutableURLRequest* request;
689-
request = [self.httpClient requestWithMethod:@"GET" path:[NSString stringWithFormat:@"players/%@", self.currentSubscriptionState.userId]];
689+
NSString* path = [NSString stringWithFormat:@"players/%@?app_id=%@", self.currentSubscriptionState.userId, self.app_id];
690+
request = [self.httpClient requestWithMethod:@"GET" path:path];
690691

691692
[OneSignalHelper enqueueRequest:request onSuccess:^(NSDictionary* results) {
692-
if ([results objectForKey:@"tags"] != nil)
693-
successBlock([results objectForKey:@"tags"]);
693+
successBlock([results objectForKey:@"tags"]);
694694
} onFailure:failureBlock];
695695
}
696696

iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ - (void)overridePerformSelector:(SEL)aSelector withObject:(nullable id)anArgumen
133133
selectorToRun.runOn = self;
134134
selectorToRun.selector = aSelector;
135135
selectorToRun.withObject = anArgument;
136-
[selectorsToRun addObject:selectorToRun];
136+
@synchronized(selectorsToRun) {
137+
[selectorsToRun addObject:selectorToRun];
138+
}
137139
}
138140
}
139141

@@ -142,10 +144,12 @@ - (id)overridePerformSelector:(SEL)aSelector withObject:(id)anArgument {
142144
}
143145

144146
+ (void)runPendingSelectors {
145-
for(SelectorToRun* selectorToRun in selectorsToRun)
146-
[selectorToRun.runOn performSelector:selectorToRun.selector withObject:selectorToRun.withObject];
147-
148-
[selectorsToRun removeAllObjects];
147+
@synchronized(selectorsToRun) {
148+
for(SelectorToRun* selectorToRun in selectorsToRun)
149+
[selectorToRun.runOn performSelector:selectorToRun.selector withObject:selectorToRun.withObject];
150+
151+
[selectorsToRun removeAllObjects];
152+
}
149153
}
150154

151155
@end
@@ -532,7 +536,21 @@ + (NSString*) overrideGetAppName {
532536

533537
+ (void)overrideEnqueueRequest:(NSURLRequest*)request onSuccess:(OSResultSuccessBlock)successBlock onFailure:(OSFailureBlock)failureBlock isSynchronous:(BOOL)isSynchronous {
534538
NSError *error = nil;
535-
NSDictionary *parameters = [NSJSONSerialization JSONObjectWithData:[request HTTPBody] options:0 error:&error];
539+
540+
NSLog(@"request.URL: %@", request.URL);
541+
542+
NSMutableDictionary *parameters;
543+
544+
NSData* httpData = [request HTTPBody];
545+
if (httpData)
546+
parameters = [NSJSONSerialization JSONObjectWithData:[request HTTPBody] options:0 error:&error];
547+
else {
548+
NSURLComponents *components = [NSURLComponents componentsWithString:request.URL.absoluteString];
549+
parameters = [NSMutableDictionary new];
550+
for(NSURLQueryItem *item in components.queryItems) {
551+
parameters[item.name] = item.value;
552+
}
553+
}
536554

537555
// We should always send an app_id with every request.
538556
if (!parameters[@"app_id"])
@@ -1917,6 +1935,9 @@ - (void)testSendTags {
19171935

19181936
// Make sure all 3 sets of tags where send in 1 network call.
19191937
[NSObjectOverrider runPendingSelectors];
1938+
[self runBackgroundThreads];
1939+
[NSObjectOverrider runPendingSelectors];
1940+
19201941
XCTAssertEqualObjects(lastHTTPRequset[@"tags"][@"key"], @"value");
19211942
XCTAssertEqualObjects(lastHTTPRequset[@"tags"][@"key1"], @"value1");
19221943
XCTAssertEqualObjects(lastHTTPRequset[@"tags"][@"key2"], @"value2");
@@ -1938,6 +1959,7 @@ - (void)testSendTags {
19381959
} onFailure:^(NSError *error) {}];
19391960

19401961
[NSObjectOverrider runPendingSelectors];
1962+
[self runBackgroundThreads];
19411963

19421964
XCTAssertEqualObjects(lastHTTPRequset[@"tags"][@"key10"], @"value10");
19431965
XCTAssertEqualObjects(lastHTTPRequset[@"tags"][@"key11"], @"value11");
@@ -1971,6 +1993,50 @@ - (void)testDeleteTags {
19711993
[OneSignal deleteTag:@"someKey"];
19721994
}
19731995

1996+
- (void)testGetTags {
1997+
[self initOneSignal];
1998+
[self runBackgroundThreads];
1999+
XCTAssertEqual(networkRequestCount, 1);
2000+
2001+
__block BOOL fireGetTags = false;
2002+
2003+
[OneSignal getTags:^(NSDictionary *result) {
2004+
NSLog(@"getTags success HERE");
2005+
fireGetTags = true;
2006+
} onFailure:^(NSError *error) {
2007+
NSLog(@"getTags onFailure HERE");
2008+
}];
2009+
2010+
[self runBackgroundThreads];
2011+
2012+
XCTAssertTrue(fireGetTags);
2013+
}
2014+
2015+
- (void)testGetTagsWithNestedDelete {
2016+
[self initOneSignal];
2017+
[self runBackgroundThreads];
2018+
XCTAssertEqual(networkRequestCount, 1);
2019+
2020+
__block BOOL fireDeleteTags = false;
2021+
2022+
[OneSignal getTags:^(NSDictionary *result) {
2023+
NSLog(@"getTags success HERE");
2024+
[OneSignal deleteTag:@"tag" onSuccess:^(NSDictionary *result) {
2025+
fireDeleteTags = true;
2026+
NSLog(@"deleteTag onSuccess HERE");
2027+
} onFailure:^(NSError *error) {
2028+
NSLog(@"deleteTag onFailure HERE");
2029+
}];
2030+
} onFailure:^(NSError *error) {
2031+
NSLog(@"getTags onFailure HERE");
2032+
}];
2033+
2034+
[self runBackgroundThreads];
2035+
[NSObjectOverrider runPendingSelectors];
2036+
2037+
XCTAssertTrue(fireDeleteTags);
2038+
}
2039+
19742040
- (void)testSendTagsBeforeRegisterComplete {
19752041
[self setCurrentNotificationPermissionAsUnanswered];
19762042

0 commit comments

Comments
 (0)