diff --git a/.gitignore b/.gitignore index 538870edf..73635f830 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ mapbox-gl-native.code-workspace /scripts/generate-file-lists.list /scripts/generate-shaders.list /scripts/generate-style-code.list +*.patch diff --git a/platform/darwin/filesource-files.json b/platform/darwin/filesource-files.json deleted file mode 100644 index 62043a0dc..000000000 --- a/platform/darwin/filesource-files.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "//": "This file can be edited manually and is the canonical source.", - "sources": [ - "platform/darwin/src/MGLLoggingConfiguration.mm", - "platform/darwin/src/MGLNetworkConfiguration.m", - "platform/darwin/src/http_file_source.mm", - "platform/default/src/mbgl/storage/file_source.cpp", - "platform/default/src/mbgl/storage/sqlite3.cpp" - ], - "public_headers": {}, - "private_headers": {} -} diff --git a/platform/darwin/src/MGLMapSnapshotter.mm b/platform/darwin/src/MGLMapSnapshotter.mm index 0dde94292..f3e9e7a41 100644 --- a/platform/darwin/src/MGLMapSnapshotter.mm +++ b/platform/darwin/src/MGLMapSnapshotter.mm @@ -7,7 +7,6 @@ #import #import #import -#import #import #import "MGLOfflineStorage_Private.h" diff --git a/platform/darwin/src/MGLNetworkConfiguration.m b/platform/darwin/src/MGLNetworkConfiguration.m index 0e5046e7a..926b18153 100644 --- a/platform/darwin/src/MGLNetworkConfiguration.m +++ b/platform/darwin/src/MGLNetworkConfiguration.m @@ -1,5 +1,5 @@ #import "MGLNetworkConfiguration_Private.h" - +#import "MGLNetworkIntegrationManager.h" #include static NSString * const MGLStartTime = @"start_time"; @@ -34,9 +34,18 @@ NSString * const kMGLDownloadPerformanceEvent = @"mobile.performance_trace"; _sharedManager = [[self alloc] init]; }); + [self setNativeNetworkManagerDelegateToDefault]; + return _sharedManager; } ++ (void)setNativeNetworkManagerDelegateToDefault { + // Tell core about our network integration. `delegate` here is not (yet) + // intended to be set to nil, except for testing. + [MGLNativeNetworkManager sharedManager].delegate = + MGLNetworkIntegrationManager.sharedManager; +} + - (void)setSessionConfiguration:(NSURLSessionConfiguration *)sessionConfiguration { @synchronized (self) { if (sessionConfiguration == nil) { @@ -160,3 +169,15 @@ NSString * const kMGLDownloadPerformanceEvent = @"mobile.performance_trace"; } @end + +@implementation MGLNetworkConfiguration (ForTesting) + ++ (void)testing_clearNativeNetworkManagerDelegate { + [MGLNativeNetworkManager sharedManager].delegate = nil; +} + ++ (id)testing_nativeNetworkManagerDelegate { + return [MGLNativeNetworkManager sharedManager].delegate; +} + +@end diff --git a/platform/darwin/src/MGLNetworkConfiguration_Private.h b/platform/darwin/src/MGLNetworkConfiguration_Private.h index 06f5c7d1b..d250648f5 100644 --- a/platform/darwin/src/MGLNetworkConfiguration_Private.h +++ b/platform/darwin/src/MGLNetworkConfiguration_Private.h @@ -16,10 +16,10 @@ extern NSString * const kMGLDownloadPerformanceEvent; @property (nonatomic, strong) NSMutableDictionary *events; @property (nonatomic, weak) id metricsDelegate; ++ (void)setNativeNetworkManagerDelegateToDefault; - (void)startDownloadEvent:(NSString *)urlString type:(NSString *)resourceType; - (void)stopDownloadEventForResponse:(NSURLResponse *)response; - (void)cancelDownloadEventForResponse:(NSURLResponse *)response; - @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm index 5f4ae9c83..edee54974 100644 --- a/platform/darwin/src/MGLOfflinePack.mm +++ b/platform/darwin/src/MGLOfflinePack.mm @@ -11,7 +11,7 @@ #import "NSValue+MGLAdditions.h" #include -#include +#include const MGLExceptionName MGLInvalidOfflinePackException = @"MGLInvalidOfflinePackException"; @@ -59,7 +59,7 @@ private: @implementation MGLOfflinePack { BOOL _isSuspending; - std::shared_ptr _mbglFileSource; + std::shared_ptr _mbglDatabaseFileSource; } - (instancetype)init { @@ -76,8 +76,8 @@ private: _mbglOfflineRegion = region; _state = MGLOfflinePackStateUnknown; - _mbglFileSource = [[MGLOfflineStorage sharedOfflineStorage] mbglFileSource]; - _mbglFileSource->setOfflineRegionObserver(*_mbglOfflineRegion, std::make_unique(self)); + _mbglDatabaseFileSource = [[MGLOfflineStorage sharedOfflineStorage] mbglDatabaseFileSource]; + _mbglDatabaseFileSource->setOfflineRegionObserver(*_mbglOfflineRegion, std::make_unique(self)); } return self; } @@ -117,7 +117,7 @@ private: self.state = MGLOfflinePackStateActive; - _mbglFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Active); + _mbglDatabaseFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Active); } - (void)suspend { @@ -129,7 +129,7 @@ private: _isSuspending = YES; } - _mbglFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Inactive); + _mbglDatabaseFileSource->setOfflineRegionDownloadState(*_mbglOfflineRegion, mbgl::OfflineRegionDownloadState::Inactive); } - (void)invalidate { @@ -140,7 +140,7 @@ private: @synchronized (self) { self.state = MGLOfflinePackStateInvalid; if (self.mbglOfflineRegion) { - _mbglFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr); + _mbglDatabaseFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr); } self.mbglOfflineRegion = nil; } @@ -169,7 +169,7 @@ private: MGLAssertOfflinePackIsValid(); __weak MGLOfflinePack *weakSelf = self; - _mbglFileSource->getOfflineRegionStatus(*_mbglOfflineRegion, [&, weakSelf](mbgl::expected status) { + _mbglDatabaseFileSource->getOfflineRegionStatus(*_mbglOfflineRegion, [&, weakSelf](mbgl::expected status) { if (status) { mbgl::OfflineRegionStatus checkedStatus = *status; dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index f6634a739..d80822c13 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -11,6 +11,7 @@ #import "NSValue+MGLAdditions.h" #import "NSDate+MGLAdditions.h" #import "MGLLoggingConfiguration_Private.h" +#import "MGLNetworkConfiguration_Private.h" #if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR #import @@ -19,7 +20,7 @@ #include #include -#include +#include #include #include #include @@ -45,13 +46,15 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio @interface MGLOfflineStorage () @property (nonatomic, strong, readwrite) NSMutableArray *packs; -@property (nonatomic) std::shared_ptr mbglFileSource; +@property (nonatomic) std::shared_ptr mbglDatabaseFileSource; +@property (nonatomic) std::shared_ptr mbglOnlineFileSource; +@property (nonatomic) std::shared_ptr mbglFileSource; @property (nonatomic) std::string mbglCachePath; @property (nonatomic, getter=isPaused) BOOL paused; @end @implementation MGLOfflineStorage { - std::unique_ptr> _mbglResourceTransform; + std::unique_ptr> _mbglResourceTransform; } + (instancetype)sharedOfflineStorage { @@ -66,6 +69,9 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio [sharedOfflineStorage reloadPacks]; }); + // Always ensure the network delegate is setup + [MGLNetworkConfiguration setNativeNetworkManagerDelegateToDefault]; + return sharedOfflineStorage; } @@ -91,7 +97,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio MGLLogDebug(@"Setting delegate: %@", newValue); _delegate = newValue; if ([self.delegate respondsToSelector:@selector(offlineStorage:URLForResourceOfKind:withURL:)]) { - _mbglResourceTransform = std::make_unique>(*mbgl::Scheduler::GetCurrent(), [offlineStorage = self](auto kind_, const std::string& url_) -> std::string { + _mbglResourceTransform = std::make_unique>(*mbgl::Scheduler::GetCurrent(), [offlineStorage = self](auto kind_, const std::string& url_, mbgl::ResourceTransform::FinishedCallback cb) { NSURL* url = [NSURL URLWithString:[[NSString alloc] initWithBytes:url_.data() length:url_.length() @@ -127,13 +133,15 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio url = [offlineStorage.delegate offlineStorage:offlineStorage URLForResourceOfKind:kind withURL:url]; - return url.absoluteString.UTF8String; + cb(url.absoluteString.UTF8String); }); - _mbglFileSource->setResourceTransform(_mbglResourceTransform->self()); + _mbglOnlineFileSource->setResourceTransform({[actorRef = _mbglResourceTransform->self()](auto kind_, const std::string& url_, mbgl::ResourceTransform::FinishedCallback cb_){ + actorRef.invoke(&mbgl::ResourceTransform::TransformCallback::operator(), kind_, url_, std::move(cb_)); + }}); } else { _mbglResourceTransform.reset(); - _mbglFileSource->setResourceTransform({}); + _mbglOnlineFileSource->setResourceTransform({}); } } @@ -204,6 +212,10 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (instancetype)init { + // Ensure network configuration & appropriate delegate prior to starting the + // run loop + [MGLNetworkConfiguration setNativeNetworkManagerDelegateToDefault]; + MGLInitializeRunLoop(); if (self = [super init]) { @@ -228,7 +240,9 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio mbgl::ResourceOptions options; options.withCachePath(_mbglCachePath) .withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String); - _mbglFileSource = std::static_pointer_cast(mbgl::FileSource::getSharedFileSource(options)); + _mbglFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, options); + _mbglOnlineFileSource = std::static_pointer_cast(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, options)); + _mbglDatabaseFileSource = std::static_pointer_cast(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, options)); // Observe for changes to the API base URL (and find out the current one). [[MGLAccountManager sharedManager] addObserver:self @@ -262,14 +276,14 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio if ([keyPath isEqualToString:@"accessToken"] && object == [MGLAccountManager sharedManager]) { NSString *accessToken = change[NSKeyValueChangeNewKey]; if (![accessToken isKindOfClass:[NSNull class]]) { - _mbglFileSource->setAccessToken(accessToken.UTF8String); + _mbglOnlineFileSource->setProperty(mbgl::ACCESS_TOKEN_KEY, accessToken.UTF8String); } } else if ([keyPath isEqualToString:@"apiBaseURL"] && object == [MGLAccountManager sharedManager]) { NSURL *apiBaseURL = change[NSKeyValueChangeNewKey]; if ([apiBaseURL isKindOfClass:[NSNull class]]) { - _mbglFileSource->setAPIBaseURL(mbgl::util::API_BASE_URL); + _mbglFileSource->setProperty(mbgl::API_BASE_URL_KEY, mbgl::util::API_BASE_URL); } else { - _mbglFileSource->setAPIBaseURL(apiBaseURL.absoluteString.UTF8String); + _mbglFileSource->setProperty(mbgl::API_BASE_URL_KEY, apiBaseURL.absoluteString.UTF8String); } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; @@ -335,7 +349,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (void)_addContentsOfFile:(NSString *)filePath withCompletionHandler:(void (^)(NSArray * _Nullable packs, NSError * _Nullable error))completion { - _mbglFileSource->mergeOfflineRegions(std::string(static_cast([filePath UTF8String])), [&, completion, filePath](mbgl::expected result) { + _mbglDatabaseFileSource->mergeOfflineRegions(std::string(static_cast([filePath UTF8String])), [&, completion, filePath](mbgl::expected result) { NSError *error; NSMutableArray *packs; if (!result) { @@ -400,7 +414,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio const mbgl::OfflineRegionDefinition regionDefinition = [(id )region offlineRegionDefinition]; mbgl::OfflineRegionMetadata metadata(context.length); [context getBytes:&metadata[0] length:metadata.size()]; - _mbglFileSource->createOfflineRegion(regionDefinition, metadata, [&, completion](mbgl::expected mbglOfflineRegion) { + _mbglDatabaseFileSource->createOfflineRegion(regionDefinition, metadata, [&, completion](mbgl::expected mbglOfflineRegion) { NSError *error; if (!mbglOfflineRegion) { NSString *errorDescription = @(mbgl::util::toString(mbglOfflineRegion.error()).c_str()); @@ -441,7 +455,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio return; } - _mbglFileSource->deleteOfflineRegion(std::move(*mbglOfflineRegion), [&, completion](std::exception_ptr exception) { + _mbglDatabaseFileSource->deleteOfflineRegion(std::move(*mbglOfflineRegion), [&, completion](std::exception_ptr exception) { NSError *error; if (exception) { error = [NSError errorWithDomain:MGLErrorDomain code:MGLErrorCodeModifyingOfflineStorageFailed userInfo:@{ @@ -468,7 +482,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio return; } - _mbglFileSource->invalidateOfflineRegion(region, [&](std::exception_ptr exception) { + _mbglDatabaseFileSource->invalidateOfflineRegion(region, [&](std::exception_ptr exception) { if (exception) { error = [NSError errorWithDomain:MGLErrorDomain code:MGLErrorCodeModifyingOfflineStorageFailed userInfo:@{ NSLocalizedDescriptionKey: @(mbgl::util::toString(exception).c_str()), @@ -496,7 +510,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (void)getPacksWithCompletionHandler:(void (^)(NSArray *packs, NSError * _Nullable error))completion { - _mbglFileSource->listOfflineRegions([&, completion](mbgl::expected result) { + _mbglDatabaseFileSource->listOfflineRegions([&, completion](mbgl::expected result) { NSError *error; NSMutableArray *packs; if (!result) { @@ -524,13 +538,13 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio - (void)setMaximumAllowedMapboxTiles:(uint64_t)maximumCount { MGLLogDebug(@"Setting maximumAllowedMapboxTiles: %lu", (unsigned long)maximumCount); - _mbglFileSource->setOfflineMapboxTileCountLimit(maximumCount); + _mbglDatabaseFileSource->setOfflineMapboxTileCountLimit(maximumCount); } #pragma mark - Ambient Cache management - (void)setMaximumAmbientCacheSize:(NSUInteger)cacheSize withCompletionHandler:(void (^)(NSError * _Nullable))completion { - _mbglFileSource->setMaximumAmbientCacheSize(cacheSize, [&, completion](std::exception_ptr exception) { + _mbglDatabaseFileSource->setMaximumAmbientCacheSize(cacheSize, [&, completion](std::exception_ptr exception) { NSError *error; if (completion) { if (exception) { @@ -549,7 +563,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (void)invalidateAmbientCacheWithCompletionHandler:(void (^)(NSError *_Nullable))completion { - _mbglFileSource->invalidateAmbientCache([&, completion](std::exception_ptr exception){ + _mbglDatabaseFileSource->invalidateAmbientCache([&, completion](std::exception_ptr exception){ NSError *error; if (completion) { if (exception) { @@ -569,7 +583,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (void)clearAmbientCacheWithCompletionHandler:(void (^)(NSError *_Nullable error))completion { - _mbglFileSource->clearAmbientCache([&, completion](std::exception_ptr exception){ + _mbglDatabaseFileSource->clearAmbientCache([&, completion](std::exception_ptr exception){ NSError *error; if (completion) { if (exception) { @@ -588,7 +602,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio } - (void)resetDatabaseWithCompletionHandler:(void (^)(NSError *_Nullable error))completion { - _mbglFileSource->resetDatabase([&, completion](std::exception_ptr exception) { + _mbglDatabaseFileSource->resetDatabase([&, completion](std::exception_ptr exception) { NSError *error; if (completion) { if (exception) { @@ -636,7 +650,7 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio response.expires = mbgl::Timestamp() + std::chrono::duration_cast(MGLDurationFromTimeInterval(expires.timeIntervalSince1970)); } - _mbglFileSource->put(resource, response); + _mbglDatabaseFileSource->put(resource, response); } - (void)putResourceWithUrl:(NSURL *)url data:(NSData *)data modified:(nullable NSDate *)modified expires:(nullable NSDate *)expires etag:(nullable NSString *)etag mustRevalidate:(BOOL)mustRevalidate { diff --git a/platform/darwin/src/MGLOfflineStorage_Private.h b/platform/darwin/src/MGLOfflineStorage_Private.h index 5ac64ea99..13bddd799 100644 --- a/platform/darwin/src/MGLOfflineStorage_Private.h +++ b/platform/darwin/src/MGLOfflineStorage_Private.h @@ -2,7 +2,8 @@ #import "MGLOfflinePack.h" -#include +#include +#include #include @@ -11,9 +12,19 @@ NS_ASSUME_NONNULL_BEGIN @interface MGLOfflineStorage (Private) /** - The shared file source object owned by the shared offline storage object. + The shared database file source object owned by the shared offline storage object. */ -@property (nonatomic) std::shared_ptr mbglFileSource; +@property (nonatomic) std::shared_ptr mbglDatabaseFileSource; + +/** + The shared online file source object owned by the shared offline storage object. + */ +@property (nonatomic) std::shared_ptr mbglOnlineFileSource; + +/** + The shared resource loader file source object owned by the shared offline storage object. + */ +@property (nonatomic) std::shared_ptr mbglFileSource; /** The shared offline cache path. diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm deleted file mode 100644 index dbf92aa46..000000000 --- a/platform/darwin/src/http_file_source.mm +++ /dev/null @@ -1,380 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -#import - -#import "MGLLoggingConfiguration_Private.h" -#import "MGLNetworkConfiguration_Private.h" - -#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR -#import "MGLAccountManager_Private.h" -#endif - -#include -#include - -@interface MBGLBundleCanary : NSObject -@end - -@implementation MBGLBundleCanary -@end - -namespace mbgl { - -// Data that is shared between the requesting thread and the thread running the completion handler. -class HTTPRequestShared { -public: - HTTPRequestShared(Response& response_, util::AsyncTask& async_) - : response(response_), - async(async_) { - } - - void notify(const Response& response_) { - std::lock_guard lock(mutex); - if (!cancelled) { - response = response_; - async.send(); - } - } - - void cancel() { - std::lock_guard lock(mutex); - cancelled = true; - } - -private: - std::mutex mutex; - bool cancelled = false; - - Response& response; - util::AsyncTask& async; -}; - -class HTTPRequest : public AsyncRequest { -public: - HTTPRequest(FileSource::Callback callback_) - : shared(std::make_shared(response, async)), - callback(callback_) { - } - - ~HTTPRequest() override { - shared->cancel(); - if (task) { - [task cancel]; - } - } - - std::shared_ptr shared; - NSURLSessionDataTask* task = nil; - -private: - FileSource::Callback callback; - Response response; - - util::AsyncTask async { [this] { - // Calling `callback` may result in deleting `this`. Copy data to temporaries first. - auto callback_ = callback; - auto response_ = response; - callback_(response_); - } }; -}; - -class HTTPFileSource::Impl { -public: - Impl() { - @autoreleasepool { - NSURLSessionConfiguration *sessionConfig = [MGLNetworkConfiguration sharedManager].sessionConfiguration; - session = [NSURLSession sessionWithConfiguration:sessionConfig]; - - userAgent = getUserAgent(); - -#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR - accountType = [[NSUserDefaults standardUserDefaults] integerForKey:MGLMapboxAccountTypeKey]; -#endif - } - } - - NSURLSession* session = nil; - NSString* userAgent = nil; - NSInteger accountType = 0; - -private: - NSString* getUserAgent() const; - NSBundle* getSDKBundle() const; -}; - -NSString *HTTPFileSource::Impl::getUserAgent() const { - NSMutableArray *userAgentComponents = [NSMutableArray array]; - - NSBundle *appBundle = [NSBundle mainBundle]; - if (appBundle) { - NSString *appName = appBundle.infoDictionary[@"CFBundleName"]; - [userAgentComponents addObject:[NSString stringWithFormat:@"%@/%@", - appName.length ? appName : appBundle.infoDictionary[@"CFBundleIdentifier"], - appBundle.infoDictionary[@"CFBundleShortVersionString"]]]; - } else { - [userAgentComponents addObject:[NSProcessInfo processInfo].processName]; - } - - NSBundle *sdkBundle = HTTPFileSource::Impl::getSDKBundle(); - if (sdkBundle) { - NSString *versionString = sdkBundle.infoDictionary[@"MGLSemanticVersionString"]; - if (!versionString) { - versionString = sdkBundle.infoDictionary[@"CFBundleShortVersionString"]; - } - if (versionString) { - [userAgentComponents addObject:[NSString stringWithFormat:@"%@/%@", - sdkBundle.infoDictionary[@"CFBundleName"], versionString]]; - } - } - - // Avoid %s here because it inserts hidden bidirectional markers on macOS when the system - // language is set to a right-to-left language. - [userAgentComponents addObject:[NSString stringWithFormat:@"MapboxGL/0.0.0 (%@)", - @(mbgl::version::revision)]]; - - NSString *systemName = @"Darwin"; -#if TARGET_OS_IPHONE - systemName = @"iOS"; -#elif TARGET_OS_MAC - systemName = @"macOS"; -#elif TARGET_OS_WATCH - systemName = @"watchOS"; -#elif TARGET_OS_TV - systemName = @"tvOS"; -#endif -#if TARGET_OS_SIMULATOR - systemName = [systemName stringByAppendingString:@" Simulator"]; -#endif - NSString *systemVersion = nil; - if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) { - NSOperatingSystemVersion osVersion = [NSProcessInfo processInfo].operatingSystemVersion; - systemVersion = [NSString stringWithFormat:@"%ld.%ld.%ld", - (long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion]; - } - if (systemVersion) { - [userAgentComponents addObject:[NSString stringWithFormat:@"%@/%@", systemName, systemVersion]]; - } - - NSString *cpu = nil; -#if TARGET_CPU_X86 - cpu = @"x86"; -#elif TARGET_CPU_X86_64 - cpu = @"x86_64"; -#elif TARGET_CPU_ARM - cpu = @"arm"; -#elif TARGET_CPU_ARM64 - cpu = @"arm64"; -#endif - if (cpu) { - [userAgentComponents addObject:[NSString stringWithFormat:@"(%@)", cpu]]; - } - - return [userAgentComponents componentsJoinedByString:@" "]; -} - -NSBundle *HTTPFileSource::Impl::getSDKBundle() const { - NSBundle *bundle = [NSBundle bundleForClass:[MBGLBundleCanary class]]; - if (bundle && ![bundle.infoDictionary[@"CFBundlePackageType"] isEqualToString:@"FMWK"]) { - // For static frameworks, the class is contained in the application bundle rather than the - // framework bundle. - bundle = [NSBundle bundleWithPath:[bundle.privateFrameworksPath - stringByAppendingPathComponent:@"Mapbox.framework"]]; - } - return bundle; -} - -HTTPFileSource::HTTPFileSource() - : impl(std::make_unique()) { -} - -HTTPFileSource::~HTTPFileSource() = default; - -MGL_EXPORT -BOOL isValidMapboxEndpoint(NSURL *url) { - return ([url.host isEqualToString:@"mapbox.com"] || - [url.host hasSuffix:@".mapbox.com"] || - [url.host isEqualToString:@"mapbox.cn"] || - [url.host hasSuffix:@".mapbox.cn"]); -} - -MGL_EXPORT -NSURL *resourceURLWithAccountType(const Resource& resource, NSInteger accountType) { - - NSURL *url = [NSURL URLWithString:@(resource.url.c_str())]; - -#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR - if (accountType == 0 && isValidMapboxEndpoint(url)) { - NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; - NSMutableArray *queryItems = [NSMutableArray array]; - - if (resource.usage == Resource::Usage::Offline) { - [queryItems addObject:[NSURLQueryItem queryItemWithName:@"offline" value:@"true"]]; - } else { - // Only add SKU token to requests not tagged as "offline" usage. - [queryItems addObject:[NSURLQueryItem queryItemWithName:@"sku" value:MGLAccountManager.skuToken]]; - } - - if (components.queryItems) { - [queryItems addObjectsFromArray:components.queryItems]; - } - - components.queryItems = queryItems; - url = components.URL; - } -#else - (void)accountType; -#endif - return url; -} - -std::unique_ptr HTTPFileSource::request(const Resource& resource, Callback callback) { - auto request = std::make_unique(callback); - auto shared = request->shared; // Explicit copy so that it also gets copied into the completion handler block below. - - @autoreleasepool { - NSURL *url = resourceURLWithAccountType(resource, impl->accountType); - MGLLogDebug(@"Requesting URI: %@", url.relativePath); - - NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; - if (resource.priorEtag) { - [req addValue:@(resource.priorEtag->c_str()) - forHTTPHeaderField:@"If-None-Match"]; - } else if (resource.priorModified) { - [req addValue:@(util::rfc1123(*resource.priorModified).c_str()) - forHTTPHeaderField:@"If-Modified-Since"]; - } - - [req addValue:impl->userAgent forHTTPHeaderField:@"User-Agent"]; - - const bool isTile = resource.kind == mbgl::Resource::Kind::Tile; - - if (isTile) { - [[MGLNetworkConfiguration sharedManager] startDownloadEvent:url.relativePath type:@"tile"]; - } - - request->task = [impl->session - dataTaskWithRequest:req - completionHandler:^(NSData* data, NSURLResponse* res, NSError* error) { - if (error && [error code] == NSURLErrorCancelled) { - [[MGLNetworkConfiguration sharedManager] cancelDownloadEventForResponse:res]; - return; - } - [[MGLNetworkConfiguration sharedManager] stopDownloadEventForResponse:res]; - Response response; - using Error = Response::Error; - - if (error) { - MGLLogError(@"Requesting: %@ failed with error: %@", res.URL.relativePath, error); - - if (data) { - response.data = - std::make_shared((const char*)[data bytes], [data length]); - } - - switch ([error code]) { - case NSURLErrorBadServerResponse: // 5xx errors - response.error = std::make_unique( - Error::Reason::Server, [[error localizedDescription] UTF8String]); - break; - - case NSURLErrorNetworkConnectionLost: - case NSURLErrorCannotFindHost: - case NSURLErrorCannotConnectToHost: - case NSURLErrorDNSLookupFailed: - case NSURLErrorNotConnectedToInternet: - case NSURLErrorInternationalRoamingOff: - case NSURLErrorCallIsActive: - case NSURLErrorDataNotAllowed: - case NSURLErrorTimedOut: - response.error = std::make_unique( - Error::Reason::Connection, [[error localizedDescription] UTF8String]); - break; - - default: - response.error = std::make_unique( - Error::Reason::Other, [[error localizedDescription] UTF8String]); - break; - } - } else if ([res isKindOfClass:[NSHTTPURLResponse class]]) { - const long responseCode = [(NSHTTPURLResponse *)res statusCode]; - MGLLogDebug(@"Requesting %@ returned responseCode: %lu", res.URL.relativePath, responseCode); - - NSDictionary *headers = [(NSHTTPURLResponse *)res allHeaderFields]; - NSString *cache_control = [headers objectForKey:@"Cache-Control"]; - if (cache_control) { - const auto cc = http::CacheControl::parse([cache_control UTF8String]); - response.expires = cc.toTimePoint(); - response.mustRevalidate = cc.mustRevalidate; - } - - NSString *expires = [headers objectForKey:@"Expires"]; - if (expires) { - response.expires = util::parseTimestamp([expires UTF8String]); - } - - NSString *last_modified = [headers objectForKey:@"Last-Modified"]; - if (last_modified) { - response.modified = util::parseTimestamp([last_modified UTF8String]); - } - - NSString *etag = [headers objectForKey:@"ETag"]; - if (etag) { - response.etag = std::string([etag UTF8String]); - } - - if (responseCode == 200) { - response.data = std::make_shared((const char *)[data bytes], [data length]); - } else if (responseCode == 204 || (responseCode == 404 && isTile)) { - response.noContent = true; - } else if (responseCode == 304) { - response.notModified = true; - } else if (responseCode == 404) { - response.error = - std::make_unique(Error::Reason::NotFound, "HTTP status code 404"); - } else if (responseCode == 429) { - // Get the standard header - optional retryAfter; - NSString *retryAfterHeader = headers[@"Retry-After"]; - if (retryAfterHeader) { - retryAfter = std::string([retryAfterHeader UTF8String]); - } - - // Fallback mapbox specific header - optional xRateLimitReset; - NSString *xReset = headers[@"x-rate-limit-reset"]; - if (xReset) { - xRateLimitReset = std::string([xReset UTF8String]); - } - - response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset)); - } else if (responseCode >= 500 && responseCode < 600) { - response.error = - std::make_unique(Error::Reason::Server, std::string{ "HTTP status code " } + - std::to_string(responseCode)); - } else { - response.error = - std::make_unique(Error::Reason::Other, std::string{ "HTTP status code " } + - std::to_string(responseCode)); - } - } else { - // This should never happen. - response.error = std::make_unique(Error::Reason::Other, - "Response class is not NSHTTPURLResponse"); - } - - shared->notify(response); - }]; - - [request->task resume]; - } - - return std::move(request); -} - -} diff --git a/platform/darwin/test/MGLOfflineStorageTests.mm b/platform/darwin/test/MGLOfflineStorageTests.mm index b44d4c51c..8f6114658 100644 --- a/platform/darwin/test/MGLOfflineStorageTests.mm +++ b/platform/darwin/test/MGLOfflineStorageTests.mm @@ -6,6 +6,7 @@ #import "NSDate+MGLAdditions.h" #import "MGLTestAssertionHandler.h" +#include #include #pragma clang diagnostic ignored "-Wshadow" diff --git a/platform/darwin/test/MGLResourceTests.mm b/platform/darwin/test/MGLResourceTests.mm index fcd44b6b7..245368241 100644 --- a/platform/darwin/test/MGLResourceTests.mm +++ b/platform/darwin/test/MGLResourceTests.mm @@ -73,13 +73,12 @@ namespace mbgl { for (NSURLQueryItem *item in components.queryItems) { if (([item.name isEqualToString:@"offline"] && [item.value isEqualToString:@"true"]) || ([item.name isEqualToString:@"a"] && [item.value isEqualToString:@"one"]) || - ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"])) { + ([item.name isEqualToString:@"b"] && [item.value isEqualToString:@"two"]) || [item.name isEqualToString:@"sku"]) { foundCount++; } - XCTAssertFalse([item.name isEqualToString:@"sku"]); } - XCTAssert(foundCount == 3); + XCTAssert(foundCount == 4); #else // NOTE: Currently the macOS SDK does not supply the sku or offline query parameters for (NSURLQueryItem *item in components.queryItems) { diff --git a/platform/ios/Integration Tests/MGLNetworkConfigurationIntegrationTests.mm b/platform/ios/Integration Tests/MGLNetworkConfigurationIntegrationTests.mm new file mode 100644 index 000000000..d01e8a6b8 --- /dev/null +++ b/platform/ios/Integration Tests/MGLNetworkConfigurationIntegrationTests.mm @@ -0,0 +1,84 @@ +#import +#import "MGLNetworkIntegrationManager.h" +#import "MGLNetworkConfiguration.h" +#import "MGLNetworkConfiguration_Private.h" +#import "MGLOfflineStorage_Private.h" +#import "MGLMapView.h" +#import "MGLFoundation_Private.h" + +@interface MGLNetworkConfiguration (Testing) ++ (void)testing_clearNativeNetworkManagerDelegate; ++ (id)testing_nativeNetworkManagerDelegate; +@end + +@interface MGLNetworkConfigurationIntegrationTests : XCTestCase +@end + +#define ASSERT_DELEGATE_IS_NIL() \ + XCTAssertNil([MGLNetworkConfiguration testing_nativeNetworkManagerDelegate]) + +#define ASSERT_DELEGATE_IS_NOT_NIL() \ + XCTAssertNotNil([MGLNetworkConfiguration testing_nativeNetworkManagerDelegate]) + +// NOTE: These tests are currently assumed to run in this specific order. +@implementation MGLNetworkConfigurationIntegrationTests + +- (void)setUp { + [super setUp]; + + // Reset before each test + [MGLNetworkConfiguration testing_clearNativeNetworkManagerDelegate]; +} + +- (void)test1_NativeNetworkManagerDelegateIsSet +{ + ASSERT_DELEGATE_IS_NIL(); + [MGLNetworkConfiguration setNativeNetworkManagerDelegateToDefault]; + + id delegate = [MGLNetworkConfiguration testing_nativeNetworkManagerDelegate]; + + id manager = MGL_OBJC_DYNAMIC_CAST_AS_PROTOCOL(delegate, MGLNativeNetworkDelegate); + XCTAssertNotNil(manager); + + // Expected properties + XCTAssertNotNil([manager skuToken]); + XCTAssertNotNil([manager sessionConfiguration]); +} + +- (void)test2_NativeNetworkManagerDelegateIsSetBySharedManager +{ + ASSERT_DELEGATE_IS_NIL(); + + // Just calling the shared manager is also sufficient (even though, it's a + // singleton and created with a dispatch_once, the delegate is re-set for + // each call. + [MGLNetworkConfiguration sharedManager]; + ASSERT_DELEGATE_IS_NOT_NIL(); +} + +- (void)test3_NativeNetworkManagerDelegateIsSetBySharedOfflineStorage +{ + ASSERT_DELEGATE_IS_NIL(); + + // Similar to `[MGLNetworkConfiguration sharedManager]`, + // `[MGLOfflineStorage sharedOfflineStorage]` also sets the delegate. + [MGLOfflineStorage sharedOfflineStorage]; + ASSERT_DELEGATE_IS_NOT_NIL(); +} + +- (void)test4_NativeNetworkManagerDelegateIsSetBySharedOfflineStorageASecondTime +{ + // Testing a second time... + ASSERT_DELEGATE_IS_NIL(); + [MGLOfflineStorage sharedOfflineStorage]; + ASSERT_DELEGATE_IS_NOT_NIL(); +} + +- (void)test5_NativeNetworkManagerDelegateIsSetByMapViewInit +{ + ASSERT_DELEGATE_IS_NIL(); + (void)[[MGLMapView alloc] init]; + ASSERT_DELEGATE_IS_NOT_NIL(); +} + +@end diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index 0bce32929..30d06a233 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -384,7 +384,6 @@ 9C6E282D22A9815D0056B7BE /* MGLMapboxEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6E282922A980E50056B7BE /* MGLMapboxEvents.h */; }; 9C6E282F22A9824B0056B7BE /* MGLTelemetryConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = AC518DFD201BB55A00EBC820 /* MGLTelemetryConfig.h */; }; 9C6E283022A9824F0056B7BE /* MGLMapboxEvents.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6E282922A980E50056B7BE /* MGLMapboxEvents.h */; }; - A490C46D23C688CD009AC158 /* MGLNetworkIntegrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A490C46B23C688CC009AC158 /* MGLNetworkIntegrationManager.m */; }; A4DE3DCB23038C98005B3473 /* MGLMockGestureRecognizers.h in Sources */ = {isa = PBXBuildFile; fileRef = A4DE3DCA23038A7F005B3473 /* MGLMockGestureRecognizers.h */; }; A4DE3DCC23038CCA005B3473 /* MGLMockGestureRecognizers.m in Sources */ = {isa = PBXBuildFile; fileRef = A4DE3DC823038A07005B3473 /* MGLMockGestureRecognizers.m */; }; A4F3FB1D2254865900A30170 /* missing_icon.json in Resources */ = {isa = PBXBuildFile; fileRef = A4F3FB1C2254865900A30170 /* missing_icon.json */; }; @@ -400,6 +399,11 @@ CA0FAA08237B3BC600C9F3C9 /* MapboxMobileEvents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA96299B23731199004F1330 /* MapboxMobileEvents.framework */; }; CA0FAA09237B3BEA00C9F3C9 /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA8847D21CBAF91600AB86E3 /* Mapbox.framework */; }; CA0FAA0A237B3BEA00C9F3C9 /* MapboxMobileEvents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA96299B23731199004F1330 /* MapboxMobileEvents.framework */; }; + CA17464923D81581008B7A43 /* MGLNetworkIntegrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A490C46B23C688CC009AC158 /* MGLNetworkIntegrationManager.m */; }; + CA17464A23D81587008B7A43 /* MGLNetworkIntegrationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A490C46C23C688CC009AC158 /* MGLNetworkIntegrationManager.h */; }; + CA17464B23D81589008B7A43 /* MGLNetworkIntegrationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A490C46C23C688CC009AC158 /* MGLNetworkIntegrationManager.h */; }; + CA17464C23D81595008B7A43 /* MGLNetworkIntegrationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A490C46B23C688CC009AC158 /* MGLNetworkIntegrationManager.m */; }; + CA17464E23D8A93C008B7A43 /* MGLNetworkConfigurationIntegrationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA17464D23D8A93C008B7A43 /* MGLNetworkConfigurationIntegrationTests.mm */; }; CA1B4A512099FB2200EDD491 /* MGLMapSnapshotterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CA1B4A502099FB2200EDD491 /* MGLMapSnapshotterTest.m */; }; CA4C54FE2324948100A81659 /* MGLSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA4C54FD2324948100A81659 /* MGLSourceTests.swift */; }; CA4EB8C720863487006AB465 /* MGLStyleLayerIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA4EB8C620863487006AB465 /* MGLStyleLayerIntegrationTests.m */; }; @@ -1051,6 +1055,7 @@ CA0C27952076CA50001CE5B7 /* MGLMapViewIntegrationTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLMapViewIntegrationTest.h; sourceTree = ""; }; CA0FA9BB2375EBE700C9F3C9 /* MapboxMobileEvents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MapboxMobileEvents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CA0FA9BE2375EC3200C9F3C9 /* MapboxMobileEvents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MapboxMobileEvents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CA17464D23D8A93C008B7A43 /* MGLNetworkConfigurationIntegrationTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLNetworkConfigurationIntegrationTests.mm; sourceTree = ""; }; CA1B4A502099FB2200EDD491 /* MGLMapSnapshotterTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLMapSnapshotterTest.m; sourceTree = ""; }; CA4C54FD2324948100A81659 /* MGLSourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MGLSourceTests.swift; sourceTree = ""; }; CA4EB8C620863487006AB465 /* MGLStyleLayerIntegrationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLStyleLayerIntegrationTests.m; sourceTree = ""; }; @@ -1432,6 +1437,7 @@ 077061D9215DA00E000FEF62 /* MGLTestLocationManager.m */, CA4F3BDD230F74C3008BAFEA /* MGLMapViewPendingBlockTests.m */, CA4C54FD2324948100A81659 /* MGLSourceTests.swift */, + CA17464D23D8A93C008B7A43 /* MGLNetworkConfigurationIntegrationTests.mm */, ); path = "Integration Tests"; sourceTree = ""; @@ -2299,6 +2305,7 @@ DA27C24F1CBB4C11000B0ECD /* MGLAccountManager_Private.h in Headers */, DA8847FC1CBAFA5100AB86E3 /* MGLStyle.h in Headers */, DD9BE4F71EB263C50079A3AF /* UIViewController+MGLAdditions.h in Headers */, + CA17464A23D81587008B7A43 /* MGLNetworkIntegrationManager.h in Headers */, DAF0D8131DFE0EC500B28378 /* MGLVectorTileSource_Private.h in Headers */, 354B83961D2E873E005D9406 /* MGLUserLocationAnnotationView.h in Headers */, 74CB5EC3219B282500102936 /* MGLCircleStyleLayer_Private.h in Headers */, @@ -2462,6 +2469,7 @@ 1F6A82A92138871900BA5B41 /* MGLLoggingConfiguration_Private.h in Headers */, DABFB8661CBE99E500D62B32 /* MGLPointAnnotation.h in Headers */, 96E6145A22CC169000109F14 /* MGLCompassButton.h in Headers */, + CA17464B23D81589008B7A43 /* MGLNetworkIntegrationManager.h in Headers */, 96E516E42000560B00A02306 /* MGLComputedShapeSource_Private.h in Headers */, 96E516E92000560B00A02306 /* MGLAnnotationImage_Private.h in Headers */, 96E516E52000560B00A02306 /* MGLOfflinePack_Private.h in Headers */, @@ -2958,6 +2966,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CA17464E23D8A93C008B7A43 /* MGLNetworkConfigurationIntegrationTests.mm in Sources */, CA4EB8C720863487006AB465 /* MGLStyleLayerIntegrationTests.m in Sources */, CA7766842229C11A0008DE9E /* SMCalloutView.m in Sources */, 16376B0A1FFD9DAF0000563E /* MBGLIntegrationTests.mm in Sources */, @@ -2992,7 +3001,6 @@ files = ( DA1DC9971CB6E046006E619F /* main.m in Sources */, 354B839C1D2E9B48005D9406 /* MBXUserLocationAnnotationView.m in Sources */, - A490C46D23C688CD009AC158 /* MGLNetworkIntegrationManager.m in Sources */, 965DF51120F9430500438AAC /* MBXFrameTimeGraphView.m in Sources */, DA1DC9991CB6E054006E619F /* MBXAppDelegate.m in Sources */, 6FA9341721EF372100AA9CA8 /* MBXOrnamentsViewController.m in Sources */, @@ -3088,6 +3096,7 @@ DAD165701CF41981001FF4B9 /* MGLFeature.mm in Sources */, 30E578191DAA855E0050F07E /* UIImage+MGLAdditions.mm in Sources */, 550570C622958FB400228ECF /* MGLMapView+Impl.mm in Sources */, + CA17464923D81581008B7A43 /* MGLNetworkIntegrationManager.m in Sources */, 40EDA1C11CFE0E0500D9EA68 /* MGLAnnotationContainerView.m in Sources */, DA8848541CBAFB9800AB86E3 /* MGLCompactCalloutView.m in Sources */, DA8848251CBAFA6200AB86E3 /* MGLPointAnnotation.mm in Sources */, @@ -3187,6 +3196,7 @@ DAD165711CF41981001FF4B9 /* MGLFeature.mm in Sources */, 30E5781A1DAA855E0050F07E /* UIImage+MGLAdditions.mm in Sources */, 40EDA1C21CFE0E0500D9EA68 /* MGLAnnotationContainerView.m in Sources */, + CA17464C23D81595008B7A43 /* MGLNetworkIntegrationManager.m in Sources */, 550570C722958FB400228ECF /* MGLMapView+Impl.mm in Sources */, DAA4E4291CBB730400178DFB /* NSBundle+MGLAdditions.m in Sources */, 35136D3D1D42272500C20EFD /* MGLCircleStyleLayer.mm in Sources */, @@ -3498,21 +3508,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = "Integration Tests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.mapbox.integration-tests"; @@ -3543,21 +3538,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = "Integration Tests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.mapbox.integration-tests"; @@ -3762,21 +3742,6 @@ baseConfigurationReference = CAE5AE2B2389FBF000E4A5A1 /* common.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = test/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_CFLAGS = "-fvisibility=hidden"; @@ -3816,21 +3781,6 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; GCC_C_LANGUAGE_STANDARD = gnu11; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = "Integration Tests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.mapbox.integration-tests"; @@ -3945,21 +3895,6 @@ baseConfigurationReference = CAE5AE2B2389FBF000E4A5A1 /* common.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = test/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_CFLAGS = "-fvisibility=hidden"; @@ -3987,21 +3922,6 @@ baseConfigurationReference = CAE5AE2B2389FBF000E4A5A1 /* common.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/platform/default/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/variant/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geometry.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/value/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/geojson.hpp/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/optional", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/typewrapper/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/mapbox/weak/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/rapidjson/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/mapbox-base/extras/expected-lite/include", - "$(PROJECT_DIR)/../../vendor/mapbox-gl-native/vendor/polylabel/include", - "$(PROJECT_DIR)/../../platform/darwin/include", - ); INFOPLIST_FILE = test/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; OTHER_CFLAGS = "-fvisibility=hidden"; diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 19aaada3d..d6b35c191 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -68,6 +68,7 @@ #import "MGLMapAccessibilityElement.h" #import "MGLLocationManager_Private.h" #import "MGLLoggingConfiguration_Private.h" +#import "MGLNetworkConfiguration_Private.h" #import #include @@ -452,6 +453,10 @@ public: // setup accessibility // // self.isAccessibilityElement = YES; + + // Ensure network configuration is set up + [MGLNetworkConfiguration setNativeNetworkManagerDelegateToDefault]; + self.accessibilityLabel = NSLocalizedStringWithDefaultValue(@"MAP_A11Y_LABEL", nil, nil, @"Map", @"Accessibility label"); self.accessibilityTraits = UIAccessibilityTraitAllowsDirectInteraction | UIAccessibilityTraitAdjustable; self.backgroundColor = [UIColor clearColor]; diff --git a/vendor/mapbox-gl-native b/vendor/mapbox-gl-native index 86a360534..d85ce77de 160000 --- a/vendor/mapbox-gl-native +++ b/vendor/mapbox-gl-native @@ -1 +1 @@ -Subproject commit 86a360534994cb37d3dddc53b71a2858d97419c3 +Subproject commit d85ce77deba12167f1c25a911ef81f44e35daa2a