我正在开发一个用Swift编写的iOS应用程序,它与本地网络上的HTTP服务器通信,我正在使用Apple的Reachability类来确定运行HTTP服务器的远程机器是否在线.这是代码:
...
let RemoteHost: String = "192.168.178.130"
var RemoteReachability: Reachability! = nil
var RemoteIsReachable: Bool = false
init() {
super.init()
self.RemoteReachability = Reachability(hostName: self.RemoteHost)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: self.RemoteReachability)
self.RemoteReachability.startNotifier()
self.RemoteIsReachable = (self.RemoteReachability.currentReachabilityStatus().value == ReachableViaWiFi.value)
}
func reachabilityChanged(notification: NSNotification) {
let ReachabilityInst: Reachability = notification.object as Reachability
self.RemoteIsReachable = (ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)
}
Run Code Online (Sandbox Code Playgroud)
问题是无论远程机器是在线还是离线,
(ReachabilityInst.currentReachabilityStatus().value == ReachableViaWiFi.value)
Run Code Online (Sandbox Code Playgroud)
只要我连接到Wifi网络,总是如此.但是,当我关闭Wifi时,它会导致错误而不是真实.我在这里做错了什么,或者Reachability类是否与Swift/xCode 6 Beta不兼容?我也试过这个:
(ReachabilityInst.currentReachabilityStatus() == ReachableViaWiFi)
Run Code Online (Sandbox Code Playgroud)
但是这导致xCode告诉我"无法找到接受所提供参数的'=='的重载",即使两者看起来都是'NetworkStatus'类型.
提前致谢.
我是iOS开发的新手,我正在努力让reachability.h类工作.这是我的视图控制器代码:
- (void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification
object:nil];
internetReachable = [Reachability reachabilityForInternetConnection];
[internetReachable startNotifier];
}
- (void)checkNetworkStatus:(NSNotification *)notice {
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
NSLog(@"Network status: %i", internetStatus);
}
Run Code Online (Sandbox Code Playgroud)
它看起来不错,但在运行应用程序并切换到该视图时,xcode控制台中没有任何内容出现.
我正在使用Reachability 2.2和iOS 4.2.
有什么明显的东西我做错了吗?
我正在iOS中创建一个新的旅行应用程序,该应用程序高度依赖于地图,并将包含两个地图.
- 当用户拥有强大的网络信号(Apple Maps)时,我的第一张地图将起作用.
- 我的第二个Map将在它们不是任何网络或真正低信号(离线MapBox)时使用.
为什么我在一个应用程序中有两个不同的映射?我的应用程序是一个方向应用程序,因此当用户网络真的很低或没有时,它将转到离线地图MapBox.此外,Apple Maps将具有Yelp集成,而不是离线地图MapBox.
所以我的问题:如何在WiFi,4G Lte和3G中检测网络信号.

我正在使用parse.com API开发一个应用程序(托管后端提供API以在其服务器上保存数据).我希望能够在线和离线无缝使用该应用程序.为此,我需要使用一个队列,我可以放置需要网络访问的块.当网络确实可用时,应该串行执行这些块,当网络脱机时,应该暂停队列处理.
当网络变得可用/不可用时,我正在考虑将GCD用于暂停/恢复.我想知道是否有更好的选择?如果将应用程序放在后台,这会有效吗?这里的一个例子是,当网络不可用(排队等待)然后将应用程序置于后台时,用户会保存一些数据.现在,当网络可用时,是否可以自动在后台进行保存?
queue grand-central-dispatch reachability ios parse-platform
我想知道如何检查用户是通过WIFI还是蜂窝数据3G或4G连接到互联网.
此外,我不想检查网站是否可访问,我想检查设备上是否有互联网.我试图查看互联网所有我看到的是他们检查网站是否可以访问或不使用Rechability该类.
我想在打开我的应用程序时检查用户是否有互联网.
我正在使用带有Objective-C的Xcode6.
我正在写一个旅行指南相关的应用程序,它将下载大型数据库(60meg)可能在海外,我可以告诉可通过wifi或3g可以访问主机的可达性代码但我担心如果由于某种原因wifi连接中断一段时间左右,因为有些DSL连接可能会偶尔进行,iphone将透明地切换到3G,而且没有意识到我可能会收到海外数据费用的电话账单!
所以我想知道是否有人有任何经验,如果wifi连接中断(wifi仍然有效,但它与网络的连接已关闭)可达性代码报告ReachableViaWWAN?所以我可以等到我的下载代码返回,检查主机当前是如何可以访问的,如果它是通过3g我可以中止?
是否可以选择我可以使用的连接类型3g或wifi?
我试图检查设备是通过2G(GPRS,EDGE)还是3G(UMTS,HSDPA)连接的.
我只从这里找到了Reachability示例类(Apple Dev Example)
此示例仅检查其Wifi或WWAN.我想用它来决定下载小数据还是大文件.因为GRPS和UMTS之间存在很大差异.
有可能区分2G和3G吗?
我搜索过这个问题的答案,并没有真正解决,至少在某些方面我无法解决这个问题.
我最初只是检查Internet可达性,使用:
self.wwanReach = [Reachability reachabilityWithHostName:@"www.apple.com"];
[wwanReach startNotifer];
Run Code Online (Sandbox Code Playgroud)
我现在需要支持本地WiFi连接(一般没有上网),当我发现时+reachabilityForLocalWiFi,我也注意到了+reachabilityForInternetConnection.我想我可以使用这些,而不是"www.apple.com"在那里进行硬编码,但唉,当我使用时:
self.wwanReach = [Reachability reachabilityForInternetConnection];
[wwanReach startNotifer];
self.wifiReach = [Reachability reachabilityForLocalWiFi];
[wifiReach startNotifer];
Run Code Online (Sandbox Code Playgroud)
我设置的"永不"的可达性回调被调用,对于"永不"的值,最多10分钟,12分钟,15分钟左右(这只要我的耐心持续.)(用户的耐心会少得多,我确定.)切换回+ reachabilityWithHostName:在几秒钟内工作.我也单独尝试了每个"对",以防两个通知程序同时出现问题,但没有区别.
那么:确定Internet/WWAN或本地Wifi网络(一个或两个)的可达性的适当方法是什么?
[此特定用例是连接到Mac mini计算机到计算机网络的iPhone或iPad; 我确定其他情况适用.]
我正在使用Apple的可访问性代码,并且在网络可访问性更改时以及启动服务器连接之前设置了两个初始通知.当我在wi-fi上时,代码工作,我关闭了Wi-Fi接入点.但是,当我使用wi-fi启动应用程序并使用底层宽带连接时,然后一旦应用程序运行,然后断开wi-fi路由器与宽带路由器的连接(即Wi-Fi已打开,但没有互联网连接),我做了一个可达性检查,我得到的网络状态是ReachableViaWiFi.我已经尝试了reachabilityForInternetConnection和reachabilityWithHostName.
关于Apple的可达性代码是否可用于检测wifi已连接但没有底层网络连接的情况的任何想法?
谢谢!
编辑23.5.11
我现在想知道我是不是在设计这个.当我使用在线连接时,我正确处理它 - 要么:
在后台显示进度或活动指示器,如果失败,我会显示一条合适的消息或
我调用另一个应用程序,Safari或Maps,然后进行自己的检查,如果没有连接则失败.这使用户处于失败的其他应用程序中,这不是完美的.
所以,如果我按照下面的建议行事,并且标准可达性返回无法到达,那么我必须做一个NSURLConnection,以防收音机进入睡眠状态,然后我不确定这比仅仅尝试获取在线资源更好首先.
如果有人可以提供帮助 - 我会非常感激.我几乎准备好提交,只需要做到这一点.
我使用Apple的Reachability样本通常效果很好,除非移动或蜂窝连接进入休眠状态然后回来或wifi进入,然后依赖蜂窝连接.
移动(蜂窝)连接不变时很好.这与我读过的评论一致,当蜂窝无线电关闭时你必须再次手动唤醒它.但是,我看不出怎么做.
我需要设置NSURLConnection吗?一些示例代码会很棒.当我收到没有连接的通知时,我会发送NSURLConnection并告诉用户稍后再试一次然后如果我收到一个回调说它成功了,那么从可达性中覆盖关闭设置?
另外,每当看起来没有连接时,我是否需要这样做,以防万一 - 这似乎浪费资源而不是那样.egan iPod Touch不在wifi范围内.
我也看过DDG的替代品,但看起来会有同样的问题.
任何有用的建议都会受到热烈欢迎.
谢谢,
克里斯.
reachability ×10
ios ×7
iphone ×4
networking ×4
objective-c ×3
3g ×1
app-store ×1
bandwidth ×1
cocoa ×1
cocoa-touch ×1
connectivity ×1
ios4 ×1
queue ×1
swift ×1
wifi ×1