我目前正在编写一款需要互联网连接的游戏(TCP到服务器)。我试图利用Apple的Reachability类,但它不起作用。我是NotificationCenter和Reachability的新手,所以如果这是一个愚蠢的问题,请原谅。
LoginViewController.h中与可达性相关的道具
@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:procedure
- (void)handleNetworkChange:(NSNotification*)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;
}
}
运行应用程序时,我总是得到&#34; no no&#34;在终端中,无论我是否实际连接到互联网,以及服务器软件是否正在运行。
提前致谢。
答案 0 :(得分:2)
我正在使用这个库使用块,因此它不会冻结应用程序并在后台运行
答案 1 :(得分:2)
这里的主要问题是代码中的拼写错误; LoginViewController.m 中的行hostReachability = [Reachability reachabilityForInternetConnection];
应为internetReachability = [Reachability reachabilityForInternetConnection];
。目前的方式是,您永远不会实例化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
selector:@selector(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)reachabilityChanged:(NSNotification *)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
答案 2 :(得分:0)
我认为问题出现在您的主机名&#34;中。它不是您服务器的IP,而是您的主机名,例如www.apple.com。您可以查看Apple的example code。在第87行,他们将主机名设置为@"www.apple.com"
。