相关疑难解决方法(0)

检查与Swift的互联网连接

当我尝试在我的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'的重载

xcode reachability ios swift

238
推荐指数
18
解决办法
20万
查看次数

如何在Swift中使用SCNetworkReachability

我正在尝试将此代码段转换为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)

c struct reachability ios swift

97
推荐指数
4
解决办法
4万
查看次数

检查互联网连接(iOS 10)

对于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)

internet-connection swift3 ios10

49
推荐指数
4
解决办法
5万
查看次数

如何检查alamofire中的互联网连接?

我使用下面的代码在服务器中发出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)

reachability ios swift alamofire

23
推荐指数
4
解决办法
3万
查看次数

withSnsafePointer in Swift 2

我正在尝试检查用户是否具有互联网连接,并且该过程的一部分涉及调用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中使用的正确方法是什么?

swift swift2

16
推荐指数
1
解决办法
5627
查看次数

等待下载任务在NSURLSession中完成

我的场景看起来像这样:我有一个类中有一个函数,这个函数使用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)

asynchronous nsthread swift

10
推荐指数
1
解决办法
7505
查看次数

如何在iOS上检测互联网连接的变化,委托风格?

我需要一个功能只在系统检测到没有互联网连接时运行,然后在系统检测到互联网连接时运行另一个功能.

我在考虑这样的事情:

func onInternetConnection() {
    //Enable actions
}

func onInternetDisconnection() {
    //Disable actions, alert user
}
Run Code Online (Sandbox Code Playgroud)

我还需要一种方法来检测系统何时重新连接,这样我就可以让用户知道它正在重新连接,就像在Facebook的Messenger中一样.

我怎样才能做到这一点?

我正在使用Moya/Alamofire作为我的网络层.

ios swift alamofire moya

6
推荐指数
1
解决办法
1633
查看次数

检查网页是否有效的最有效方法?

正如问题所述,检查网站链接是否有效的最有效方法是什么?

目前我正在执行以下代码,但是当应用于20个URL的列表时,完成需要很长时间.

if let data = NSData(contentsOfURL: NSURL(string: thisURL)!) {
    println(thisURL)
} else {
    println("doesn't exist")
    break
}
Run Code Online (Sandbox Code Playgroud)

swift

5
推荐指数
1
解决办法
83
查看次数

设置Firestore文档时如何检测缺少网络连接

我们正在使用 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 同步机制,但如果应用程序在离线期间终止,则不会传递消息。

最终,我们需要一个一致的反馈机制来触发回调,或者提供一种方法来监视队列中的消息等 - 这样我们就可以确定消息已发送或尚未发送,以及何时发生。

firebase swift google-cloud-firestore

5
推荐指数
1
解决办法
2888
查看次数

使用Swift的C API

我正在尝试跟踪网络状态.我查看了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的确切属性.但是,有一个叫做属性utf8String类型.根据文件,

您可以通过迭代其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)

c callback utf-8 ios swift

4
推荐指数
1
解决办法
3810
查看次数