如何检测iOS可达性中的networking信号强度

我正在iOS中创build一个新的旅行应用程序,这个应用程序高度依赖于地图,将包括两个地图。

  1. 当用户拥有强大的networking信号(Apple Maps)时,我的第一个地图将会工作。
  2. 我的第二个地图将被用于当他们不是任何networking或真正低信号(离线地图盒)。

为什么我在一个应用程序中有两个不同的地图? 我的应用程序是一个方向应用程序,所以当用户真的很低的networking或没有它会去离线地图地图MapBox 。 此外,苹果地图将Yelp整合,而不是离线地图地图MapBox

所以我的问题:如何检测WiFi,4G Lte和3G中的networking信号。 MapBox离线图像

我原来的想法是花时间下载一个文件,看看需要多长时间:

 @interface ViewController () <NSURLSessionDelegate, NSURLSessionDataDelegate> @property (nonatomic) CFAbsoluteTime startTime; @property (nonatomic) CFAbsoluteTime stopTime; @property (nonatomic) long long bytesReceived; @property (nonatomic, copy) void (^speedTestCompletionHandler)(CGFloat megabytesPerSecond, NSError *error); @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self testDownloadSpeedWithTimout:5.0 completionHandler:^(CGFloat megabytesPerSecond, NSError *error) { NSLog(@"%0.1f; error = %@", megabytesPerSecond, error); }]; } /// Test speed of download /// /// Test the speed of a connection by downloading some predetermined resource. Alternatively, you could add the /// URL of what to use for testing the connection as a parameter to this method. /// /// @param timeout The maximum amount of time for the request. /// @param completionHandler The block to be called when the request finishes (or times out). /// The error parameter to this closure indicates whether there was an error downloading /// the resource (other than timeout). /// /// @note Note, the timeout parameter doesn't have to be enough to download the entire /// resource, but rather just sufficiently long enough to measure the speed of the download. - (void)testDownloadSpeedWithTimout:(NSTimeInterval)timeout completionHandler:(nonnull void (^)(CGFloat megabytesPerSecond, NSError * _Nullable error))completionHandler { NSURL *url = [NSURL URLWithString:@"http://insert.your.site.here/yourfile"]; self.startTime = CFAbsoluteTimeGetCurrent(); self.stopTime = self.startTime; self.bytesReceived = 0; self.speedTestCompletionHandler = completionHandler; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; configuration.timeoutIntervalForResource = timeout; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; [[session dataTaskWithURL:url] resume]; } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { self.bytesReceived += [data length]; self.stopTime = CFAbsoluteTimeGetCurrent(); } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { CFAbsoluteTime elapsed = self.stopTime - self.startTime; CGFloat speed = elapsed != 0 ? self.bytesReceived / (CFAbsoluteTimeGetCurrent() - self.startTime) / 1024.0 / 1024.0 : -1; // treat timeout as no error (as we're testing speed, not worried about whether we got entire resource or not if (error == nil || ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorTimedOut)) { self.speedTestCompletionHandler(speed, nil); } else { self.speedTestCompletionHandler(speed, error); } } @end 

请注意,这将测量速度,包括启动连接的延迟时间。 如果您想didReceiveResponse初始延迟,您可以select初始化startTime中的startTime


这样做后,回想起来,我不喜欢花时间或带宽下载一些没有实际的好处的应用程序。 所以,作为一个select,我可能会build议一个更实用的方法:为什么不尝试打开一个MKMapView ,看看下载地图需要多长时间? 如果失败或超过一定时间,请切换到离线地图。 同样,这里有相当多的变化(不仅因为networking带宽和延迟,而且因为一些地图图像似乎被caching),所以确保设置kMaximumElapsedTime足够大以处理所有合理的排列成功的连接(即,在使用较低的值时不要过于激进)。

要做到这一点,只要确保将您的视图控制器设置为MKMapViewdelegate 。 然后你可以这样做:

 @interface ViewController () <MKMapViewDelegate> @property (nonatomic, strong) NSDate *startDate; @end static CGFloat const kMaximumElapsedTime = 5.0; @implementation ViewController // insert the rest of your implementation here #pragma mark - MKMapViewDelegate methods - (void)mapViewWillStartLoadingMap:(MKMapView *)mapView { NSDate *localStartDate = [NSDate date]; self.startDate = localStartDate; double delayInSeconds = kMaximumElapsedTime; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // Check to see if either: // (a) start date property is not nil (because if it is, we // finished map download); and // (b) start date property is the same as the value we set // above, as it's possible this map download is done, but // we're already in the process of downloading the next // map. if (self.startDate && self.startDate == localStartDate) { [[[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"Map timed out after %.1f", delayInSeconds] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } }); } - (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error { self.startDate = nil; [[[UIAlertView alloc] initWithTitle:nil message:@"Online map failed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView { NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:self.startDate]; self.startDate = nil; self.statusLabel.text = [NSString stringWithFormat:@"%.1f seconds", elapsed]; } 

我相信谷歌search将有所帮助。

注意StackOverflow上的以下线程 –

iOS的wifi扫描,信号强度

iPhone信号强度

所以,我不认为你仍然可以做到这一点,而不使用私人API。