Fix NSURLConnection is deprecated - Use NSURLSession (#4112)

This commit is contained in:
A Cœur 2022-11-12 11:29:48 +08:00 committed by GitHub
parent 2aa46f840c
commit 48e42ac71e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 63 deletions

View File

@ -4,6 +4,8 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(unsigned int, port_status_t) { //
PORT_STATUS_CHECKING,
PORT_STATUS_OPEN,
@ -27,3 +29,5 @@ typedef NS_ENUM(unsigned int, port_status_t) { //
- (void)portCheckerDidFinishProbing:(PortChecker*)portChecker;
@end
NS_ASSUME_NONNULL_END

View File

@ -11,8 +11,8 @@ static NSTimeInterval const kCheckFireInterval = 3.0;
@property(nonatomic, weak) NSObject<PortCheckerDelegate>* fDelegate;
@property(nonatomic) port_status_t fStatus;
@property(nonatomic) NSURLConnection* fConnection;
@property(nonatomic) NSMutableData* fPortProbeData;
@property(nonatomic) NSURLSession* fSession;
@property(nonatomic) NSURLSessionDataTask* fTask;
@property(nonatomic) NSTimer* fTimer;
@ -24,6 +24,8 @@ static NSTimeInterval const kCheckFireInterval = 3.0;
{
if ((self = [super init]))
{
_fSession = [NSURLSession sessionWithConfiguration:NSURLSessionConfiguration.ephemeralSessionConfiguration delegate:nil
delegateQueue:nil];
_fDelegate = delegate;
_fStatus = PORT_STATUS_CHECKING;
@ -42,7 +44,7 @@ static NSTimeInterval const kCheckFireInterval = 3.0;
- (void)dealloc
{
[_fTimer invalidate];
[self cancelProbe];
}
- (port_status_t)status
@ -55,51 +57,7 @@ static NSTimeInterval const kCheckFireInterval = 3.0;
[self.fTimer invalidate];
self.fTimer = nil;
[self.fConnection cancel];
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
self.fPortProbeData.length = 0;
}
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
[self.fPortProbeData appendData:data];
}
- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
NSLog(@"Unable to get port status: connection failed (%@)", error.localizedDescription);
[self callBackWithStatus:PORT_STATUS_ERROR];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{
NSString* probeString = [[NSString alloc] initWithData:self.fPortProbeData encoding:NSUTF8StringEncoding];
self.fPortProbeData = nil;
if (probeString)
{
if ([probeString isEqualToString:@"1"])
{
[self callBackWithStatus:PORT_STATUS_OPEN];
}
else if ([probeString isEqualToString:@"0"])
{
[self callBackWithStatus:PORT_STATUS_CLOSED];
}
else
{
NSLog(@"Unable to get port status: invalid response (%@)", probeString);
[self callBackWithStatus:PORT_STATUS_ERROR];
}
}
else
{
NSLog(@"Unable to get port status: invalid data received");
[self callBackWithStatus:PORT_STATUS_ERROR];
}
[self.fTask cancel];
}
#pragma mark - Private
@ -108,30 +66,48 @@ static NSTimeInterval const kCheckFireInterval = 3.0;
{
self.fTimer = nil;
NSString* urlString = [NSString stringWithFormat:@"https://portcheck.transmissionbt.com/%ld", [timer.userInfo integerValue]];
NSString* urlString = [NSString stringWithFormat:@"https://portcheck.transmissionbt.com/%ld", [(NSNumber*)timer.userInfo integerValue]];
NSURLRequest* portProbeRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:15.0];
if ((self.fConnection = [[NSURLConnection alloc] initWithRequest:portProbeRequest delegate:self]))
{
self.fPortProbeData = [[NSMutableData alloc] init];
}
else
{
NSLog(@"Unable to get port status: failed to initiate connection");
[self callBackWithStatus:PORT_STATUS_ERROR];
}
_fTask = [_fSession dataTaskWithRequest:portProbeRequest
completionHandler:^(NSData* _Nullable data, NSURLResponse* _Nullable response, NSError* _Nullable error) {
if (error)
{
NSLog(@"Unable to get port status: connection failed (%@)", error.localizedDescription);
[self callBackWithStatus:PORT_STATUS_ERROR];
return;
}
NSString* probeString = [[NSString alloc] initWithData:data ?: NSData.data encoding:NSUTF8StringEncoding];
if (!probeString)
{
NSLog(@"Unable to get port status: invalid data received");
[self callBackWithStatus:PORT_STATUS_ERROR];
}
else if ([probeString isEqualToString:@"1"])
{
[self callBackWithStatus:PORT_STATUS_OPEN];
}
else if ([probeString isEqualToString:@"0"])
{
[self callBackWithStatus:PORT_STATUS_CLOSED];
}
else
{
NSLog(@"Unable to get port status: invalid response (%@)", probeString);
[self callBackWithStatus:PORT_STATUS_ERROR];
}
}];
[_fTask resume];
}
- (void)callBackWithStatus:(port_status_t)status
{
self.fStatus = status;
if (self.fDelegate && [self.fDelegate respondsToSelector:@selector(portCheckerDidFinishProbing:)])
{
[self.fDelegate performSelectorOnMainThread:@selector(portCheckerDidFinishProbing:) withObject:self waitUntilDone:NO];
}
NSObject<PortCheckerDelegate>* delegate = self.fDelegate;
[delegate performSelectorOnMainThread:@selector(portCheckerDidFinishProbing:) withObject:self waitUntilDone:NO];
}
@end

View File

@ -495,7 +495,7 @@ static NSString* const kWebUIURLFormat = @"http://localhost:%ld/";
case PORT_STATUS_CHECKING:
break;
default:
NSAssert1(NO, @"Port checker returned invalid status: %d", self.fPortChecker.status);
NSAssert(NO, @"Port checker returned invalid status: %d", self.fPortChecker.status);
break;
}
self.fPortChecker = nil;