寻找可达性(2.0)用例验证
Posted
技术标签:
【中文标题】寻找可达性(2.0)用例验证【英文标题】:Looking for Reachability (2.0) Use Case Validation 【发布时间】:2010-05-26 12:41:50 【问题描述】:关于使用 Apple 的 Reachability 示例的信息非常多,而且还有很多相互矛盾的地方。我试图找出我在下面正确使用它(Reachability 2.0)。 我的应用程序用例是这样的:如果可以通过任何方式(wifi、LAN、Edge、3G 等)获得 Internet 连接,则在各种视图中都可以看到 UIButton(“查看更多”)。如果没有连接,则该按钮不可见。 “查看更多”部分对应用程序来说并不重要,它只是一个附加功能。随着连接的建立或丢失,“查看更多”在应用程序生命周期中的任何时候都可能可见或不可见。我是这样做的 - 这是正确的和/或有更好的方法吗?
非常感谢任何帮助! lq
// AppDelegate.h
#import "RootViewController.h"
@class Reachability;
@interface AppDelegate : NSObject <UIApplicationDelegate>
UIWindow *window;
UINavigationController *navigationController;
RootViewController *rootViewController;
Reachability* hostReach;
// NOT USED: Reachability* internetReach;
// NOT USED: Reachability* wifiReach;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
@end
// AppDelegate.m
#import "AppDelegate.h"
#import "Reachability.h"
#define kHostName @"www.somewebsite.com"
@implementation AppDelegate
@synthesize window;
@synthesize navigationController;
@synthesize rootViewController;
- (void) updateInterfaceWithReachability: (Reachability*) curReach
if(curReach == hostReach)
NetworkStatus netStatus = [curReach currentReachabilityStatus];
BOOL connectionRequired = [curReach connectionRequired];
// Set a Reachability BOOL value flag in rootViewController
// to be referenced when opening various views
if ((netStatus != ReachableViaWiFi) && (netStatus != ReachableViaWWAN))
rootViewController.bConnection = (BOOL *)0;
else
rootViewController.bConnection = (BOOL *)1;
- (void) reachabilityChanged: (NSNotification* )note
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
[self updateInterfaceWithReachability: curReach];
- (void)applicationDidFinishLaunching:(UIApplication *)application
// NOTE: #DEFINE in Reachability.h:
// #define kReachabilityChangedNotification @"kNetworkReachabilityChangedNotification"
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
hostReach = [[Reachability reachabilityWithHostName: kHostName] retain];
[hostReach startNotifer];
[self updateInterfaceWithReachability: hostReach];
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
- (void)dealloc
[navigationController release];
[rootViewController release];
[window release];
[super dealloc];
@end
【问题讨论】:
【参考方案1】:为什么不rootViewController.bConnection = (netStatus != NotReachable);
,如果他们添加其他类型的连接仍然可以工作?
(BOOL *)
看起来像是一个错误(相当于(signed char *)
)。一般来说,我更喜欢 C99 的 bool
,如果您担心空间问题,C99 规范特别允许 bool blah:1;
。
另外,请注意您可以检查“互联网连接”的想法 - 您可以检查网络连接,但您的 ISP 可能已关闭,或者您要连接的主机可能已关闭,或者有人可以钻穿海底电缆。如果 kHostName 是您关心连接的主机名,那么它会做正确的事情。
【讨论】:
【参考方案2】:感谢您的快速回复! 所以我所收集的就是我需要做的就是将上面的内容更改为:
- (void) updateInterfaceWithReachability: (Reachability*) curReach
if(curReach == hostReach)
NetworkStatus netStatus = [curReach currentReachabilityStatus];
BOOL connectionRequired = [curReach connectionRequired];
// Set a Reachability BOOL value flag in rootViewController
// to be referenced when opening various views
rootViewController.bConnection = (netStatus != NotReachable);
【讨论】:
以上是关于寻找可达性(2.0)用例验证的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?
AFNetworking 2.0:isReachable 总是返回 False