我正在检查网络连接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恢复,所以我可以相应地进行更改.
如何调整我的方法来做那样的事情?
我正在指定一个iOS应用程序(将在我们公司之外构建),它将用户的数据条目上传到服务器.如果设备未连接到Internet,我们希望在设备上保存数据并在重新连接网络时上传数据.(该应用程序将主要在大多数时间将断开连接的iPod Touch设备上运行).
如果用户在重新连接网络后解锁设备并重新打开我们的应用程序,那么上传到服务器应该很容易,因为应用程序正在运行.
但是,如果应用程序没有运行,"未运行"可能意味着以下一个或多个:
在上述情况下,有没有办法(理想情况下是节省电池的方式)确保在恢复互联网连接后很快上传本地数据?答案是否有所不同取决于上述哪些案例导致应用程序无法运行?
是否有设备所需的最低iOS版本,以便在应用程序未运行时仍能上传部分(或全部)上述未运行的案例?
如果这些是明显的新手问题我很抱歉 - 我不是iOS专家.
我正在努力获得真实的互联网连接状态.我已经使用了Apple的Reachability但它只给了我wifi连接的状态,即没有覆盖设备通过wifi连接(到路由器或热点)的情况,但wifi路由器或热点本身没有连接到互联网.通过从wifi路由器拉入互联网输入电缆可以重现这种情况.ReachableViaWiFi两个reachabilityForInternetConnection和的可达性通知程序返回ReachabilityWithHostName.我对这个问题非常感兴趣.我通过它尝试了它,NSURLConnection但是电池耗尽过多而且个人我不喜欢那种继续发出URL请求的解决方案,尽管在后台线程中.
这是我正在使用的代码(由SO老师提供,但不记得确切的链接)
[[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.com"] retain];
[hostReachable startNotifier];
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.");
self.isInternetReachable = NO;
break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is working via …Run Code Online (Sandbox Code Playgroud) 帮助我理解使用网络链接调节器测试可达性代码时所看到的内容.这是我的香草可达性代码:
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请求,但不允许任何数据包通过?
我一直在通过互联网搜索,以找到在iOS中检查互联网连接的最佳方法,该方法适用于IPv4和IPv6网络环境.我发现有很多可能的答案,但很难混淆哪一个适用.我需要做的是以下内容:
// Check for internet connection
if (internetConnectionIsAvailable) {
// make rest calls
}else
// show cached data
}
Run Code Online (Sandbox Code Playgroud)
我在互联网上找到了以下选项.
选项1: 使用apple Reachability类
有了Reachability我可以检查互联网连接如下,这是短而直接的,不必等待任何响应.
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
- (void)viewDidLoad {
[super viewDidLoad];
if (![self connected]){
// Not connected
}else{
// Connected
}
}
Run Code Online (Sandbox Code Playgroud)
但是这里互联网检查是在飞行前完成的,这违反了WWDC视频上看到的苹果工程师的建议.此外,如果您检查ReadMe.md,则提到Reachability完全支持IPv6.但是如果在Reachability.m中检查了方法reachabilityForInternetConnection,则他们使用了sockaddr_in,但是没有使用sockaddr_in6,这是推荐用于IPv6网络的.所以我不知道它是否适用于IPv6网络.
选项2:使用Alamofire进行连接
只是尝试连接,如stackoverflow中的一个回答.代码如下所示: -
Alamofire.request(.GET,"http://superrandomdomainnamethatisnotused.com/superrandompath").responseString {
(request, response, stringData, error) in
if let networkError …Run Code Online (Sandbox Code Playgroud)好吧,所以我对Swift很新,我对我要做的事情有点困惑,或者我是否朝着错误的方向前进.(https://github.com/ashleymills/Reachability.swift)
这是我的viewDidLoad方法:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
checkConnection()
}
Run Code Online (Sandbox Code Playgroud)
然后,我从Reachability GitHub项目中获得了一个带有代码的函数:
func checkConnection() {
//declare this property where it won't go out of scope relative to your listener
let reachability = Reachability()!
reachability.whenReachable = { reachability in
// this is called on a background thread, but UI updates must
// be on the main thread, like this:
DispatchQueue.main.async {
if reachability.isReachableViaWiFi {
print("Reachable …Run Code Online (Sandbox Code Playgroud) 我的iPhone应用程序正在开发中遇到一个非常奇怪的崩溃.似乎每当我向朋友展示我的应用程序时它都会崩溃,但是否则它永远不会崩溃.在被墨菲的法律方面普遍迷惑之后,我已经确定了崩溃的模式 - 纽约市地铁.我使用地铁后,我的应用程序一直崩溃.我已将这个问题追溯到我的使用Reachability.应用程序在无网络情况(不包括飞行模式)下使用后,下次崩溃.Reachability在执行任何其他网络操作之前,我遵循Apple的指导原则并检查连接,但我发现了一些有关如何调用它的相互矛盾的文档.
目前我正在做这样的事情:
-(BOOL)reachable {
Reachability *r = [Reachability reachabilityWithHostName:@"www.stackoverflow.com"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if(internetStatus == NotReachable) {
return NO;
}
return YES;
Run Code Online (Sandbox Code Playgroud)
}
我正在调用与viewDidAppear调用的方法同步.
if ([self reachable]== YES) {
... do network stuff ...
Run Code Online (Sandbox Code Playgroud)
它基于iOS 4 Reachability Guide的代码
我的问题:是否正确使用Reachability它将处理此错误并处理缺少3G或Wifi网络?我是否需要生成另一个线程或执行某些操作来删除同步调用?
顺便说一句,这是我在应用程序崩溃时看到的崩溃日志,这让我认为这是一个同步/异步问题.
Application Specific Information: (app name) failed to resume in time Elapsed total CPU time (seconds): 3.280 (user 1.770, system 1.510), 33% CPU Elapsed application CPU time (seconds): 0.040, 0% …
我有个问题.我正在使用可达性的reachabilityForInternetConnection方法来检测互联网可用性,但我没有获得连接状态而不是互联网状态.我的意思是,如果我打开我的Wifi连接,该方法给了我正确的指示,我没有连接但是如果wifi打开并且互联网连接不起作用,它似乎不起作用.任何的想法?
最好的祝福
我正在开发一个需要VPN连接进行数据同步的应用程序.我正在使用可达性类来检查主机可用性.
@Functionality: - 当应用程序通过Junos Pulse应用程序连接到VPN时,如果VPN连接丢失,应继续进行数据同步,它应该抛出Alert消息.现在它正在为下面给出的场景工作.
@Working场景: - VPN最初连接,我完成了同步,然后从Junos Pulse手动断开了VPN.现在我想再次同步,它正在投掷预期的警报.
@Problem Scenarion: - 我最初完成了同步并让应用程序空闲以自动断开VPN连接.现在VPN消失之后我又想再次同步.它没有通过VPN不在那里的警报.它会尝试同步功能并因为没有VPN而无法访问服务器而失败.
通过在互联网上搜索它的解决方案我很累.我在这里粘贴我的代码片段.任何建议都非常感谢.
-(BOOL)checkHostAvailability
{
Reachability *objReach = [Reachability reachabilityWithHostName:[self hostServer]];
NetworkStatus hostAvailability = [objReach currentReachabilityStatus];
if(hostAvailability == ReachableViaWiFi || hostAvailability == ReachableViaWWAN) {
RLog(@"Host is Reachable");
return YES;
}
return NO;
}
Run Code Online (Sandbox Code Playgroud) 如何检查特定网站的可达性?
我连接到wifi网络上网,这已经阻止了一些网站.如何检查我是否可以访问这些网站?
我已经检查了Reachability类,但我无法检查特定的网站.
目前我正在使用Reachability.swift
reachability ×10
ios ×7
iphone ×3
objective-c ×3
swift ×3
cocoa ×1
cocoa-touch ×1
connection ×1
multitasking ×1
networking ×1
vpn ×1
xcode ×1