我正在成功使用Reachability来确定网络的状态,并获得有关更改的通知(例如iOS 4的可达性指南).
我的问题不是如何让Reachability启动和运行,而是如下.
我AppDelegate处理可达性的东西.应用kReachabilityChangedNotification程序运行时以及应用程序位于Background(applicationDidEnterBackground:)时,应用程序会收到通知().
该应用程序旨在重新加载播放的音频流,当它注意到它丢失了一个Wi-Fi连接,例如,为了测试,我在设置中打开和关闭Wi-Fi,一切都运行良好.在实际测试中,当我退出接入点的范围时,我经常会失去Wi-Fi连接.我发现在这种情况下,Reachability并没有帮助我太多.我不确定是不是因为当屏幕被锁定时,可达性通知没有通过,或者可达性无法处理来自越来越远的Wi-Fi接入点的信号缓慢减少,但无论我无法想象为什么现实世界的测试与理想化的案例不符.
这就是我的代码.我首先设置接收通知,然后开始收听Reachability:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
// Set up Reachability
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
....
return YES;
}
Run Code Online (Sandbox Code Playgroud)
然后,这是响应连接变化的函数:
- (void)checkNetworkStatus:(NSNotification *)notice {
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
NSLog(@"The internet is down.");
break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is …Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在服务器中发出HTTP请求.现在我想知道它是否连接到互联网.以下是我的代码
let request = Alamofire.request(completeURL(domainName: path), method: method, parameters: parameters, encoding: encoding.value, headers: headers)
.responseJSON {
let resstr = NSString(data: $0.data!, encoding: String.Encoding.utf8.rawValue)
print("error is \(resstr)")
if $0.result.isFailure {
self.failure("Network")
print("API FAILED 4")
return
}
guard let result = $0.result.value else {
self.unKnownError()
self.failure("")
print("API FAILED 3")
return
}
self.handleSuccess(JSON(result))
}
Run Code Online (Sandbox Code Playgroud) 我希望AFNetworking在Objective-C中使用与Swift中的Alamofire NetworkReachabilityManager 类似的功能:
//Reachability detection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN: {
[self LoadNoInternetView:NO];
break;
}
case AFNetworkReachabilityStatusReachableViaWiFi: {
[self LoadNoInternetView:NO];
break;
}
case AFNetworkReachabilityStatusNotReachable: {
break;
}
default: {
break;
}
}
}];
Run Code Online (Sandbox Code Playgroud)
我目前正在使用监听器来了解网络状态的变化
let net = NetworkReachabilityManager()
net?.startListening()
Run Code Online (Sandbox Code Playgroud)
有人可以描述如何支持这些用例吗?
我一直在测试不同的方法,以实现在应用程序处于后台时设备是否能够恢复互联网的可能性,因此我测试的第一个代码是Apple可访问性示例代码http://developer.apple.com/library/ios /#samplecode/Reachability/Introduction/Intro.html
但是,当应用程序处于后台时,此代码不会通知Internet状态.所以我也尝试了下面的代码,当App从Background状态启动到前台时它起作用(与Apple可访问性示例代码相同)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
// Set up Reachability
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
...
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
// Set up Reachability
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
}
- (void)checkNetworkStatus:(NSNotification *)notice {
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case …Run Code Online (Sandbox Code Playgroud) 当我第一次在当天启动应用程序时,我总是得到上述问题.当我第一次启动应用程序时,我进行服务器调用以获取一些数据,然后播放动画视频.服务器调用与主UI线程位于不同的线程中.它与Network Reachability或动画视频有关吗?我认为第一部分是主要问题,但无法一直重现.
有没有人遇到过这个问题?
下面是我第一次启动应用程序时的代码.
override func viewDidLoad() {
super.viewDidLoad();
self.navigationController?.navigationBarHidden = true;
self.view.backgroundColor = UIColor.whiteColor();
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
Items.setup(); //AFNetworking call
};
animationViewController.delegate = self;
animationViewController.view.autoresizesSubviews = true;
animationViewController.view.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin];
animationViewController.view.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
self.view.addSubview(animationViewController.view);
}
Run Code Online (Sandbox Code Playgroud) 我已经实现了AFNetworking没有子类化AFHTTPClient,部分使用我的以下代码DownloadQueueManager:
-(void)downloadPodcastAt:(NSString *)url toPath:(NSString *)path
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestReturnCacheDataElseLoad
timeoutInterval:60.0];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
[self saveQueuedItemInformation];
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
// Other stuff
}];
[operation start];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是多方面的.我用google搜索"我的手指麻木了,还没有找到一个像样的代码样本,它可以简单轻松地检查可达性状态AFNetworking.(奇怪的是,有很多关于进口的讨论SystemConfiguration.framework,这看起来很简单).因此,如果我的用户想要最小化他们的数据使用,并且只使用wifi下载,我该如何检查wifi,并且只有在wifi可用时才下载?
其次,它似乎AFNetworking想成为一个用户友好的前端.但我实际上可以在这个前端使用前端,因为那里有很多东西,人们不得不通过它来获得所需的东西.我只需要访问一个url,下载一个xml文件(基于可达性),并用它做一些事情.我错过了一些让这项任务变得简单的事情吗?
当我理解这一点时,我完全建立了一个前端或五个来简化实现(假设我不仅仅是一个白痴).提前感谢您的回复.
免责声明:这个问题纯粹是信息性的,并不代表我遇到的实际问题.我只是想弄清楚它的东西(因为我喜欢弄清楚东西,我知道你也这样做).
所以我正在玩git,试图使修改后的提交失效.我的reflog看起来像这样:
4eea1cd HEAD@{0}: commit (amend): amend commit
ff576c1 HEAD@{1}: commit: test: bar
5a1e68a HEAD@{2}: commit: test: foo
da8534a HEAD@{3}: commit (initial): initial commit
Run Code Online (Sandbox Code Playgroud)
这意味着我做了两次提交(da8534a和5a1e68a),然后是ff576c1我修改过的第三次提交4eea1cd.
正如预期的那样,我git log看起来像这样:
* 4eea1cd (HEAD, master) amend commit
* 5a1e68a test: foo
* da8534a initial commit
Run Code Online (Sandbox Code Playgroud)
从我(虽然我)知道提交的可达性,有一天(最有可能,默认情况下在30天内)git gc应该收集ff576c1.现在我不想等待30天才能看到这种情况,所以我开始运行一些命令,首先:
git fsck --unreachable --no-reflogs
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这让我:
unreachable blob 5716ca5987cbf97d6bb54920bea6adde242d87e6
unreachable tree 1e60e555e3500075d00085e4c1720030e077b6c8
unreachable commit ff576c1b4b6df57ba1c20afabd718c93dacf2fc6
Run Code Online (Sandbox Code Playgroud)
所有人都相信我将要过期这种可怜的孤独ff576c1承诺,然后我会跑git reflog expire:
git reflog …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的2.0 AFNetworking设置Reachability .
在我的AppDelegate中,我初始化了sharedManager.
// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];
Run Code Online (Sandbox Code Playgroud)
然后在相关的VC方法中我检查是否isReachable:
// Double check with logging
if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
NSLog(@"IS REACHABILE");
} else {
NSLog(@"NOT REACHABLE");
}
Run Code Online (Sandbox Code Playgroud)
目前这在模拟器中没有按预期工作,但我想这需要在设备而不是模拟器上进行测试.
问题 我想要做的是监控VC内的连接.所以我在viewDidLoad中运行以下命令:
// Start monitoring the internet connection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
Run Code Online (Sandbox Code Playgroud)
我如何注册更改?一旦网络连接发生变化,将会调用什么/我将无法从文档中看到这一点.
从Apple下载Reachability,使用此方法检查活动连接:
-(BOOL)isReachable{
Reachability *r = [Reachability reachabilityWithHostName:@"http://www.google.com"];
if(NotReachable == [r currentReachabilityStatus]) {
NSLog(@"Not Reachable");
return NO;
}
NSLog(@"Reachable");
return YES;
}
Run Code Online (Sandbox Code Playgroud)
尽管连接了,但每次都返回NO?无法弄清楚为什么......
有任何想法吗?谢谢.
在旁注,任何人都可以推荐一个很好的清洁Reachability单件类?
reachability ×10
ios ×9
swift ×4
afnetworking ×2
alamofire ×2
ios6 ×2
objective-c ×2
background ×1
git ×1
iphone ×1
ipv6 ×1
networking ×1
reflog ×1