iOS 第一次安装App时会出现 【允许"XXX"使用无线数据】 弹窗,无法请求网络

3,773 阅读2分钟

通过监听网络状态来进行对应的推送通知,让启动的页面再次请求一次网络,如果有安装 AFNetworking 的话,可以通过 AFNetworkReachabilityManager 来监听网络状态

WJNetworkHelper.h

typedef enum {
    
    StatusUnknown          = -1,//未知网络
    StatusNotReachable     = 0,//没有网络
    StatusReachableViaWWAN = 1,//手机自带网络
    StatusReachableViaWiFi = 2 //wifi
    
}WJNetworkStatus;

/** 网络状态的Block*/
typedef void(^WJNetworkStatusBlock)(WJNetworkStatus status);


@interface WJNetworkHelper : NSObject


/**
 实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
 */
+ (void)networkStatusWithBlock:(WJNetworkStatusBlock)networkStatus;


@end
WJNetworkHelper.m

+ (void)networkStatusWithBlock:(WJNetworkStatusBlock)networkStatus {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    networkStatus ? networkStatus(StatusUnknown) : nil;
                   
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    networkStatus ? networkStatus(StatusNotReachable) : nil;
            
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    networkStatus ? networkStatus(StatusReachableViaWWAN) : nil;
            
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    networkStatus ? networkStatus(StatusReachableViaWiFi) : nil;
               
                    break;
            }
        }];
    });
}

具体代码

#pragma mark ————— 网络状态监听 —————
- (void)monitorNetworkStatus{
    /*
     */
    // 网络状态改变一次, networkStatusWithBlock就会响应一次
    [WJNetworkHelper networkStatusWithBlock:^(WJNetworkStatus networkStatus) {
        
        switch (networkStatus) {
                // 未知网络
            case StatusUnknown:
                NSLog(@"网络环境:未知网络");
                // 无网络
            case StatusNotReachable:
                NSLog(@"网络环境:无网络");
                KPostNotification(KNotificationNetWorkStateChange, @NO);
                break;
                // 手机网络
            case StatusReachableViaWWAN:
                NSLog(@"网络环境:手机自带网络");
                // 第一次安装App是需要请求一次网络,以后就不需要了,所以保存一个属性 isNoNetwork 进行判断是否需要请求网络,第一次为YES,需要请求网络,以后就不需要再次请求网络了为NO
                if (SettingInfoTools.shareSettingInfoTools.isNoNetwork == YES) {
                // 发送重新请求数据的通知
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshHomeData" object:nil];
                }
                KPostNotification(KNotificationNetWorkStateChange, @YES);
                // 无线网络
            case StatusReachableViaWiFi:
                NSLog(@"网络环境:WiFi");
                if (SettingInfoTools.shareSettingInfoTools.isNoNetwork == YES) {
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshHomeData" object:nil];
                }
                KPostNotification(KNotificationNetWorkStateChange, @YES);
                break;
        }
    }];
}
// 这个接受通知的代码放到需要刷新的的VC里面,接受通知,然后进行刷新数据
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:@"refreshHomeData" object:nil];

// 有接受通知,肯定就有取消通知跟着
-(void)dealloc
{
    // 随便一个删除通知的代码都可以 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"refreshHomeData" object:nil];
    // [[NSNotificationCenter defaultCenter] removeObserver:self];
}
  • 这段代码是重新请求一次数据的代码
-(void)refreshData
{
     //  修改是否需要再次请求数据的属性,保存起来,这样以后再次启动App就不会出现请求2次的情况
    SettingInfoTools.shareSettingInfoTools.isNoNetwork = NO;
    // 保存不再请求数据的属性
    [SettingInfoTools saveSettingInfoTools];
    // 重新请求一次数据
    [self loadData];
}