目前我正在通过apple reachability.m/.h使用该类,它可以工作,除了它通知我任何更改,我想只通知用户网络是否无法访问.目前,如果我有互联网连接,然后松散网络它告诉我.但是当你重新连接到网络时,它也告诉我,我不想要.我希望它只告诉我什么时候有丢失/没有网络.
我认为这与电话有关:
- (void)viewWillAppear:(BOOL)animated
{
// check for internet connection
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification
object:nil];
internetReachable = [[Reachability
reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName:
@"www.google.ca"] retain];
[hostReachable startNotifier];
// now patiently wait for the notification
}
Run Code Online (Sandbox Code Playgroud)
在调用时-[NSNotificationCenter addObserver:selector:name:object:],该名称是否具有任何其他功能,然后字面上是一个名称?这是我第一次使用NSNotificationCenter,所以我不太熟悉这个问题.
编辑:
这是我的checkNetworkStatus函数:(问题是我得到"NotReachable",因为网络连接回来了,NSAlert多次关闭)
- (void) checkNetworkStatus:(NSNotification *)notice
{
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
UIAlertView * …Run Code Online (Sandbox Code Playgroud) 嗨我想捕获每当用户在我的应用程序中获得网络连接时,我已经添加了苹果Reachability类,下面是我在appDelegate类didFinishLaunchingWithOptions方法中使用的片段,
Reachability* reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
Run Code Online (Sandbox Code Playgroud)
和我的reachabilityChanged选择器方法如下
- (void)reachabilityChanged:(NSNotification*)notification
{
Reachability* reachability = notification.object;
if(reachability.currentReachabilityStatus == NotReachable)
NSLog(@"Internet off");
else
NSLog(@"Internet on");
}
Run Code Online (Sandbox Code Playgroud)
但在这里,当我关闭飞机模式并在手机中获得网络连接时,我没有收到任何通知.
我错过了什么吗?
我搜索过但没有找到像我这样的问题.我确定这是我看过的东西.
我正在使用tony million的可达性块方法.当我有互联网然后没有互联网时它工作得很好.警报出现并且工作得很好.
但是,当我没有互联网然后我上网时会弹出相同的警报
我的代码是
-(void)reachabilityBlock
{
// allocate a reachability object
Reachability * reach = [Reachability reachabilityWithHostname:@"www.google.com"];
// tell the reachability that we DONT want to be reachable on 3G/EDGE/CDMA
reach.reachableOnWWAN = YES;
reach.reachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
//NSLog(@"REACHABLE! block");
[self newsTableViewRefresher];
});
};
reach.unreachableBlock = ^(Reachability * reachability)
{
dispatch_async(dispatch_get_main_queue(), ^{
//NSLog(@"UNREACHABLE! block");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"No Network found!"
message: @"You have no wifi or cellular connection available. Please connect to a …Run Code Online (Sandbox Code Playgroud) 我正在做一些服务器调用并返回一些json.代码非常简单,它会调用您的身份,然后再进行一次调用以获取更多信息.当我尝试进行第二次调用时,我一直收到Reachability错误.
Reachability Flag Status: -R ------- networkStatusForFlags
Run Code Online (Sandbox Code Playgroud)
不知道为什么会那样做.我在模拟器中运行这个,我在Wifi上,第一个电话通过就好了.
可能重复:
Iphone检测到3g或wifi
有没有办法获得当前的网络速度或设备是否在EDGE/3G/GPRS?我可以使用Reachability来区分WiFI和WMAN,但这对我的应用来说还不够.
我看到很多Reachability示例,其中人们只在可达性状态发生变化时显示消息.
但最近,我在Foursquare应用程序中看到,每次用户尝试执行需要Internet连接的操作时,它们都会显示一条消息.
我认为这是一个更强大和更好的用户体验提醒用户他没有互联网不能做任何事情.主要是因为用户可以在应用程序之间切换,做其他事情并忘记他回来时没有联系.
一旦他们获得连接,我就可以看到他们从Internet获取数据并刷新UI.
我真正想要的是最好的方法.怎么做的?
他们是否有一个通用的UIViewController,每次需要连接时都会检查是否具有可达性?
或者,在每个取消请求并显示消息的Internet请求之前,他们是否有一种代理类?你们是如何处理的?
谢谢.
编辑:
我提出的解决方案是使用AFNetworking,它还在框中提供可达性状态.
基本上我创建了一个AFHTTPClient并在其上设置了一个可达性回调块来监听状态变化.AFHTTPClient对象是应用程序范围的(一种单例).(事实上,每个主机我有一个AFHTTPClient,我需要到达a.com,b.com ......).
然后,当我需要执行请求时,我创建了一个新的AFHTTPRequestOperation(在我的情况下是AFJSONRequestOperation),然后我将它排入AFHTTPClient对象.在操作的故障块中,我检查主机是否可以使用networkReachabilityStatusAFHTTPClient 的属性访问.如果无法访问,我会显示一条消息,表明用户没有互联网连接.
我把它包起来,所以每次创建操作时我都不必这样做.所以现在在应用程序中,每当用户尝试在没有连接时做某事时,他都会收到一条消息,记住他没有互联网访问权限.
我还使用可达性回调在我获得连接后重新加载屏幕上的数据(或者更确切地说,一旦我应该有连接).
我不知道这是不是最佳做法,但我认为很高兴知道应用程序会在新连接可用时立即重新加载重要数据.
如果有人对示例代码感兴趣,我可以提供它.
背景
我正在Swift中构建一个API框架.我希望它包含一个Reachability可以在内部和外部使用的类.
状态
我复制了ReachabilityTony Million提供的类的源代码,将import语句添加到我的标题中.该.h文件在Headers部分中设置为public Build Phases.我已经设置Allow Non-modular Includes in Framework Modules到YES在我的两个项目和目标.每当我去构建项目时,我都会收到错误:
Include of non-modular header inside framework module 'MyFramework.Reachability'
Run Code Online (Sandbox Code Playgroud)
在进口线上ifaddrs.h.
问题
如何构建项目?是否有另一个我需要链接的框架,不是SystemConfiguration吗?
我只需要在开始与我的iphone应用程序中的服务通信之前检查互联网连接可用性.我使用Swift 1.2和Xcode 6作为我的开发环境......
我刚做了一些研究,发现这个stackoverflow LINK 在目标C中.
因此,我只是试图在SWIFT中找到类似的解决方案,并找到以下链接
https://coderwall.com/p/mhxbpq/checking-for-internet-connection-availability
只是为了让事情变得简单,该链接中的内容如下......
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0 …Run Code Online (Sandbox Code Playgroud) 我正在检查网络连接viewDidLoad使用它:
-(BOOL)reachable {
ReachabilityDRC *r = [ReachabilityDRC reachabilityWithHostName:@"google.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if(internetStatus == NotReachable) {
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
但是我也希望在网络发生变化时收到通知,例如wifi掉线或wifi恢复,所以我可以相应地进行更改.
如何调整我的方法来做那样的事情?
帮助我理解使用网络链接调节器测试可达性代码时所看到的内容.这是我的香草可达性代码:
Reachability* wifiReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
NetworkStatus netStatus = [wifiReach currentReachabilityStatus];
switch (netStatus)
{
case NotReachable:
{
NSLog(@"Access Not Available");
break;
}
case ReachableViaWWAN:
{
NSLog(@"Reachable WWAN");
break;
}
case ReachableViaWiFi:
{
NSLog(@"Reachable WiFi");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我使用网络链接调节器使用"100%损失"预设测试此代码时 - 值netStatusis ReachableViaWWAN,这是我没想到的.我读了很多关于Reachability没有真正测试连接性的投诉,而是测试了连接的可能性.所以这是我的问题:
"100%丢失"预设是否允许向Apple服务器发出DNS请求,但不允许任何数据包通过?
reachability ×10
ios ×7
iphone ×4
objective-c ×4
swift ×2
xcode ×2
cocoa ×1
cocoa-touch ×1
ios8 ×1
networking ×1
uialertview ×1