diff --git a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OSRequests.m b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OSRequests.m index ac8ffdbae..58ec6b52a 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OSRequests.m +++ b/iOS_SDK/OneSignalSDK/OneSignalCore/Source/API/OSRequests.m @@ -505,7 +505,10 @@ + (instancetype)withUserId:(NSString * _Nonnull)userId params[@"device_type"] = @0; request.parameters = params; request.method = POST; - request.path = [NSString stringWithFormat:@"apps/%@/live_activities/%@/token", appId, activityId]; + + NSString *urlSafeActivityId = [activityId stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]]; + + request.path = [NSString stringWithFormat:@"apps/%@/live_activities/%@/token", appId, urlSafeActivityId]; return request; } @end @@ -516,7 +519,11 @@ + (instancetype)withUserId:(NSString * _Nonnull)userId activityId:(NSString * _Nonnull)activityId { let request = [OSRequestLiveActivityExit new]; request.method = DELETE; - request.path = [NSString stringWithFormat:@"apps/%@/live_activities/%@/token/%@", appId, activityId, userId]; + + NSString *urlSafeActivityId = [activityId stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]]; + + request.path = [NSString stringWithFormat:@"apps/%@/live_activities/%@/token/%@", appId, urlSafeActivityId, userId]; + return request; } @end diff --git a/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m b/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m index 4dcc3b357..f721836d2 100644 --- a/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m +++ b/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m @@ -3532,6 +3532,61 @@ - (void)testExitLiveActivity { XCTAssertEqualObjects(OneSignalClientOverrider.lastUrl, testExitLiveActivityCorrectURL); } + +- (void)testExitLiveActivityURLUnsafeSpace { + + NSString *testAppId = @"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"; + NSString *testLiveActivityURLUnsafe = @"onesignal 01012022"; + NSString *testLiveActivityURLSafe = @"onesignal%2001012022"; + NSString *testUserId = @"1234"; + + [UnitTestCommonMethods initOneSignal_andThreadWait]; + + [OneSignal exitLiveActivity:testLiveActivityURLUnsafe + withSuccess:nil + withFailure:nil]; + + [UnitTestCommonMethods runBackgroundThreads]; + + //check to make sure the OSRequestExitLiveActivity HTTP call was made, and was formatted correctly + XCTAssertTrue([NSStringFromClass([OSRequestLiveActivityExit class]) isEqualToString:OneSignalClientOverrider.lastHTTPRequestType]); + + let testExitLiveActivityCorrectURL = [NSString stringWithFormat:@"https://api.onesignal.com/apps/%@/live_activities/%@/token/%@", + testAppId, + testLiveActivityURLSafe, + testUserId]; + + XCTAssertEqualObjects(OneSignalClientOverrider.lastUrl, testExitLiveActivityCorrectURL); + +} + +- (void)testExitLiveActivityURLUnsafeSlash { + + NSString *testAppId = @"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"; + NSString *testLiveActivityURLUnsafe = @"onesignal/01012022"; + NSString *testLiveActivityURLSafe = @"onesignal%2F01012022"; + NSString *testUserId = @"1234"; + + [UnitTestCommonMethods initOneSignal_andThreadWait]; + + [OneSignal exitLiveActivity:testLiveActivityURLUnsafe + withSuccess:nil + withFailure:nil]; + + [UnitTestCommonMethods runBackgroundThreads]; + + //check to make sure the OSRequestExitLiveActivity HTTP call was made, and was formatted correctly + XCTAssertTrue([NSStringFromClass([OSRequestLiveActivityExit class]) isEqualToString:OneSignalClientOverrider.lastHTTPRequestType]); + + let testExitLiveActivityCorrectURL = [NSString stringWithFormat:@"https://api.onesignal.com/apps/%@/live_activities/%@/token/%@", + testAppId, + testLiveActivityURLSafe, + testUserId]; + + XCTAssertEqualObjects(OneSignalClientOverrider.lastUrl, testExitLiveActivityCorrectURL); + +} + - (void)testExitLiveActivityEarly { NSString *testAppId = @"b2f7f966-d8cc-11e4-bed1-df8f05be55ba";