diff --git a/webrtc/examples/BUILD.gn b/webrtc/examples/BUILD.gn index ca4f70667f..cf0c19525a 100644 --- a/webrtc/examples/BUILD.gn +++ b/webrtc/examples/BUILD.gn @@ -192,8 +192,6 @@ if (is_ios || (is_mac && target_cpu != "x86")) { "objc/AppRTCMobile/ARDAppEngineClient.m", "objc/AppRTCMobile/ARDBitrateTracker.h", "objc/AppRTCMobile/ARDBitrateTracker.m", - "objc/AppRTCMobile/ARDCEODTURNClient.h", - "objc/AppRTCMobile/ARDCEODTURNClient.m", "objc/AppRTCMobile/ARDJoinResponse+Internal.h", "objc/AppRTCMobile/ARDJoinResponse.h", "objc/AppRTCMobile/ARDJoinResponse.m", @@ -208,7 +206,9 @@ if (is_ios || (is_mac && target_cpu != "x86")) { "objc/AppRTCMobile/ARDSignalingMessage.m", "objc/AppRTCMobile/ARDStatsBuilder.h", "objc/AppRTCMobile/ARDStatsBuilder.m", + "objc/AppRTCMobile/ARDTURNClient+Internal.h", "objc/AppRTCMobile/ARDTURNClient.h", + "objc/AppRTCMobile/ARDTURNClient.m", "objc/AppRTCMobile/ARDWebSocketChannel.h", "objc/AppRTCMobile/ARDWebSocketChannel.m", "objc/AppRTCMobile/RTCIceCandidate+JSON.h", diff --git a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m index 40a2be7cbf..ef21ab617b 100644 --- a/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m +++ b/webrtc/examples/objc/AppRTCMobile/ARDAppClient.m @@ -23,7 +23,7 @@ #import "WebRTC/RTCTracing.h" #import "ARDAppEngineClient.h" -#import "ARDCEODTURNClient.h" +#import "ARDTURNClient+Internal.h" #import "ARDJoinResponse.h" #import "ARDMessageResponse.h" #import "ARDSDPUtils.h" @@ -33,12 +33,7 @@ #import "RTCIceCandidate+JSON.h" #import "RTCSessionDescription+JSON.h" -static NSString * const kARDDefaultSTUNServerUrl = - @"stun:stun.l.google.com:19302"; -// TODO(tkchin): figure out a better username for CEOD statistics. -static NSString * const kARDTurnRequestUrl = - @"https://computeengineondemand.appspot.com" - @"/turn?username=iapprtc&key=4080218913"; +static NSString * const kARDIceServerRequestUrl = @"https://appr.tc/params"; static NSString * const kARDAppClientErrorDomain = @"ARDAppClient"; static NSInteger const kARDAppClientErrorUnknown = -1; @@ -133,21 +128,15 @@ static int const kKbpsMultiplier = 1000; @synthesize shouldUseLevelControl = _shouldUseLevelControl; - (instancetype)init { - if (self = [super init]) { - _roomServerClient = [[ARDAppEngineClient alloc] init]; - NSURL *turnRequestURL = [NSURL URLWithString:kARDTurnRequestUrl]; - _turnClient = [[ARDCEODTURNClient alloc] initWithURL:turnRequestURL]; - [self configure]; - } - return self; + return [self initWithDelegate:nil]; } - (instancetype)initWithDelegate:(id)delegate { if (self = [super init]) { _roomServerClient = [[ARDAppEngineClient alloc] init]; _delegate = delegate; - NSURL *turnRequestURL = [NSURL URLWithString:kARDTurnRequestUrl]; - _turnClient = [[ARDCEODTURNClient alloc] initWithURL:turnRequestURL]; + NSURL *turnRequestURL = [NSURL URLWithString:kARDIceServerRequestUrl]; + _turnClient = [[ARDTURNClient alloc] initWithURL:turnRequestURL]; [self configure]; } return self; @@ -176,7 +165,7 @@ static int const kKbpsMultiplier = 1000; - (void)configure { _factory = [[RTCPeerConnectionFactory alloc] init]; _messageQueue = [NSMutableArray array]; - _iceServers = [NSMutableArray arrayWithObject:[self defaultSTUNServer]]; + _iceServers = [NSMutableArray array]; _fileLogger = [[RTCFileLogger alloc] init]; [_fileLogger start]; } @@ -814,12 +803,6 @@ static int const kKbpsMultiplier = 1000; return constraints; } -- (RTCIceServer *)defaultSTUNServer { - return [[RTCIceServer alloc] initWithURLStrings:@[kARDDefaultSTUNServerUrl] - username:@"" - credential:@""]; -} - #pragma mark - Errors + (NSError *)errorForJoinResultType:(ARDJoinResultType)resultType { diff --git a/webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.m b/webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.m deleted file mode 100644 index 5be3335318..0000000000 --- a/webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.m +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2014 The WebRTC Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#import "ARDCEODTURNClient.h" - -#import "ARDUtilities.h" -#import "RTCIceServer+JSON.h" - -// TODO(tkchin): move this to a configuration object. -static NSString *kTURNOriginURLString = @"https://apprtc.appspot.com"; -static NSString *kARDCEODTURNClientErrorDomain = @"ARDCEODTURNClient"; -static NSInteger kARDCEODTURNClientErrorBadResponse = -1; - -@implementation ARDCEODTURNClient { - NSURL *_url; -} - -- (instancetype)initWithURL:(NSURL *)url { - NSParameterAssert([url absoluteString].length); - if (self = [super init]) { - _url = url; - } - return self; -} - -- (void)requestServersWithCompletionHandler: - (void (^)(NSArray *turnServers, - NSError *error))completionHandler { - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url]; - // We need to set origin because TURN provider whitelists requests based on - // origin. - [request addValue:@"Mozilla/5.0" forHTTPHeaderField:@"user-agent"]; - [request addValue:kTURNOriginURLString forHTTPHeaderField:@"origin"]; - [NSURLConnection sendAsyncRequest:request - completionHandler:^(NSURLResponse *response, - NSData *data, - NSError *error) { - NSArray *turnServers = [NSArray array]; - if (error) { - completionHandler(nil, error); - return; - } - NSDictionary *dict = [NSDictionary dictionaryWithJSONData:data]; - turnServers = @[ [RTCIceServer serverFromCEODJSONDictionary:dict] ]; - if (!turnServers) { - NSError *responseError = - [[NSError alloc] initWithDomain:kARDCEODTURNClientErrorDomain - code:kARDCEODTURNClientErrorBadResponse - userInfo:@{ - NSLocalizedDescriptionKey: @"Bad TURN response.", - }]; - completionHandler(turnServers, responseError); - return; - } - completionHandler(turnServers, nil); - }]; -} - -@end diff --git a/webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.h b/webrtc/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h similarity index 80% rename from webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.h rename to webrtc/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h index 9b136aa39c..3a579f8f7f 100644 --- a/webrtc/examples/objc/AppRTCMobile/ARDCEODTURNClient.h +++ b/webrtc/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h @@ -10,8 +10,7 @@ #import "ARDTURNClient.h" -// Requests TURN server urls from compute engine on demand. -@interface ARDCEODTURNClient : NSObject +@interface ARDTURNClient : NSObject - (instancetype)initWithURL:(NSURL *)url; diff --git a/webrtc/examples/objc/AppRTCMobile/ARDTURNClient.m b/webrtc/examples/objc/AppRTCMobile/ARDTURNClient.m new file mode 100644 index 0000000000..05f5cd9d11 --- /dev/null +++ b/webrtc/examples/objc/AppRTCMobile/ARDTURNClient.m @@ -0,0 +1,86 @@ +/* + * Copyright 2014 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#import "ARDTURNClient+Internal.h" + +#import "ARDUtilities.h" +#import "RTCIceServer+JSON.h" + +// TODO(tkchin): move this to a configuration object. +static NSString *kTURNRefererURLString = @"https://appr.tc"; +static NSString *kARDTURNClientErrorDomain = @"ARDTURNClient"; +static NSInteger kARDTURNClientErrorBadResponse = -1; + +@implementation ARDTURNClient { + NSURL *_url; +} + +- (instancetype)initWithURL:(NSURL *)url { + NSParameterAssert([url absoluteString].length); + if (self = [super init]) { + _url = url; + } + return self; +} + +- (void)requestServersWithCompletionHandler: + (void (^)(NSArray *turnServers, NSError *error))completionHandler { + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url]; + [NSURLConnection sendAsyncRequest:request + completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { + if (error) { + completionHandler(nil, error); + return; + } + NSDictionary *responseDict = [NSDictionary dictionaryWithJSONData:data]; + NSString *iceServerUrl = responseDict[@"ice_server_url"]; + [self makeTurnServerRequestToURL:[NSURL URLWithString:iceServerUrl] + WithCompletionHandler:completionHandler]; + }]; +} + +#pragma mark - Private + +- (void)makeTurnServerRequestToURL:(NSURL *)url + WithCompletionHandler:(void (^)(NSArray *turnServers, + NSError *error))completionHandler { + NSMutableURLRequest *iceServerRequest = [NSMutableURLRequest requestWithURL:url]; + iceServerRequest.HTTPMethod = @"POST"; + [iceServerRequest addValue:kTURNRefererURLString forHTTPHeaderField:@"referer"]; + [NSURLConnection sendAsyncRequest:iceServerRequest + completionHandler:^(NSURLResponse *response, + NSData *data, + NSError *error) { + if (error) { + completionHandler(nil, error); + return; + } + NSDictionary *turnResponseDict = [NSDictionary dictionaryWithJSONData:data]; + NSMutableArray *turnServers = [NSMutableArray array]; + [turnResponseDict[@"iceServers"] enumerateObjectsUsingBlock: + ^(NSDictionary *obj, NSUInteger idx, BOOL *stop){ + [turnServers addObject:[RTCIceServer serverFromJSONDictionary:obj]]; + }]; + if (!turnServers) { + NSError *responseError = + [[NSError alloc] initWithDomain:kARDTURNClientErrorDomain + code:kARDTURNClientErrorBadResponse + userInfo:@{ + NSLocalizedDescriptionKey: @"Bad TURN response.", + }]; + completionHandler(nil, responseError); + return; + } + completionHandler(turnServers, nil); + }]; +} + +@end diff --git a/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.h b/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.h index 69fb432b44..dbc702dc7e 100644 --- a/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.h +++ b/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.h @@ -13,7 +13,5 @@ @interface RTCIceServer (JSON) + (RTCIceServer *)serverFromJSONDictionary:(NSDictionary *)dictionary; -// CEOD provides different JSON, and this parses that. -+ (RTCIceServer *)serverFromCEODJSONDictionary:(NSDictionary *)dictionary; @end diff --git a/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.m b/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.m index 0bc31bb875..912b521c48 100644 --- a/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.m +++ b/webrtc/examples/objc/AppRTCMobile/RTCIceServer+JSON.m @@ -10,34 +10,15 @@ #import "RTCIceServer+JSON.h" -static NSString const *kRTCICEServerUsernameKey = @"username"; -static NSString const *kRTCICEServerPasswordKey = @"password"; -static NSString const *kRTCICEServerUrisKey = @"uris"; -static NSString const *kRTCICEServerUrlKey = @"urls"; -static NSString const *kRTCICEServerCredentialKey = @"credential"; - @implementation RTCIceServer (JSON) + (RTCIceServer *)serverFromJSONDictionary:(NSDictionary *)dictionary { - NSString *url = dictionary[kRTCICEServerUrlKey]; - NSString *username = dictionary[kRTCICEServerUsernameKey]; - NSString *credential = dictionary[kRTCICEServerCredentialKey]; - username = username ? username : @""; - credential = credential ? credential : @""; - return [[RTCIceServer alloc] initWithURLStrings:@[url] + NSArray *turnUrls = dictionary[@"urls"]; + NSString *username = dictionary[@"username"] ?: @""; + NSString *credential = dictionary[@"credential"] ?: @""; + return [[RTCIceServer alloc] initWithURLStrings:turnUrls username:username credential:credential]; } -+ (RTCIceServer *)serverFromCEODJSONDictionary:(NSDictionary *)dictionary { - NSString *username = dictionary[kRTCICEServerUsernameKey]; - NSString *password = dictionary[kRTCICEServerPasswordKey]; - NSArray *uris = dictionary[kRTCICEServerUrisKey]; - RTCIceServer *server = - [[RTCIceServer alloc] initWithURLStrings:uris - username:username - credential:password]; - return server; -} - @end