Adds some network delegate methods (#3917)

Co-authored-by: “Malcolm <“mtoon@atlasprogramming.com”>
This commit is contained in:
AtlasProgramming
2025-11-04 11:41:58 -05:00
committed by GitHub
parent 29428dce42
commit 467f3ca57f
8 changed files with 123 additions and 1 deletions

View File

@@ -109,6 +109,7 @@ MLN_DARWIN_OBJC_HEADERS = [
"src/NSValue+MLNAdditions.h",
"src/MLNPluginLayer.h",
"src/MLNPluginStyleLayer.h",
"src/MLNNetworkResponse.h",
]
MLN_DARWIN_OBJCPP_HEADERS = [
@@ -224,6 +225,7 @@ MLN_DARWIN_PUBLIC_OBJCPP_SOURCE = [
"src/NSValue+MLNStyleAttributeAdditions.mm",
"src/MLNPluginLayer.mm",
"src/MLNPluginStyleLayer.mm",
"src/MLNNetworkResponse.mm",
]
MLN_DARWIN_PUBLIC_OBJCPP_CUSTOM_DRAWABLE_SOURCE = [
"src/MLNCustomDrawableStyleLayer_Private.h",

View File

@@ -12,7 +12,6 @@
#import <Foundation/Foundation.h>
#include <mbgl/interface/native_apple_interface.h>
#include <mutex>
#include <chrono>
@@ -292,11 +291,24 @@ std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource,
assert(session);
if ([networkManager.delegate respondsToSelector:@selector(willSendRequest:)]) {
req = [networkManager.delegate willSendRequest:req];
}
request->task = [session
dataTaskWithRequest:req
completionHandler:^(NSData* data, NSURLResponse* res, NSError* error) {
session = nil;
if ([networkManager.delegate respondsToSelector:@selector(didReceiveResponse:)]) {
MLNInternalNetworkResponse *networkResponse = [MLNInternalNetworkResponse responseWithData:data urlResponse:res error:error];
networkResponse = [networkManager.delegate didReceiveResponse:networkResponse];
data = networkResponse.data;
res = networkResponse.response;
error = networkResponse.error;
}
if (error && [error code] == NSURLErrorCancelled) {
[MLNNativeNetworkManager.sharedManager cancelDownloadEventForResponse:res];
return;

View File

@@ -1,6 +1,23 @@
#import <Foundation/Foundation.h>
#import <mbgl/interface/native_apple_interface.h>
@implementation MLNInternalNetworkResponse
+(MLNInternalNetworkResponse *)responseWithData:(NSData *)data
urlResponse:(NSURLResponse *)response
error:(NSError *)error {
MLNInternalNetworkResponse *tempResult = [[MLNInternalNetworkResponse alloc] init];
tempResult.data = data;
tempResult.response = response;
tempResult.error = error;
return tempResult;
}
@end
@implementation MLNNativeNetworkManager
static MLNNativeNetworkManager *instance = nil;

View File

@@ -4,12 +4,28 @@ NS_ASSUME_NONNULL_BEGIN
@class MLNNativeNetworkManager;
@interface MLNInternalNetworkResponse : NSObject
@property (retain, nullable) NSError *error;
@property (retain, nullable) NSData *data;
@property (retain, nullable) NSURLResponse *response;
+ (MLNInternalNetworkResponse *)responseWithData:(NSData *)data
urlResponse:(NSURLResponse *)response
error:(NSError *)error;
@end
@protocol MLNNativeNetworkDelegate <NSObject>
@optional
- (NSURLSession *)sessionForNetworkManager:(MLNNativeNetworkManager *)networkManager;
- (NSMutableURLRequest *)willSendRequest:(NSMutableURLRequest *)request;
- (MLNInternalNetworkResponse *)didReceiveResponse:(MLNInternalNetworkResponse *)response;
@required
- (NSURLSessionConfiguration *)sessionConfiguration;

View File

@@ -1,6 +1,7 @@
#import <Foundation/Foundation.h>
#import "MLNFoundation.h"
#import "MLNNetworkResponse.h"
NS_ASSUME_NONNULL_BEGIN
@@ -24,6 +25,11 @@ NS_ASSUME_NONNULL_BEGIN
are not supported at this time.
*/
- (NSURLSession *)sessionForNetworkConfiguration:(MLNNetworkConfiguration *)configuration;
- (NSMutableURLRequest *)willSendRequest:(NSMutableURLRequest *)request;
- (MLNNetworkResponse *)didReceiveResponse:(MLNNetworkResponse *)response;
@end
/**

View File

@@ -87,6 +87,39 @@ NSString * const kMLNDownloadPerformanceEvent = @"mobile.performance_trace";
return session;
}
- (NSMutableURLRequest *)willSendRequest:(NSMutableURLRequest *)request {
if ([self.delegate respondsToSelector:@selector(willSendRequest:)]) {
return [self.delegate willSendRequest:request];
}
return request;
}
- (MLNInternalNetworkResponse *)didReceiveResponse:(MLNInternalNetworkResponse *)response {
if ([self.delegate respondsToSelector:@selector(didReceiveResponse:)]) {
MLNNetworkResponse *tempResponse = [MLNNetworkResponse responseWithData:response.data
urlResponse:response.response
error:response.error];
if (tempResponse) {
MLNInternalNetworkResponse *internalResponse = [MLNInternalNetworkResponse responseWithData:tempResponse.data
urlResponse:tempResponse.response
error:tempResponse.error];
return internalResponse;
} else {
return nil;
}
}
return response;
}
- (NSURLSessionConfiguration *)sessionConfiguration {
NSURLSessionConfiguration *sessionConfig = nil;
@synchronized (self) {

View File

@@ -0,0 +1,19 @@
#import <Foundation/Foundation.h>
#import "MLNFoundation.h"
NS_ASSUME_NONNULL_BEGIN
MLN_EXPORT
@interface MLNNetworkResponse : NSObject
@property (retain, nullable) NSError *error;
@property (retain, nullable) NSData *data;
@property (retain, nullable) NSURLResponse *response;
+ (MLNNetworkResponse *)responseWithData:(NSData *)data
urlResponse:(NSURLResponse *)response
error:(NSError *)error;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,17 @@
#import <Foundation/Foundation.h>
#import "MLNNetworkResponse.h"
@implementation MLNNetworkResponse
+(MLNNetworkResponse *)responseWithData:(NSData *)data
urlResponse:(NSURLResponse *)response
error:(NSError *)error {
MLNNetworkResponse *tempResult = [[MLNNetworkResponse alloc] init];
tempResult.data = data;
tempResult.response = response;
tempResult.error = error;
return tempResult;
}
@end