iOS切换备用服务器/备用域名
iOS切换备用服务器/备用域名
hao1208hao 发表于1年前
iOS切换备用服务器/备用域名
  • 发表于 1年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 请求网络时检测当前请求域名是否可用,不可用时则切换到备用域名,保证请求不会因为服务器挂掉影响app正常使用

        如果正在使用的APP突然间不能正常访问了,,遇到这种情况,该怎么办呢,做为一个开发菜鸟,这个需求其实公司的技术大牛已经考虑到了,并已经给出 了解决方案,但领导觉得解决的还不是太好,所以我们重新实现了下,逻辑 :每次发网络请求都先验证下主域名服务器是否可用,如果可用则请求主域名服务器, 如果不可用,则请求备用服务器。下面贴出代码

1、导入Reachability

​//引用 Reachability  检测设备是否可以正常请求网络

2、自己定义工具类  Tool.h

#import

#import "Reachability.h"

typedefvoid(^getValidDomainBlock)(NSString *);

@interface Tool : NSObject

//传入2个参数   第一个参数表示默认请求的地址  第二个参数表示为备用请求地址

+(void)checkValidDomain:(NSString*)mainDomainandSpareDomain:(NSString*)backupDomainCompleteBlock:(getValidDomainBlock)block;

@end

3、Tool类实现 Tool.m          //如果url 没有http/https   默认拼接 https://

#import "Tool.h"

@implementation Tool

+(void)checkValidDomain:(NSString*)mainDomainandSpareDomain:(NSString*)backupDomainCompleteBlock:(getValidDomainBlock)block

{

   if (![self checkNetWorkState]) {

       NSLog(@"网络异常,请检查您的网络设置!");

       return;

   }

   if (![mainDomain containsString:@"http"]){

       mainDomain =[NSStringstringWithFormat:@"https://%@",mainDomain];

   }

   if (![backupDomain containsString:@"http"]) {

       backupDomain =[NSStringstringWithFormat:@"https://%@",backupDomain];

   }

   if (mainDomain.length&& backupDomain.length) {

       dispatch_async(dispatch_get_global_queue(0,0), ^{

          if([selfcheckDomain IsValid:mainDomain]){

             //主域名可用

             if (block) {

                 block(mainDomain);

             }

          }else{

             //主域名不可用检测从域名

             if ([selfcheckDomain IsValid:backupDomain]){

                 //从域名可用

                 if (block) {

                    block(backupDomain);

                 }

             }else{

                 //从域名不可用结果为空

                 if (block) {

                    block(@"");

                 }

             }

          }

       });      

   }else{

       //param invalid

       NSLog(@"paraminvalid");

   }

}

+(BOOL)checkDomainIsValid:(NSString*)domainStr

{

   NSURL *url =[NSURLURLWithString:domainStr];

   NSURLRequest *request =[NSURLRequestrequestWithURL:urlcachePolicy:NSURLRequestReloadIgnoringCacheDatatimeoutInterval:30.0];

   NSHTTPURLResponse *response = nil;

   NSError *error =nil;

   [NSURLConnectionsendSynchronousRequest:requestreturningResponse:&response error:&error];

   if (response.statusCode== 200) {

       returnYES;

   }else{

       returnNO;

   }

}

#pragma mark-监听网络回调

//检测当前网络是否可用

+(BOOL)checkNetWorkState{

   Reachability* r =[Reachability reachabilityWithHostname:@"www.baidu.com"];

   switch ([r currentReachabilityStatus]) {

       caseNotReachable:

          //没有网络连接

          returnNO;

          break;

       caseReachableViaWWAN:

          //使用3G网络

          returnYES;

          break;

       caseReachableViaWiFi:

          //使用WiFi网络

          returnYES;

          break;

   }

   

   returnYES;

}

@end

调用示例

NSString* url= @"google.com.hk";

​ NSString* url2 = @"www.baidu.com";

  [Tool checkValidDomain:url andSpareDomain:url2 CompleteBlock:^(NSString *validDomain) {

       if (validDomain.length) {

          NSLog(@"*****当前可使用的url是*********=%@",validDomain);

       }else{

          NSLog(@"请传入正确的域名后再试!");

       }

   }];

以上仅供参考,菜鸟第一次写,如果有什么问题,请大家见谅。当然有更好的方案,请各位不吝赐教。

共有 人打赏支持
粉丝 0
博文 3
码字总数 2237
×
hao1208hao
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: