我目前正在编写一个需要互联网连接(TCP 到服务器)的游戏。我正在尝试使用 Apple 的 Reachability 类,但它不起作用。我是 NotificationCenter 和 Reachability 的新手,所以如果这是一个愚蠢的问题,请原谅。
LoginViewController.h 中与可达性相关的 Prop
@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;
@property (nonatomic) Reachability *wifiReachability;
@property BOOL internetActive;
@property BOOL hostActive;
在 LoginViewController.m 中
//Reachability
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange name: kReachabilityChangedNotification object: nil];
NSString* hostIP = @"<my server IP is here, removed for obvious reasons>";
hostReachability = [Reachability reachabilityWithHostname:hostIP];
[hostReachability startNotifier];
NetworkStatus hostStatus = [internetReachability currentReachabilityStatus];
if(hostStatus == NotReachable) {NSLog(@"no");}
else if (hostStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
else if (hostStatus == ReachableViaWWAN) {NSLog(@"cell"); }
hostReachability = [Reachability reachabilityForInternetConnection];
[internetReachability startNotifier];
NetworkStatus internetStatus = [internetReachability currentReachabilityStatus];
if(internetStatus == NotReachable) {NSLog(@"no");}
else if (internetStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
else if (internetStatus == ReachableViaWWAN) {NSLog(@"cell"); }
handleNetworkChange:过程
- (void)handleNetworkChangeNSNotification*)notification{
NetworkStatus internetStatus = [internetReachability currentReachabilityStatus];
switch (internetStatus) {
case NotReachable:
{
NSLog(@"No internet connection");
self.internetActive = NO;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle"No internet connection"
message"Could not connect to the internet. Please try again later."
delegate:nil
cancelButtonTitle"OK"
otherButtonTitles:nil];
[alert show];
}
break;
case ReachableViaWiFi:
{
NSLog(@"The internet is working via WIFI.IN AGENDA");
self.internetActive = YES;
break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN.IN AGENDA");
self.internetActive = YES;
break;
}
default:
break;
}
NetworkStatus hostStatus = [hostReachability currentReachabilityStatus];
switch (hostStatus)
{
case NotReachable:
{
NSLog(@"A gateway to the host server is down.IN AGENDA");
self.hostActive = NO;
NSLog(@"No internet connection");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle"No connection to host"
message"Could not connect to the host server. Please try again later."
delegate:nil
cancelButtonTitle"OK"
otherButtonTitles:nil];
[alert show];
break;
}
case ReachableViaWiFi:
{
NSLog(@"A gateway to the host server is working via WIFI.IN AGENDA");
self.hostActive = YES;
break;
}
case ReachableViaWWAN:
{
NSLog(@"A gateway to the host server is working via WWAN.IN AGENDA");
self.hostActive = YES;
break;
}
}
运行应用程序时,无论我是否实际连接到互联网,以及服务器软件是否正在运行,我总是在终端中收到“no no”。
提前致谢。
这里的主要问题是您的代码中的拼写错误; LoginViewController.m 中的 hostReachability = [ReachabilityreachabilityForInternetConnection];
应该是 internetReachability = [ReachabilityreachabilityForInternetConnection];
。目前的方式是,您永远不会实例化 internetReachability
,然后我猜 [internetReachability currentReachabilityStatus]
将始终返回 nil
。
以下是您可以使用的基本示例:
@interface LoginViewController ()
// ...
@property (strong, nonatomic) Reachability *hostReachability;
@property (strong, nonatomic) Reachability *internetReachability;
@property (strong, nonatomic) Reachability *wifiReachability;
@end
@implementation LoginViewController
// ...
- (void)setupReachabilityMonitoring
{
[NSNotificationCenter.defaultCenter addObserver:self
selectorselector(reachabilityChanged
name:kReachabilityChangedNotification
object:nil];
_hostReachability = [Reachability reachabilityWithHostName"8.8.8.8"];
[_hostReachability startNotifier];
_internetReachability = [Reachability reachabilityForInternetConnection];
[_internetReachability startNotifier];
_wifiReachability = [Reachability reachabilityForLocalWiFi];
[_wifiReachability startNotifier];
[self logReachabilityStatus];
}
- (void)reachabilityChangedNSNotification *)notification
{
if ([notification.object isKindOfClass:Reachability.class]) {
[self logReachabilityStatus];
}
}
- (void)logReachabilityStatus
{
NSString *hostStatus = _hostReachability.currentReachabilityStatus ? @"up" : @"down";
NSString *internetStatus = _internetReachability.currentReachabilityStatus ? @"up" : @"down";
NSString *wifiStatus = _wifiReachability.currentReachabilityStatus ? @"up" : @"down";
NSLog(@"Internet is %@, wifi is %@, host is %@", internetStatus, wifiStatus, hostStatus);
}
@end
关于ios - 可达性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810545/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |