diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.h b/OHHTTPStubs/Sources/OHHTTPStubs.h index c4391c39..42b1ed3c 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.h +++ b/OHHTTPStubs/Sources/OHHTTPStubs.h @@ -128,6 +128,13 @@ typedef OHHTTPStubsResponse* __nonnull (^OHHTTPStubsResponseBlock)( NSURLRequest */ +(void)setEnabled:(BOOL)enabled; +/** + * Whether or not stubs are enabled for the shared session or for `NSURLConnection` + * + * @return If `YES` the stubs are enabled. If `NO` then the stubs are disabled + */ ++(BOOL)isEnabled; + #if defined(__IPHONE_7_0) || defined(__MAC_10_9) /** * Enable or disable the stubs on a given `NSURLSessionConfiguration`. @@ -149,6 +156,15 @@ typedef OHHTTPStubsResponse* __nonnull (^OHHTTPStubsResponseBlock)( NSURLRequest * created sessions. */ + (void)setEnabled:(BOOL)enabled forSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig; + +/** + * Whether stubs are enabled or disabled on a given `NSURLSessionConfiguration` + * + * @param sessionConfig The NSURLSessionConfiguration on which to enable/disable the stubs + * + * @return If `YES` the stubs are enabled for sessionConfig. If `NO` then the stubs are disabled + */ ++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig; #endif #pragma mark - Debug Methods diff --git a/OHHTTPStubs/Sources/OHHTTPStubs.m b/OHHTTPStubs/Sources/OHHTTPStubs.m index 3eb98cfe..03c02424 100644 --- a/OHHTTPStubs/Sources/OHHTTPStubs.m +++ b/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -44,6 +44,7 @@ @interface OHHTTPStubsProtocol : NSURLProtocol @end @interface OHHTTPStubs() + (instancetype)sharedInstance; @property(atomic, copy) NSMutableArray* stubDescriptors; +@property(atomic, assign) BOOL enabledState; @property(atomic, copy, nullable) void (^onStubActivationBlock)(NSURLRequest*, id); @end @@ -105,7 +106,7 @@ + (void)initialize { if (self == [OHHTTPStubs class]) { - [self setEnabled:YES]; + [self _setEnable:YES]; } } - (instancetype)init @@ -114,13 +115,14 @@ - (instancetype)init if (self) { _stubDescriptors = [NSMutableArray array]; + _enabledState = YES; // assume initialize has already been run } return self; } - (void)dealloc { - [self.class setEnabled:NO]; + [self.class _setEnable:NO]; } //////////////////////////////////////////////////////////////////////////////// @@ -149,18 +151,26 @@ +(void)removeAllStubs #pragma mark > Disabling & Re-Enabling stubs -+(void)setEnabled:(BOOL)enable ++(void)_setEnable:(BOOL)enable { - static BOOL currentEnabledState = NO; - if (enable && !currentEnabledState) + if (enable) { [NSURLProtocol registerClass:OHHTTPStubsProtocol.class]; } - else if (!enable && currentEnabledState) + else { [NSURLProtocol unregisterClass:OHHTTPStubsProtocol.class]; } - currentEnabledState = enable; +} + ++(void)setEnabled:(BOOL)enabled +{ + [OHHTTPStubs.sharedInstance setEnabled:enabled]; +} + ++(BOOL)isEnabled +{ + return OHHTTPStubs.sharedInstance.isEnabled; } #if defined(__IPHONE_7_0) || defined(__MAC_10_9) @@ -189,6 +199,25 @@ + (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfigurati @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd)); } } + ++ (BOOL)isEnabledForSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig +{ + // Runtime check to make sure the API is available on this version + if ( [sessionConfig respondsToSelector:@selector(protocolClasses)] + && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)]) + { + NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses]; + Class protoCls = OHHTTPStubsProtocol.class; + return [urlProtocolClasses containsObject:protoCls]; + } + else + { + NSLog(@"[OHHTTPStubs] %@ is only available when running on iOS7+/OSX9+. " + @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call " + @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd)); + return NO; + } +} #endif #pragma mark > Debug Methods @@ -208,6 +237,25 @@ +(void)onStubActivation:( nullable void(^)(NSURLRequest* request, id