iOS:如何以最简单的方式测试互联网连接,而不冻结应用程序(没有可达性)?

2024-02-10

在我的代码中,我曾经使用三种方法来检查互联网,但它们有限制:

1/可达性方法:

- (BOOL)isInternetOk
{
    Reachability *curReach = [Reachability reachabilityWithHostName:@"apple.com"];
    NetworkStatus netStatus = [curReach currentReachabilityStatus];

    if (netStatus != NotReachable) //if internet connexion ok
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

限制:它在大多数情况下都有效,但我的问题是,如果我在没有互联网的情况下连接天线Wi-Fi,它会说连接正常,但事实并非如此。这不是一个好的解决方案,我需要检查状态代码,它似乎在 Reachability 上不可用。

2/发送同步请求:

- (BOOL)isInternetOk2
{
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init];
    NSURL* URL = [NSURL URLWithString:@"https://www.google.com"];
    NSError *error = nil;

    [request setURL:URL];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setTimeoutInterval:15];

    NSData* response2 = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    if (error)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

限制:它也有效,但我的问题是,如果超时,这种情况随时都可能发生,它会在太多时间内冻结应用程序。如果我把它放在一个线程中,似乎当我在dispatch_async中发出请求时,不会考虑响应。

3/发送同步请求:

    NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"]];
    request.timeoutInterval = 10;

    [NSURLConnection sendAsynchronousRequest:request queue:myQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
         NSLog(@"response status code: %ld, error status : %@", (long)[httpResponse statusCode], error.description);

         if ((long)[httpResponse statusCode] >= 200 && (long)[httpResponse statusCode]< 400)
         {
             // do stuff
             NSLog(@"Connected!");
         }
         else
         {
             NSLog(@"Not connected!");
         }
     }];

限制:我认为这是更好的方法,但我的问题是我必须在代码中的每个地方编写它,这将是一种污染。我想知道是否有一种不太重的方法可以做到这一点。

你怎么看待这件事?有没有另一种方法可以更轻松地检查互联网是否正常工作而无需冻结应用程序?

提前致谢。


Nayem 是对的 - 您应该将第三个选项(异步网络检查)包装在类方法中,如下所示:

+ (void)checkInternetConnectivityWithSuccessCompletion:(void (^)(void))completion {

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"]];
request.timeoutInterval = 10;

[NSURLConnection sendAsynchronousRequest:request queue:myQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
     NSLog(@"response status code: %ld, error status : %@", (long)[httpResponse statusCode], error.description);

     if ((long)[httpResponse statusCode] >= 200 && (long)[httpResponse statusCode]< 400)
     {
         // do stuff
         NSLog(@"Connected!");
         completion();
     }
     else
     {
         NSLog(@"Not connected!");
     }
 }];
}

然后像这样调用该方法:

[YourClass checkInternetConnectivityWithSuccessCompletion:^{
    // your internet is working - add code here
}];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:如何以最简单的方式测试互联网连接,而不冻结应用程序(没有可达性)? 的相关文章

  • 如何强制下载图片?

    我的页面上有一个动态生成的图像 如下所示 img src 我不想告诉我的用户右键单击图像并点击保存 而是想公开一个下载链接 单击该链接将提示下载图像 如何实现这一目标 最初我在 js 中尝试这样做 var path my image att
  • 将 Hbase 与 PHP 集成 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经安装了 Hbase 现在我正在寻找一些 PHP 库来将 hbase 与 PHP 集成 我尝试了 2 个库 第一个是我尝试与 th
  • SimpleXML 返回空数组

    我正在尝试使用 Google Maps API 和 PHP SimpleXML 获取城市的纬度和经度 我尝试这样做 xml simplexml load file http maps googleapis com maps api geoc
  • R - 加速近似日期匹配。 idata.frame?

    我正在努力有效地执行两个数据帧之间的 关闭 日期匹配 这个问题探索了一个解决方案 使用idata frame来自plyr包 但我也对其他建议的解决方案感到非常满意 这是两个数据框的非常简单的版本 sampleticker lt data f
  • Powershell 中的“$”是什么?

    是什么意思 在 Powershell 中 Edit TechNet 答案 http technet microsoft com en us library hh847768 aspx同义反复 没有解释 成功 或 失败 的含义 包含上次操作的
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • CUDA 添加矩阵的行

    我试图将 4800x9600 矩阵的行加在一起 得到一个 1x9600 的矩阵 我所做的是将 4800x9600 分成 9 600 个矩阵 每个矩阵长度为 4800 然后我对 4800 个元素进行缩减 问题是 这真的很慢 有人有什么建议吗
  • 缓存感知树的实现

    I have a tree where every node may have 0 to N children 用例是以下查询 给定指向两个节点的指针 这些节点是否位于树的同一分支内 Examples q 2 7 gt true q 5 4
  • 无法完成添加 Android 证书的构建

    我刚刚完成构建我的应用程序 我发送了一个没有证书的构建版本 它工作了 现在添加一个 android 证书 它在我的代号 one 仪表板上报告构建错误 如有帮助 将不胜感激 失败 构建失败并出现异常 出了什么问题 执行 任务失败 transf
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已
  • Jenkins 通过 ssh 发布显示错误“jenkins.plugins.publish_over.BapPublisherException:无法添加 SSH 密钥。”

    为了使用 ssh 连接 jenkins 与远程服务器 我在 jenkins 中安装了通过 SSH 发布的插件 但配置后 它显示错误为 jenkins plugins publish over BapPublisherException 无法
  • 在并行包中的 R 的 par*apply 函数内部使用 Rcpp 函数

    我试图了解背后发生的事情Rcpp sourceCpp 调用并行环境 最近 问题中部分解决了这个问题 在 Windows 上使用 parLapply 中的 Rcpp 函数 https stackoverflow com questions 2
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu
  • React Native 0.61 中引入的快速刷新不起作用

    也发表在https github com facebook react native issues 27583 https github com facebook react native issues 27583 更新 一天过去了 我再次
  • 在 Navicat Premium 中连接到 LocalDB 服务器

    Recently I installed LocalDb Serer on my laptop I am trying to establish a connection between Navicat and LocalDB server
  • Ada 中的 In/Out 与 Out

    我有一个简短的艾达问题 如果我有一个程序may写出一个变量 或者我might不用管它 它应该是一个Out参数或In Out范围 我想这可以归结为一个问题 如果调用者调用参数如下的过程 它会看到什么Out但该过程不触及参数 它看到相同的值吗
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print
  • 将 R 中的列中的单引号替换为双引号

    我在 R 中的数据框有一个 A 列 其中有带单引号的字符串数据 Column A Hello World Hi World Good morning world 我想做的是将单引号替换为双引号并实现如下所示的输出 Column A Hell

随机推荐

  • 通过 WordPress 中的functions.php 自动创建新用户

    我需要通过代码添加具有管理员角色的新用户 我发现了以下代码 add action init add user function add user username username123 password pasword123 email
  • 防止热链接到图像和文件

    我有几个图像和 PDF 文件 并且我看到其他几个网站正在直接将这些文件复制到他们的服务器 我有更好的方法来防止这种情况 我尝试了 cpanel 热链接保护 但在这种情况下 我必须为每个允许但不可能提供的 URL 提供链接 因此 请告诉我更好
  • “perl”本身有手册页吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道什么perl T means
  • 识别android中的DTMF音

    我计划在 android 中创建一个 centerx 系统应用程序 其中有一个语音信箱会设置在接收方 根据语音邮件中的指示 呼叫者必须按下拨号盘中的号码 接收方应识别该号码并执行相应的操作 有谁知道如何在接收方检测呼叫者按下的号码 其背后的
  • 如何使用 OpenXML 和 C# 从 Excel 文档中的合并单元格获取值

    我在合并单元格时遇到问题 如果我在第一个单元格 B3 中有值 并且该单元格与其他一些单元格 例如 C3 D3 E3 F3 F4 合并 在 Excel 文档中我只能看到一个值 这很棒 但当我请求 C3 D3 E3 F3 值时 我想从 GetC
  • 在 WIX 中运行时动态为快捷方式分配名称

    我想根据用户输入为快捷方式分配不同的名称 使用 WiX 工具集是否可行 我尝试将财产价值分配给Name的属性Shortcut元素 但它不起作用 的名称栏快捷方式表 http msdn microsoft com en us library
  • 在 Ionic 2 中,如何创建使用 Ionic 组件的自定义指令?

    创建基本指令很简单 import Component from angular2 core Component selector my component template div Hello div export class MyComp
  • 当状态改变时,React-typing-animation 不会重新渲染

    我有以下组件 import React Component from react import Typing from react typing animation export class InfoDisplayer extends Co
  • 如何在使用hadoop时使用logger api编写java日志文件

    我写了一个我想调试的地图缩减代码 为此 我无法使用标准输出 因为除非发生错误 否则 Hadoop 平台不会将其打印到屏幕上 相反 我尝试使用记录器来创建日志文件 我使用处理程序将其拆分为两个文件 不幸的是 严重 日志文件为空 而通用日志文件
  • java.io.IOException:Android 设备上没有剩余空间

    我们在 Android 市场上有应用程序 我们的用户从这个错误中得到了很多 java io IOException 设备上没有剩余空间 从我到目前为止发现的情况来看 我知道他们的外部存储上有足够的空间 而且这只发生在 Android 2 x
  • 如何使用openCV python从文本文档中删除水印?

    我是 OpenCV 新手 我需要帮助从该图像中删除水印 我尝试使用修复 但我想要一种更自动化的特征映射和修复方式 请帮助我 如果您的所有图像都是这样的并且具有水印 如具有浅灰色水印的问题所示 那么简单的阈值操作将起作用 import cv2
  • Flask 和 React - Spotify 授权后处理令牌

    我已经在我的应用程序中实现了 JWT 用于用户登录 在 Spotify Auth 之前 如下所示 Flask auth blueprint route auth login methods POST def login user get p
  • 快速:didSelectRowAtIndexPath

    我有 tableViewController 我想点击 1 个单元格并获取print 0 然后点击2个单元格并得到print 1 但我的代码不起作用 为什么 import UIKit class MasterViewController U
  • Laravel 身份验证登录不起作用

    我是 Laravel 的新手 我正在开发 Laravel 身份验证系统 虽然注册有效 但登录没有执行任何操作 用户控制器 php class UserController extends Controller public function
  • 2 状态可舍入数字文本框与knockoutjs

    我想要一个具有 2 个状态的 html 数字文本框 当聚焦时 它必须显示所有小数位 当焦点丢失时 只显示 2 位小数 我几乎已经实现了 HTML
  • 如何向服务器发送数据

    我想做一个登录 那么如何将用户名和密码发送到我的服务器呢 我为服务器编写了一个 php 脚本 他将收到用户名和密码 如果用户名和密码正确 他将响应 成功 那么如何发送到服务器呢 用 onResponse 发送后呢 您可以使用 OkHttp
  • 在 R 中安装包时出现警告

    我一直在尝试在 R 中安装 ggplot2 包 这是我收到的警告 read dcf file path pkgname DESCRIPTION c Package Type 中的错误 无法打开连接 另外 警告消息 1 在 download
  • 将括号内第一个单词的第一个字母大写

    我想将括号内每个字符串的第一个字母大写 如果我们有这个字符串 const text This forest or jungle is really beautiful 期望的结果是 This Forest or jungle is Real
  • 点表示法与方法表示法

    我正在深入研究 iOS 编程 但我很难理解点表示法和方法表示法的想法 据我了解 点表示法可用于调用属性上的 setter getter 并且写入 读取更加清晰 方法表示法用于向对象发送消息以对其进行操作等 有人可以给我一个简单的解释 解释为
  • iOS:如何以最简单的方式测试互联网连接,而不冻结应用程序(没有可达性)?

    在我的代码中 我曾经使用三种方法来检查互联网 但它们有限制 1 可达性方法 BOOL isInternetOk Reachability curReach Reachability reachabilityWithHostName appl