From 21bf443181d0fe74cb8a441ece276edd4606253f Mon Sep 17 00:00:00 2001 From: hakonk <2263015+hakonk@users.noreply.github.com> Date: Mon, 6 Jan 2020 18:32:27 +0100 Subject: [PATCH 1/4] =?UTF-8?q?[feat]=C2=A0Implement=20NSURLSession=20conf?= =?UTF-8?q?iguration=20provider=20in=20RCTHTTPRequestHandler=20to=20allow?= =?UTF-8?q?=20for=20configuring=20the=20NSURLSession.=20Add=20code=20that?= =?UTF-8?q?=20is=20commented=20out=20in=20AppDelegate=20for=20testing=20di?= =?UTF-8?q?fferent=20configurations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Libraries/Network/RCTHTTPRequestHandler.h | 2 + Libraries/Network/RCTHTTPRequestHandler.mm | 24 +++++++--- RNTester/Podfile.lock | 56 +++++++++++----------- RNTester/RNTester/AppDelegate.mm | 7 ++- 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/Libraries/Network/RCTHTTPRequestHandler.h b/Libraries/Network/RCTHTTPRequestHandler.h index 75b84eb1224354..b93576dc0dd2dc 100644 --- a/Libraries/Network/RCTHTTPRequestHandler.h +++ b/Libraries/Network/RCTHTTPRequestHandler.h @@ -8,6 +8,8 @@ #import #import +typedef NSURLSessionConfiguration* (^NSURLSessionConfigurationProvider)(void); +RCT_EXTERN void RCTSetCustomNSURLSessionConfigurationProvider(NSURLSessionConfigurationProvider); /** * This is the default RCTURLRequestHandler implementation for HTTP requests. */ diff --git a/Libraries/Network/RCTHTTPRequestHandler.mm b/Libraries/Network/RCTHTTPRequestHandler.mm index 274f3810f25980..f354dacc22b9c5 100644 --- a/Libraries/Network/RCTHTTPRequestHandler.mm +++ b/Libraries/Network/RCTHTTPRequestHandler.mm @@ -18,6 +18,12 @@ @interface RCTHTTPRequestHandler () @end +static NSURLSessionConfigurationProvider urlSessionConfigurationProvider; + +void RCTSetCustomNSURLSessionConfigurationProvider(NSURLSessionConfigurationProvider provider) { + urlSessionConfigurationProvider = provider; +} + @implementation RCTHTTPRequestHandler { NSMapTable *_delegates; @@ -75,14 +81,20 @@ - (NSURLSessionDataTask *)sendRequest:(NSURLRequest *)request NSOperationQueue *callbackQueue = [NSOperationQueue new]; callbackQueue.maxConcurrentOperationCount = 1; callbackQueue.underlyingQueue = [[_bridge networking] methodQueue]; - NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSessionConfiguration *configuration; // Set allowsCellularAccess to NO ONLY if key ReactNetworkForceWifiOnly exists AND its value is YES - if (useWifiOnly) { - configuration.allowsCellularAccess = ![useWifiOnly boolValue]; + if (urlSessionConfigurationProvider) { + configuration = urlSessionConfigurationProvider(); + } else { + configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + if (useWifiOnly) { + configuration.allowsCellularAccess = ![useWifiOnly boolValue]; + } + [configuration setHTTPShouldSetCookies:YES]; + [configuration setHTTPCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; + [configuration setHTTPCookieStorage:[NSHTTPCookieStorage sharedHTTPCookieStorage]]; } - [configuration setHTTPShouldSetCookies:YES]; - [configuration setHTTPCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; - [configuration setHTTPCookieStorage:[NSHTTPCookieStorage sharedHTTPCookieStorage]]; + assert(configuration != nil); _session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:callbackQueue]; diff --git a/RNTester/Podfile.lock b/RNTester/Podfile.lock index 24edf502948a6c..4f3e96f8f60893 100644 --- a/RNTester/Podfile.lock +++ b/RNTester/Podfile.lock @@ -376,34 +376,34 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2 - FBLazyVector: 9806caa151956ce2238f70bde6649a6e3468d2c2 - FBReactNativeSpec: 4612edcbf25240e05263399a484cb14bf513872c - Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51 - glog: 1f3da668190260b06b429bb211bfbee5cd790c28 - RCTRequired: f04f9813bccb37099f642722b46e879fc47c7e78 - RCTTypeSafety: a905fc5bfde67305e22588fb5178289bc8bc6be7 - React: 7b262249ab4afa1d300c9e90f50edcc2a5f72bcd - React-ART: 25a40dbfb785ceec6ca41d5bd1ec997ca8c01f17 - React-Core: 0d8d3b586d79f3b3a7abe343859892e221e04cf0 - React-CoreModules: fe786aebce0ef3bd1f3b7344006c889c9e367ce8 - React-cxxreact: 74202227dfa3cb53b7a085508822c687808d2c3f - React-jsi: f22b7604a5e7faf347a2293ac050c4ef495cb92f - React-jsiexecutor: 705bd7d9524b27ddb02f7753f35509c812a93a02 - React-jsinspector: 5a11c19a7a267ea4a54f7082ca7834470f5c3fec - React-RCTActionSheet: 83587cdb4e14b9d986058a3acec8fc1cd9815b59 - React-RCTAnimation: be8e300a12f7946ca5a53f02668c98cd3a3fc973 - React-RCTBlob: 7bf1f010265a810ebe87e7a1746eac106d4de040 - React-RCTImage: 6bc83509a99a699606275338c486bf099ae4b1a0 - React-RCTLinking: 7b77eca020eaf222d19151f0f52cd6065cbc90ec - React-RCTNetwork: 7e268503e0fa1caa692990f1213bfdadfb4a3755 - React-RCTPushNotification: 9290035bbd9ecef15f03d760cc422a219b55be07 - React-RCTSettings: ae42816d1073cb8edd70c9ab32e29810a2bbceff - React-RCTTest: 80b44b7e8f5a30d9663c921adfb22a0b185e69f4 - React-RCTText: b3eb3514addd9b105c0edb05ed32333428ba2a52 - React-RCTVibration: 7ee1cf4f386ed200c70b2be1b09a744ab79861ba - ReactCommon: ee43d06925ecaa2fc7a9d5d07adc2f77c9d65c72 - Yoga: f7fa200d8c49f97b54c9421079e781fb900b5cae + DoubleConversion: cde416483dac037923206447da6e1454df403714 + FBLazyVector: 9cde6ad1893b262d4a558b031dc59f19d840d1e2 + FBReactNativeSpec: b60d396275e0dd54a21d25e55a6baf1b11d589c7 + Folly: f1c65c1bdabb35617432cac9cf17d0cad310ce6f + glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + RCTRequired: 98f4db9ff11a6f66e5a393c84a64c17a14beaec7 + RCTTypeSafety: 1f3a5f22d5622da589fc940de17cd69eceb2d8a7 + React: 283e8acafb4a8a770063ca087f98fcb64a2894e4 + React-ART: de71c1ba1cd15a53c25bd471a0e7263e8f0d9a9e + React-Core: e5ef1164d1681659ceea04347b3a86180c87a96b + React-CoreModules: 5200bf398831dde7bd23f1c79c8d381ce6f29621 + React-cxxreact: 8b6d97348a1e9820478f10daedea37ad15679460 + React-jsi: 239cadd0cc713e9f1b0e47bf4a59c1a325836595 + React-jsiexecutor: b3198fe478f690d133ccedcc00fe17552ba733cf + React-jsinspector: 69864526275a38f2d27a804b0e695aceb5563efe + React-RCTActionSheet: ffa0cdb0e7da1858d804ec17bbf99143883a917c + React-RCTAnimation: 888206662e6c57b633dea8bcf08e40ac535afad5 + React-RCTBlob: 8e18d4369f1020995954280e6addeb4a112f9427 + React-RCTImage: 37cce9f20e6340a84f1fc87f3f9d3c84d116b1e9 + React-RCTLinking: c9e43f49a118e373032edcbc36df0415b72ccd30 + React-RCTNetwork: 8196edc13321929d6882cec0a38fac7670dea9ea + React-RCTPushNotification: 443d65b94820e174bfe6e50a210dbdfb58688747 + React-RCTSettings: d51e01d337b8c4e10c22ade5e257e1adde2547f4 + React-RCTTest: 396e5a076aef99e2a03a6787e25aafcb47538e45 + React-RCTText: 5d84c360dc156d0800d8d1296c26a3fdc4111c34 + React-RCTVibration: 99f9c8857ef91a2ef356463df739c40fba959250 + ReactCommon: 74827690e5ae4654fa2b5f16e1e44c1d59cbb731 + Yoga: c151830d799fda76a00785da79039befcb22251a PODFILE CHECKSUM: fa397603c9a8f7cb49d7edc7fe85536d0789f34f diff --git a/RNTester/RNTester/AppDelegate.mm b/RNTester/RNTester/AppDelegate.mm index 2819b4a42f1355..b3db8281157e4a 100644 --- a/RNTester/RNTester/AppDelegate.mm +++ b/RNTester/RNTester/AppDelegate.mm @@ -52,7 +52,12 @@ @implementation AppDelegate - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { RCTEnableTurboModule(YES); - + // uncomment to configure NRURLSession + /* RCTSetCustomNSURLSessionConfigurationProvider(^NSURLSessionConfiguration *{ + NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + // configure the session + return configuration; + }); */ _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; From 4091c30697f2bd936d4b6b9bf05c76b90ec7d53e Mon Sep 17 00:00:00 2001 From: hakonk <2263015+hakonk@users.noreply.github.com> Date: Mon, 6 Jan 2020 18:36:23 +0100 Subject: [PATCH 2/4] =?UTF-8?q?[fix]=C2=A0place=20comment=20in=20correct?= =?UTF-8?q?=20place?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Libraries/Network/RCTHTTPRequestHandler.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/Network/RCTHTTPRequestHandler.mm b/Libraries/Network/RCTHTTPRequestHandler.mm index f354dacc22b9c5..b500f5a1a5a8d7 100644 --- a/Libraries/Network/RCTHTTPRequestHandler.mm +++ b/Libraries/Network/RCTHTTPRequestHandler.mm @@ -82,11 +82,11 @@ - (NSURLSessionDataTask *)sendRequest:(NSURLRequest *)request callbackQueue.maxConcurrentOperationCount = 1; callbackQueue.underlyingQueue = [[_bridge networking] methodQueue]; NSURLSessionConfiguration *configuration; - // Set allowsCellularAccess to NO ONLY if key ReactNetworkForceWifiOnly exists AND its value is YES if (urlSessionConfigurationProvider) { configuration = urlSessionConfigurationProvider(); } else { configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + // Set allowsCellularAccess to NO ONLY if key ReactNetworkForceWifiOnly exists AND its value is YES if (useWifiOnly) { configuration.allowsCellularAccess = ![useWifiOnly boolValue]; } From 98bc9d034803cf14e8a586b22de036b171406936 Mon Sep 17 00:00:00 2001 From: hakonk <2263015+hakonk@users.noreply.github.com> Date: Tue, 7 Jan 2020 19:40:35 +0100 Subject: [PATCH 3/4] =?UTF-8?q?[fix]=C2=A0typo=20in=20comment,=20header=20?= =?UTF-8?q?doc=20for=20NSURL=20configuration=20provider=20setter=20functio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Libraries/Network/RCTHTTPRequestHandler.h | 3 +++ RNTester/RNTester/AppDelegate.mm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Libraries/Network/RCTHTTPRequestHandler.h b/Libraries/Network/RCTHTTPRequestHandler.h index b93576dc0dd2dc..5a91bd0a71fa3a 100644 --- a/Libraries/Network/RCTHTTPRequestHandler.h +++ b/Libraries/Network/RCTHTTPRequestHandler.h @@ -9,6 +9,9 @@ #import typedef NSURLSessionConfiguration* (^NSURLSessionConfigurationProvider)(void); +/** + * The block provided via this function will provide the NSURLSessionConfiguration for all HTTP requests made by the app. +*/ RCT_EXTERN void RCTSetCustomNSURLSessionConfigurationProvider(NSURLSessionConfigurationProvider); /** * This is the default RCTURLRequestHandler implementation for HTTP requests. diff --git a/RNTester/RNTester/AppDelegate.mm b/RNTester/RNTester/AppDelegate.mm index b3db8281157e4a..90bd38c50c73be 100644 --- a/RNTester/RNTester/AppDelegate.mm +++ b/RNTester/RNTester/AppDelegate.mm @@ -52,7 +52,7 @@ @implementation AppDelegate - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { RCTEnableTurboModule(YES); - // uncomment to configure NRURLSession + // uncomment to configure NSURLSession /* RCTSetCustomNSURLSessionConfigurationProvider(^NSURLSessionConfiguration *{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; // configure the session From 1634c870b19f639c25fe124342d0e7f80c6e5959 Mon Sep 17 00:00:00 2001 From: hakonk <2263015+hakonk@users.noreply.github.com> Date: Thu, 27 May 2021 17:02:10 +0200 Subject: [PATCH 4/4] Remove commented out code from packages/rntester/AppDelegate.mm Moved example code to PR in RN documentation website --- packages/rn-tester/RNTester/AppDelegate.mm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/rn-tester/RNTester/AppDelegate.mm b/packages/rn-tester/RNTester/AppDelegate.mm index 66bc1639486e2a..dc5d65c1cfaddd 100644 --- a/packages/rn-tester/RNTester/AppDelegate.mm +++ b/packages/rn-tester/RNTester/AppDelegate.mm @@ -82,12 +82,6 @@ @implementation AppDelegate - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { RCTEnableTurboModule(YES); - // uncomment to configure NSURLSession - /* RCTSetCustomNSURLSessionConfigurationProvider(^NSURLSessionConfiguration *{ - NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; - // configure the session - return configuration; - }); */ _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];