当我尝试在我的iPhone上检查互联网连接时,我收到了一堆错误 . 任何人都可以帮我解决这个问题吗?
代码:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection) ? true : false
}
}
代码中的错误:
如果不可读,错误1说:
'Int'不能转换为'SCNetworkReachabilityFlags'
错误2和3:
找不到接受所提供参数的'init'的重载
12 回答
Xcode 8.3 • Swift 3.1
为了解决评论中提到的4G问题,我使用了@AshleyMills可达性实现作为参考并重写了Swift 3.1的Reachability:
Reachability.swift文件
将此添加到您的AppDelegate didFinishLaunchingWithOptions方法
和视图控制器示例:
Sample Project
For Swift 3, Swift 4 (working with cellular and Wi-Fi):
Usage:
在项目中创建一个新的Swift文件,将其命名为
Reachability.swift
. 将以下代码剪切并粘贴到其中以创建您的类 .您可以使用以下代码检查项目中任何位置的互联网连接:
如果用户未连接到Internet,您可能需要向他们显示警告对话框以通知他们 .
Explanation:
我们正在制作一个可重复使用的公共类和一种方法,可以在项目的任何地方使用它来检查互联网连接 . 我们需要添加Foundation和System Configuration框架 .
在公共类Reachability中,方法
isConnectedToNetwork() -> Bool { }
将返回有关Internet连接的bool值 . 我们使用if循环对case进行必要的操作 . 我希望这已经足够了 . 干杯!如果有人已经在使用Alamofire那么 -
Usage:
我已经检查过没有Cocoa Pods / Dependancy Manager的实施Ashley Mill的Reachability类 . 我们的想法是在项目中使Reachability依赖免费 .
Xcode 7.2 - Swift 2.1
1)https://github.com/ashleymills/Reachability.swift . 下载将Reachability类添加到项目中 .
注意:添加时,请确保勾选“复制项目(如果需要)” .
2)创建一个AppManager.swift类 . 此类将作为公共模型类来提供,其中将添加公共方法和数据,并且可以在任何VC中使用 .
3)组建代表班 . 我使用委托方法来通知连接状态 .
4)制作UIViewController的Parent类(继承方法) . 父类具有可访问所有子VC的方法 .
5)在AppDelegate中启动实时Internet连接监控 .
6)我添加了一个Swift文件名AppReference来存储常量枚举值 .
7)在ViewController上(例如,只有在网络可用时才想调用API)
样本可以下载@ https://github.com/alvinreuben/Reachability-Sample
升级到Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
刚刚为自己想出了这个 .
Xcode:7.3.1,iOS 9.3.3
在我的项目中使用ashleymills/Reachability.swift作为Reachability.swift,我创建了以下函数:
只需调用
hasConnectivity()
,您需要检查连接 . 这适用于Wifi和Cellular .添加ashleymills的Reachability.swift,这样人们就不必在站点之间移动:
我使用NSTimer和Alamofire制作了自己的解决方案:
NSTimer用作超时,并且由于使用Alamofire超时的结果不可靠而被使用 . 请求应该是您信任的可靠URL,例如您自己的服务器或托管您所依赖的服务的服务器 .
当计时器到期时,取消请求并使用完成处理程序返回结果 .
用法:
如果您使用的是Alamofire,您可以这样做:
这里我的解决方案为swift 2.3与lib(Reachability.swift)
进入你的
Podfile
并添加:然后进入你的
terminal
:然后创建一个新文件
ReachabilityManager
并在下面添加代码:怎么用呢:
进入
AppDelegate.swift
并添加以下代码:然后,当您要检查设备是否已连接到互联网时:
虽然它没有直接回答你的问题,但我想提一下Apple对这个话题的接受:
https://developer.apple.com/videos/play/wwdc2018/714/
在09:55左右,他谈到做你要问的这些事情:
检查连接
如果连接 - >做某事
如果没有连接 - >做其他事情(等等?重试?)
但是,这有一些陷阱:
如果在步骤2中它表示有连接,但0.5秒后他没有连接怎么办?
如果用户在代理后面怎么办?
最后但并非最不重要的,如果此处的某些答案无法确定连接性,该怎么办? (我相信如果你快速切换你的连接,去wi-fi并关闭它(只是让它变得复杂),它几乎永远不能正确地确定我有没有连接) .
来自视频的引用:"There is no way to guarentee whether a future operation will succeed or not"
为了更好地联网,请执行以下操作:
将
waitsForConnectivity
设为true(https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity)响应委托方法
taskIsWaitingForConnectivity
(https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession) . 这是Apple推荐的检查连接的方法,如33:25的视频中所述 .根据谈话, there shouldn't be any reason to pre-check whetever you got internet connection or not, since it may not be accurate at the time you send your request to the server .
在下面的代码的帮助下,您可以检查蜂窝网络和WiFi的互联网连接 . 语言 - Swift 3.0
对于swift 3,我无法使用RAJAMOHAN-S解决方案中的可达性,因为如果有WiFi但没有互联网,它会返回“true” . 因此,我通过URLSession类和完成处理程序实现了第二次验证 .
这是全班 .
你这样称呼它,例如: