From d5569f4b01ea82ebb9221ef9ed9df71ba8ba5dd9 Mon Sep 17 00:00:00 2001 From: Jason Wray Date: Wed, 17 Apr 2019 18:27:54 -0700 Subject: [PATCH] [ios] Add SKU tokens to all Mapbox requests (#14421) --- platform/darwin/src/MGLAccountManager.m | 54 +++++++++++++----- .../darwin/src/MGLAccountManager_Private.h | 13 ++++- platform/darwin/src/http_file_source.mm | 26 +++++++-- platform/ios/ios.xcodeproj/project.pbxproj | 52 ++++++++++++++++- platform/ios/sdk-files.json | 1 + platform/ios/src/MGLMapboxEvents.m | 3 + .../vendor/mapbox-accounts-ios/MBXSKUToken.h | 13 +++++ .../mapbox-accounts-ios/libmbxaccounts.a | Bin 0 -> 58936 bytes platform/ios/vendor/mapbox-events-ios | 2 +- 9 files changed, 140 insertions(+), 24 deletions(-) create mode 100644 platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h create mode 100644 platform/ios/vendor/mapbox-accounts-ios/libmbxaccounts.a diff --git a/platform/darwin/src/MGLAccountManager.m b/platform/darwin/src/MGLAccountManager.m index 63fa63488..056660532 100644 --- a/platform/darwin/src/MGLAccountManager.m +++ b/platform/darwin/src/MGLAccountManager.m @@ -1,27 +1,27 @@ #import "MGLAccountManager_Private.h" #import "NSBundle+MGLAdditions.h" + #if TARGET_OS_OSX #import "NSProcessInfo+MGLAdditions.h" #endif #if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR #import "MGLMapboxEvents.h" - -@interface MGLAccountManager () - -@property (atomic) NSString *accessToken; -@property (nonatomic) NSURL *apiBaseURL; - -@end -#else -@interface MGLAccountManager () - -@property (atomic) NSString *accessToken; -@property (nonatomic) NSURL *apiBaseURL; - -@end +#import "MBXSKUToken.h" #endif +@interface MGLAccountManager () + +@property (atomic) NSString *accessToken; +@property (nonatomic) NSURL *apiBaseURL; + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR +@property (atomic) NSString *skuToken; +@property (atomic) NSDate *skuTokenExpiration; +#endif + +@end + @implementation MGLAccountManager #pragma mark - Internal @@ -39,6 +39,10 @@ if (apiBaseURL.length && [NSURL URLWithString:apiBaseURL]) { [self setAPIBaseURL:[NSURL URLWithString:apiBaseURL]]; } + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR + self.skuToken = [MBXSKUToken skuToken]; +#endif } + (instancetype)sharedManager { @@ -93,4 +97,26 @@ return [MGLAccountManager sharedManager].apiBaseURL; } +#pragma mark - SKU Tokens + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR + ++ (void)setSkuToken:(NSString *)skuToken { + NSTimeInterval oneHour = 60 * 60; // TODO: make this const + MGLAccountManager.sharedManager.skuTokenExpiration = [NSDate dateWithTimeIntervalSinceNow:oneHour]; + + MGLAccountManager.sharedManager.skuToken = skuToken; +} + ++ (NSString *)skuToken { + return [MGLAccountManager.sharedManager isSKUTokenExpired] ? [MBXSKUToken skuToken] : MGLAccountManager.sharedManager.skuToken; +} + +- (BOOL)isSKUTokenExpired { + NSTimeInterval secondsUntilExpiration = [MGLAccountManager.sharedManager.skuTokenExpiration timeIntervalSinceDate:NSDate.date]; + return secondsUntilExpiration < 0; +} + +#endif + @end diff --git a/platform/darwin/src/MGLAccountManager_Private.h b/platform/darwin/src/MGLAccountManager_Private.h index 464463594..3fd45f1ae 100644 --- a/platform/darwin/src/MGLAccountManager_Private.h +++ b/platform/darwin/src/MGLAccountManager_Private.h @@ -1,14 +1,23 @@ #import "MGLAccountManager.h" +NS_ASSUME_NONNULL_BEGIN + @interface MGLAccountManager (Private) /// Returns the shared instance of the `MGLAccountManager` class. @property (class, nonatomic, readonly) MGLAccountManager *sharedManager; /// The current global access token. -@property (atomic) NSString *accessToken; +@property (atomic, nullable) NSString *accessToken; /// The API base URL that is used to access Mapbox resources. The default base URL is `https://api.mapbox.com`. If `nil`, the Mapbox default base API URL is in use. -@property (atomic, readwrite) NSURL *apiBaseURL; +@property (atomic, readwrite, nullable) NSURL *apiBaseURL; + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR +/// The current global SKU. +@property (class, atomic, readonly) NSString *skuToken; +#endif @end + +NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm index c26568d8b..29f8f7db6 100644 --- a/platform/darwin/src/http_file_source.mm +++ b/platform/darwin/src/http_file_source.mm @@ -7,9 +7,14 @@ #include #import + #import "MGLLoggingConfiguration_Private.h" #import "MGLNetworkConfiguration_Private.h" +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR +#import "MGLAccountManager_Private.h" +#endif + #include #include @@ -196,16 +201,25 @@ std::unique_ptr HTTPFileSource::request(const Resource& resource, auto shared = request->shared; // Explicit copy so that it also gets copied into the completion handler block below. @autoreleasepool { - NSURL* url = [NSURL URLWithString:@(resource.url.c_str())]; + NSURL *url = [NSURL URLWithString:@(resource.url.c_str())]; MGLLogDebug(@"Requesting URI: %@", url.relativePath); + +#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR if (impl->accountType == 0 && ([url.host isEqualToString:@"mapbox.com"] || [url.host hasSuffix:@".mapbox.com"])) { - NSString* absoluteString = [url.absoluteString - stringByAppendingFormat:(url.query ? @"&%@" : @"?%@"), @"events=true"]; - url = [NSURL URLWithString:absoluteString]; - } + NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; + NSArray *newQueryItems = @[ + [NSURLQueryItem queryItemWithName:@"events" value:@"true"], + [NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken] + ]; - NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:url]; + components.queryItems = components.queryItems ? [components.queryItems arrayByAddingObjectsFromArray:newQueryItems] : newQueryItems; + + url = components.URL; + } +#endif + + NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; if (resource.priorEtag) { [req addValue:@(resource.priorEtag->c_str()) forHTTPHeaderField:@"If-None-Match"]; diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index 42e30b141..9a7a0dd10 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -382,6 +382,10 @@ 967C864C210A9D3C004DF794 /* UIDevice+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 967C8649210A9D3C004DF794 /* UIDevice+MGLAdditions.h */; }; 967C864D210A9D3C004DF794 /* UIDevice+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 967C864A210A9D3C004DF794 /* UIDevice+MGLAdditions.m */; }; 967C864E210A9D3C004DF794 /* UIDevice+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 967C864A210A9D3C004DF794 /* UIDevice+MGLAdditions.m */; }; + 9680273F22653B84006BA4A1 /* MBXSKUToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 9680273E22653B84006BA4A1 /* MBXSKUToken.h */; }; + 9680274022653B84006BA4A1 /* MBXSKUToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 9680273E22653B84006BA4A1 /* MBXSKUToken.h */; }; + 9680276422655696006BA4A1 /* libmbxaccounts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9680274122653C3E006BA4A1 /* libmbxaccounts.a */; }; + 96802766226556C5006BA4A1 /* libmbxaccounts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9680274122653C3E006BA4A1 /* libmbxaccounts.a */; }; 968F36B51E4D128D003A5522 /* MGLDistanceFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3557F7AE1E1D27D300CCA5E6 /* MGLDistanceFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96E027231E57C76E004B8E66 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 96E027251E57C76E004B8E66 /* Localizable.strings */; }; 96E516DC2000547000A02306 /* MGLPolyline_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C1251FFC1AB900DB6A19 /* MGLPolyline_Private.h */; }; @@ -1067,6 +1071,8 @@ 966FCF511F3C321000F2B6DE /* MGLUserLocationHeadingArrowLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLUserLocationHeadingArrowLayer.m; sourceTree = ""; }; 967C8649210A9D3C004DF794 /* UIDevice+MGLAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIDevice+MGLAdditions.h"; sourceTree = ""; }; 967C864A210A9D3C004DF794 /* UIDevice+MGLAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+MGLAdditions.m"; sourceTree = ""; }; + 9680273E22653B84006BA4A1 /* MBXSKUToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MBXSKUToken.h; path = "../vendor/mapbox-accounts-ios/MBXSKUToken.h"; sourceTree = ""; }; + 9680274122653C3E006BA4A1 /* libmbxaccounts.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmbxaccounts.a; path = "vendor/mapbox-accounts-ios/libmbxaccounts.a"; sourceTree = SOURCE_ROOT; }; 968F36B41E4D0FC6003A5522 /* ja */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 96E027241E57C76E004B8E66 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 96E027271E57C77A004B8E66 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; @@ -1408,6 +1414,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 96802766226556C5006BA4A1 /* libmbxaccounts.a in Frameworks */, DAABF73D1CBC59BB005B1825 /* libmbgl-core.a in Frameworks */, 55D120A61F791007004B6D81 /* libmbgl-loop-darwin.a in Frameworks */, 55D120A81F79100C004B6D81 /* libmbgl-filesource.a in Frameworks */, @@ -1421,6 +1428,7 @@ buildActionMask = 2147483647; files = ( DAAE5F8720F046E60089D85B /* libmbgl-core.a in Frameworks */, + 9680276422655696006BA4A1 /* libmbxaccounts.a in Frameworks */, DAAE5F8920F047240089D85B /* libmbgl-filesource.a in Frameworks */, DAAE5F8A20F0472E0089D85B /* libmbgl-loop-darwin.a in Frameworks */, 55CF7531213ED92A00ED86C4 /* libicu.a in Frameworks */, @@ -1772,6 +1780,14 @@ name = Fixtures; sourceTree = ""; }; + 9680276322655623006BA4A1 /* Accounts */ = { + isa = PBXGroup; + children = ( + 9680273E22653B84006BA4A1 /* MBXSKUToken.h */, + ); + name = Accounts; + sourceTree = ""; + }; CA1B4A4F2099FA2800EDD491 /* Snapshotter Tests */ = { isa = PBXGroup; children = ( @@ -1871,6 +1887,7 @@ DA1DC9921CB6DF24006E619F /* Frameworks */ = { isa = PBXGroup; children = ( + 9680274122653C3E006BA4A1 /* libmbxaccounts.a */, 55CF7530213ED92A00ED86C4 /* libicu.a */, 55CF752E213ED92000ED86C4 /* libicu.a */, 55D120A91F79100C004B6D81 /* libmbgl-filesource.a */, @@ -2248,10 +2265,11 @@ DAD165851CF4D08B001FF4B9 /* Telemetry */ = { isa = PBXGroup; children = ( + 9680276322655623006BA4A1 /* Accounts */, + 40834BA11FE05CFD00C1BD0D /* Development */, AC518DFD201BB55A00EBC820 /* MGLTelemetryConfig.h */, AC518DFE201BB55A00EBC820 /* MGLTelemetryConfig.m */, 40834BA21FE05D3100C1BD0D /* Runtime */, - 40834BA11FE05CFD00C1BD0D /* Development */, ); name = Telemetry; sourceTree = ""; @@ -2368,6 +2386,7 @@ DA35A29E1CC9E94C00E826B2 /* MGLCoordinateFormatter.h in Headers */, DAF0D8181DFE6B2800B28378 /* MGLAttributionInfo_Private.h in Headers */, DAAF722B1DA903C700312FA4 /* MGLStyleValue.h in Headers */, + 9680273F22653B84006BA4A1 /* MBXSKUToken.h in Headers */, DA8847F71CBAFA5100AB86E3 /* MGLOverlay.h in Headers */, DA35A2B11CCA141D00E826B2 /* MGLCompassDirectionFormatter.h in Headers */, DA88488B1CBB037E00AB86E3 /* SMCalloutView.h in Headers */, @@ -2500,6 +2519,7 @@ 96E516E92000560B00A02306 /* MGLAnnotationImage_Private.h in Headers */, 96E516E52000560B00A02306 /* MGLOfflinePack_Private.h in Headers */, DD9BE4F91EB263D20079A3AF /* UIViewController+MGLAdditions.h in Headers */, + 9680274022653B84006BA4A1 /* MBXSKUToken.h in Headers */, DAF2571C201901E200367EF5 /* MGLHillshadeStyleLayer.h in Headers */, 74CB5EC4219B282500102936 /* MGLCircleStyleLayer_Private.h in Headers */, DABFB8621CBE99E500D62B32 /* MGLOfflinePack.h in Headers */, @@ -3714,6 +3734,11 @@ INFOPLIST_FILE = framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); LLVM_LTO = YES; OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( @@ -3747,6 +3772,11 @@ "$(mbgl_core_INCLUDE_DIRECTORIES)", "$(mbgl_filesource_INCLUDE_DIRECTORIES)", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); LLVM_LTO = YES; OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( @@ -4102,6 +4132,11 @@ INFOPLIST_FILE = framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", @@ -4145,6 +4180,11 @@ INFOPLIST_FILE = framework/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); LLVM_LTO = YES; OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( @@ -4201,6 +4241,11 @@ "$(mbgl_core_INCLUDE_DIRECTORIES)", "$(mbgl_filesource_INCLUDE_DIRECTORIES)", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", @@ -4234,6 +4279,11 @@ "$(mbgl_core_INCLUDE_DIRECTORIES)", "$(mbgl_filesource_INCLUDE_DIRECTORIES)", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/vendor/mapbox-accounts-ios", + ); LLVM_LTO = YES; OTHER_CFLAGS = "-fvisibility=hidden"; OTHER_CPLUSPLUSFLAGS = ( diff --git a/platform/ios/sdk-files.json b/platform/ios/sdk-files.json index d80a734c1..3031a87fd 100644 --- a/platform/ios/sdk-files.json +++ b/platform/ios/sdk-files.json @@ -252,6 +252,7 @@ "MGLMultiPoint_Private.h": "platform/darwin/src/MGLMultiPoint_Private.h", "UIColor+MGLAdditions.h": "platform/ios/src/UIColor+MGLAdditions.h", "MGLAttributionInfo_Private.h": "platform/darwin/src/MGLAttributionInfo_Private.h", + "MBXSKUToken.h": "platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h", "SMCalloutView.h": "platform/ios/vendor/SMCalloutView/SMCalloutView.h", "MGLOfflineRegion_Private.h": "platform/darwin/src/MGLOfflineRegion_Private.h", "MMEPinningConfigurationProvider.h": "platform/ios/vendor/mapbox-events-ios/MapboxMobileEvents/MMEPinningConfigurationProvider.h", diff --git a/platform/ios/src/MGLMapboxEvents.m b/platform/ios/src/MGLMapboxEvents.m index eabd970ed..5cbb178c2 100644 --- a/platform/ios/src/MGLMapboxEvents.m +++ b/platform/ios/src/MGLMapboxEvents.m @@ -1,4 +1,5 @@ #import "MGLMapboxEvents.h" +#import "MBXSKUToken.h" #import "NSBundle+MGLAdditions.h" static NSString * const MGLAPIClientUserAgentBase = @"mapbox-maps-ios"; @@ -142,6 +143,8 @@ static NSString * const MGLVariableGeofence = @"VariableGeofence"; if ([MGLMapboxEvents sharedInstance].baseURL) { [[MGLMapboxEvents sharedInstance] eventsManager].baseURL = [MGLMapboxEvents sharedInstance].baseURL; } + + [[MGLMapboxEvents sharedInstance] eventsManager].skuId = MBXAccountsSKUIDMaps; [self flush]; }); diff --git a/platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h b/platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h new file mode 100644 index 000000000..3a812c89a --- /dev/null +++ b/platform/ios/vendor/mapbox-accounts-ios/MBXSKUToken.h @@ -0,0 +1,13 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const MBXAccountsSKUIDMaps; + +@interface MBXSKUToken : NSObject + ++ (NSString *)skuToken; + +@end + +NS_ASSUME_NONNULL_END diff --git a/platform/ios/vendor/mapbox-accounts-ios/libmbxaccounts.a b/platform/ios/vendor/mapbox-accounts-ios/libmbxaccounts.a new file mode 100644 index 0000000000000000000000000000000000000000..1425ca733dccdbb7d21203e759b001ca99bf7293 GIT binary patch literal 58936 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
<;w*8-v7dtBO-7 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 D#*Q6= literal 0 HcmV?d00001 diff --git a/platform/ios/vendor/mapbox-events-ios b/platform/ios/vendor/mapbox-events-ios index c407e3357..021588900 160000 --- a/platform/ios/vendor/mapbox-events-ios +++ b/platform/ios/vendor/mapbox-events-ios @@ -1 +1 @@ -Subproject commit c407e33571fca955b3100d964df65a84a716ab09 +Subproject commit 021588900c1f76786a2f7f4c1c6b343aa2020d19