当我尝试在我的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
}
}
Run Code Online (Sandbox Code Playgroud)
代码中的错误:

如果不可读,错误1说:
'Int'不能转换为'SCNetworkReachabilityFlags'
错误2和3:
找不到接受提供的参数的'init'的重载
我正在尝试将此代码段转换为Swift.由于一些困难,我正在努力开始起飞.
- (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的第一个和主要问题是如何定义和使用C结构.在struct sockaddr_in zeroAddress;上面代码的第一行()中,我认为他们正在定义一个zeroAddress从struct sockaddr_in(?)调用的实例,我假设.我试着宣布var这样的话.
var zeroAddress …Run Code Online (Sandbox Code Playgroud) 对于iOS 9,我使用Reachability公共类来检查设备是否连接到互联网.我将Swift 2代码转换为Swift 3,而Reachability不再适用.有人能告诉我如何检查iOS 10上的互联网连接吗?谢谢!这是代码片段:
open class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
var flags = SCNetworkReachabilityFlags()
if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
return false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
}
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在服务器中发出HTTP请求.现在我想知道它是否连接到互联网.以下是我的代码
let request = Alamofire.request(completeURL(domainName: path), method: method, parameters: parameters, encoding: encoding.value, headers: headers)
.responseJSON {
let resstr = NSString(data: $0.data!, encoding: String.Encoding.utf8.rawValue)
print("error is \(resstr)")
if $0.result.isFailure {
self.failure("Network")
print("API FAILED 4")
return
}
guard let result = $0.result.value else {
self.unKnownError()
self.failure("")
print("API FAILED 3")
return
}
self.handleSuccess(JSON(result))
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试检查用户是否具有互联网连接,并且该过程的一部分涉及调用withUnsafePointer.在Swift 1.x中,我能够使用:
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress){
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}
Run Code Online (Sandbox Code Playgroud)
但是现在使用Swift 2,我收到一个错误说法
无法使用类型为'(inout sockaddr_in,(_) - > _)'的参数列表调用'withUnsafePointer'
我看了Xcode的用法,它是:

所以我尝试使用
withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> sockaddr_in in
SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}
Run Code Online (Sandbox Code Playgroud)
以及
withUnsafePointer(&zeroAddress) {(pointer: UnsafePointer<sockaddr_in>) -> AnyObject in
SCNetworkReachabilityCreateWithAddress(nil, pointer).takeRetainedValue()
}
Run Code Online (Sandbox Code Playgroud)
它们都会产生cannot invoke...编译时错误.withUnsafePointer在Swift 2.x中使用的正确方法是什么?
我的场景看起来像这样:我有一个类中有一个函数,这个函数使用NSURLSession向服务器发出POST请求.在另一个不在该类中的函数中,我将该函数调用其中的任务,我认为它是异步运行的.我遇到以下问题:当我从服务器下载JSON响应并将其写入变量并返回它时,我写的变量仍为零,因为它没有等待线程/任务完成下载并返回初始值为nil.
所以我的问题是如何等待该任务完成然后继续整个程序.
这是我的具有请求功能的类:
class DownloadTask {
var json:NSDictionary!
var cookie:String!
var responseString : NSString = ""
func forData(completion: (NSString) -> ()) {
var theJSONData:NSData!
do {
theJSONData = try NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions())
} catch _ {
print("error")
}
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
if cookie != nil {
request.setValue(cookie, forHTTPHeaderField: "Cookie")
}
request.HTTPBody = theJSONData
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error")
return
} else { …Run Code Online (Sandbox Code Playgroud) 我需要一个功能只在系统检测到没有互联网连接时运行,然后在系统检测到互联网连接时运行另一个功能.
我在考虑这样的事情:
func onInternetConnection() {
//Enable actions
}
func onInternetDisconnection() {
//Disable actions, alert user
}
Run Code Online (Sandbox Code Playgroud)
我还需要一种方法来检测系统何时重新连接,这样我就可以让用户知道它正在重新连接,就像在Facebook的Messenger中一样.
我怎样才能做到这一点?
我正在使用Moya/Alamofire作为我的网络层.
正如问题所述,检查网站链接是否有效的最有效方法是什么?
目前我正在执行以下代码,但是当应用于20个URL的列表时,完成需要很长时间.
if let data = NSData(contentsOfURL: NSURL(string: thisURL)!) {
println(thisURL)
} else {
println("doesn't exist")
break
}
Run Code Online (Sandbox Code Playgroud) 我们正在使用 Firestore 构建一个实时聊天应用程序。我们需要处理没有 Internet 连接的情况。基本的消息发送代码如下所示
let newMsgRef = database.document(“/users/\(userId)/messages/\(docId)“)
newMsgRef.setData(payload) { err in
if let error = err {
// handle error
} else {
// handle OK
}
}
Run Code Online (Sandbox Code Playgroud)
连接设备后,一切正常。当设备未连接时,不会调用回调,也不会得到错误状态。
当设备重新上线时,记录会出现在数据库中并触发回调,但是这种解决方案对我们来说是不可接受的,因为在此期间应用程序可能已经被终止,然后我们将永远无法获得回调并能够设置状态发送的消息。
我们认为禁用离线持久性(默认情况下处于启用状态)会使其立即触发失败回调,但出乎意料的是 - 事实并非如此。
我们还尝试添加超时,在此之后发送操作将被视为失败,但是当设备重新联机时无法取消消息传递,因为 Firestore 使用其队列,这会导致更多混乱,因为消息是在接收者的方面,而我无法在发件人方面处理。
如果我们可以减少超时 - 这可能是一个很好的解决方案 - 我们将很快获得成功/失败状态,但 Firebase 不提供这样的设置。
内置离线缓存可能是另一种选择,我可以将所有写入视为成功并依赖 Firestore 同步机制,但如果应用程序在离线期间终止,则不会传递消息。
最终,我们需要一个一致的反馈机制来触发回调,或者提供一种方法来监视队列中的消息等 - 这样我们就可以确定消息已发送或尚未发送,以及何时发生。
我正在尝试跟踪网络状态.我查看了FXReachability的代码.具体如下方法.
- (void)setHost:(NSString *)host
{
if (host != _host)
{
if (_reachability)
{
SCNetworkReachabilityUnscheduleFromRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
CFRelease(_reachability);
}
_host = [host copy];
_status = FXReachabilityStatusUnknown;
_reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [_host UTF8String]);
SCNetworkReachabilityContext context = { 0, ( __bridge void *)self, NULL, NULL, NULL };
SCNetworkReachabilitySetCallback(_reachability, ONEReachabilityCallback, &context);
SCNetworkReachabilityScheduleWithRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
}
}
Run Code Online (Sandbox Code Playgroud)
它的作用是不断检查与指定主机的连接.我正在尝试将此方法转换为Swift,我遇到了一些问题.
1.将主机字符串转换为UTF8.
我必须将主机字符串转换为UTF8并将其传递给SCNetworkReachabilityCreateWithName方法.我无法UTF8String在Objective-C中找到Swift的确切属性.但是,有一个叫做属性utf8的String类型.根据文件,
您可以通过迭代其utf8属性来访问String的UTF-8表示.此属性的类型为String.UTF8View,它是无符号8位(UInt8)值的集合,一个用于字符串的UTF-8表示形式中的每个字节:
如何获得字符串的完整UTF8表示而不是无符号8位(UInt8)值的集合?
2. SCNetworkReachabilitySetCallback的回调函数.
此函数的第二个参数需要某种类型SCNetworkReachabilityCallBack.我潜入了源文件,发现它实际上是一个typealias.
typealias SCNetworkReachabilityCallBack = CFunctionPointer<((SCNetworkReachability!, …Run Code Online (Sandbox Code Playgroud)