JLChen
2021-05-18 a869383e163a18cdedcf587383c1eca043129754
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//
//  Copyright © 2020 dahua. All rights reserved.
//
 
#import "LCNetTool.h"
#import <SystemConfiguration/CaptiveNetwork.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <AFNetworking/AFNetworking.h>
 
@interface LCNetTool ()
 
@property (nonatomic, strong) CLLocationManager *locManager;
 
@property (nonatomic, copy) void (^ netToolSSID)(NSString *ssid);
 
@end
 
static LCNetTool *tool = nil;
 
@implementation LCNetTool
 
+ (instancetype)shareManager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        tool = [LCNetTool new];
    });
    return tool;
}
 
- (CLLocationManager *)locManager {
    if (!_locManager) {
        _locManager = [[CLLocationManager alloc] init];
    }
    return _locManager;
}
 
- (void)lc_CurrentWiFiName:(void (^)(NSString *ssid))block {
    self.netToolSSID = block;
    [self locManager];
    if (@available(iOS 13.0, *)) {
        //用户明确拒绝,可以弹窗提示用户到设置中手动打开权限
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
            //使用下面接口可以打开当前应用的设置页面
            [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
            return;
        }
 
        if (![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
            //弹框提示用户是否开启位置权限
            [self.locManager requestWhenInUseAuthorization];
            return;
        }
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) {
            [self getSSID];
            return;
        }
    } else {
        [self getSSID];
    }
}
 
- (void)getSSID {
    NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
    id info = nil;
    for (NSString *ifnam in ifs) {
        info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
 
        if (info && [info count]) {
            break;
        }
    }
    NSString * ssid = info[@"SSID"];
    if (self.netToolSSID) {
        self.netToolSSID(ssid ? ssid : @"");
    }
}
 
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse ||
        status == kCLAuthorizationStatusAuthorizedAlways) {
        //再重新获取ssid
        [self getSSID];
    }
}
 
+ (LCNetStatus)lc_CurrentNetStatus {
    AFNetworkReachabilityStatus status = [[AFNetworkReachabilityManager sharedManager] networkReachabilityStatus];
    NSLog(@"");
    return (LCNetStatus)status;
}
 
+ (void)lc_ObserveNetStatus:(void (^)(LCNetStatus status))netStatus {
    //创建网络监听对象
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //开始监听
        [manager startMonitoring];
        //监听改变
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                case AFNetworkReachabilityStatusNotReachable: {
                    netStatus(LCNetStatusOFFLine);
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"NETCHANGE" object:@(LCNetStatusOFFLine) userInfo:nil];
                }
                break;
                case AFNetworkReachabilityStatusReachableViaWWAN: {
                    netStatus(LCNetStatusWWAN);
                     [[NSNotificationCenter defaultCenter] postNotificationName:@"NETCHANGE" object:@(LCNetStatusWWAN) userInfo:nil];
                }
                case AFNetworkReachabilityStatusReachableViaWiFi: {
                    netStatus(LCNetStatusWiFi);
                     [[NSNotificationCenter defaultCenter] postNotificationName:@"NETCHANGE" object:@(LCNetStatusWiFi) userInfo:nil];
                }
                break;
            }
        }];
    });
}
 
@end