iOS查看当前网络连接状态 弱网检测

方法一:

1.在AppDelegate的声明文件中增加网络状态属性:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, assign, readonly) ReachabilityStatus networkStatus;
@end

2.在AppDelegate的实现文件中使用RAC监听绑定网络状态:

- (void)configNetworkStatus {
    [GLobalRealReachability startNotifier];
    
    RAC(self,networkStatus) = [[[[[NSNotificationCenter defaultCenter] rac_addObserverForName: kRealReachabilityChangedNotification object: nil] map:^id(NSNotification *notif) {
        
        return  @([notif.object currentReachabilityStatus]);
        
    }] startWith: @([GLobalRealReachability currentReachabilityStatus])] distinctUntilChanged];
}

方法二:

+ (BOOL)isConnectedToNetwork
{
    // 创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    
    /**
     *  SCNetworkReachabilityRef: 用来保存创建测试连接返回的引用
     *
     *  SCNetworkReachabilityCreateWithAddress: 根据传入的地址测试连接.
     *  第一个参数可以为NULL或kCFAllocatorDefault
     *  第二个参数为需要测试连接的IP地址,当为0.0.0.0时则可以查询本机的网络连接状态.
     *  同时返回一个引用必须在用完后释放.
     *  PS: SCNetworkReachabilityCreateWithName: 这个是根据传入的网址测试连接,
     *  第二个参数比如为"www.apple.com",其他和上一个一样.
     *
     *  SCNetworkReachabilityGetFlags: 这个函数用来获得测试连接的状态,
     *  第一个参数为之前建立的测试连接的引用,
     *  第二个参数用来保存获得的状态,
     *  如果能获得状态则返回TRUE,否则返回FALSE
     *
     */
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    
    if (!didRetrieveFlags)
    {
        printf("Error. Could not recover network reachability flagsn");
        return NO;
    }
    
    /**
     *  kSCNetworkReachabilityFlagsReachable: 能够连接网络
     *  kSCNetworkReachabilityFlagsConnectionRequired: 能够连接网络,但是首先得建立连接过程
     *  kSCNetworkReachabilityFlagsIsWWAN: 判断是否通过蜂窝网覆盖的连接,
     *  比如EDGE,GPRS或者目前的3G.主要是区别通过WiFi的连接.
     *
     */
    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
    return (isReachable && !needsConnection) ? YES : NO;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,833评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,966评论 25 709
  • 事情不是原来模样,而是以为的那样。 【进度汇报】 1、锻炼身体:43500步/210000步 2、早睡早起:3/2...
    刘旭晖阅读 1,513评论 1 1
  • 1. NewSQL NewSQL:这是一种完全不同的数据库架构。NoSQL 的一个优点是横向扩展能力,缺点是没有提...
    天之蓝色阅读 5,113评论 0 1
  • 太宰治说,胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤。 丧 长这么大我最自豪的一件事是初中老师在课堂...
    魔术师之妻阅读 2,761评论 0 0

友情链接更多精彩内容