iOS 获取当前网速 (kb) 和网络状况 (好、中、差) - OC 代码示例
你可以使用 iOS 的 Reachability 库来获取当前网络状况,然后通过发送网络请求来测量当前的网速。以下是一个获取当前网速和网络状况的示例代码:
首先,下载并导入 Reachability 库,你可以从这里获取:https://github.com/tonymillion/Reachability
然后,创建一个名为 NetworkManager 的单例类,用于管理网络相关操作。在 NetworkManager.h 文件中,添加以下代码:
#import <Foundation/Foundation.h>
typdef NS_ENUM(NSUInteger, NetworkQuality) {
NetworkQualityGood,
NetworkQualityModerate,
NetworkQualityPoor
};
@interface NetworkManager : NSObject
@property (nonatomic, assign, readonly) NetworkQuality networkQuality;
@property (nonatomic, assign, readonly) float currentDownloadSpeed;
+ (instancetype)sharedManager;
@end
在 NetworkManager.m 文件中,添加以下代码:
#import "NetworkManager.h"
#import "Reachability.h"
@interface NetworkManager ()
@property (nonatomic, strong) Reachability *reachability;
@property (nonatomic, assign) BOOL isMonitoring;
@end
@implementation NetworkManager
+ (instancetype)sharedManager {
static NetworkManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
self.reachability = [Reachability reachabilityForInternetConnection];
self.networkQuality = NetworkQualityGood;
self.currentDownloadSpeed = 0.0;
}
return self;
}
- (void)startMonitoring {
if (self.isMonitoring) {
return;
}
self.isMonitoring = YES;
[self.reachability startNotifier];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStatusChanged:) name:kReachabilityChangedNotification object:nil];
}
- (void)stopMonitoring {
if (!self.isMonitoring) {
return;
}
self.isMonitoring = NO;
[self.reachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}
- (void)networkStatusChanged:(NSNotification *)notification {
Reachability *reachability = notification.object;
NetworkStatus status = reachability.currentReachabilityStatus;
switch (status) {
case NotReachable:
self.networkQuality = NetworkQualityPoor;
break;
case ReachableViaWiFi:
self.networkQuality = NetworkQualityGood;
break;
case ReachableViaWWAN:
self.networkQuality = NetworkQualityModerate;
break;
default:
break;
}
}
- (void)testDownloadSpeedWithCompletion:(void (^)(float downloadSpeed))completion {
NSURL *url = [NSURL URLWithString:'https://www.apple.com'];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.timeoutIntervalForRequest = 1.0;
config.timeoutIntervalForResource = 1.0;
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSDate *startTime = [NSDate date];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSTimeInterval elapsedTime = fabs([startTime timeIntervalSinceNow]);
float downloadSpeed = (float)data.length / elapsedTime / 1024.0;
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
completion(downloadSpeed);
});
}
}];
[task resume];
}
@end
现在,你可以在你的 ViewController 中使用 NetworkManager 获取当前的网速和网络状况。例如,你可以在视图加载时开始监听网络状态,并在需要时获取当前的网速。以下是一个示例代码:
#import "ViewController.h"
#import "NetworkManager.h"
@interface ViewController ()
@property (nonatomic, strong) NetworkManager *networkManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.networkManager = [NetworkManager sharedManager];
[self.networkManager startMonitoring];
// 获取当前网速
[self.networkManager testDownloadSpeedWithCompletion:^(float downloadSpeed) {
NSLog('Current download speed: %.2f kb/s', downloadSpeed);
}];
}
@end
这样,你就可以通过 NetworkManager 获取当前的网速和网络状况了。在上面的示例中,我们使用了一个简单的网页请求来测量网速,你可以根据自己的需求进行修改。
原文地址: https://www.cveoy.top/t/topic/1S8 著作权归作者所有。请勿转载和采集!