Swift URLSession 网络请求

  • Virle
  • 6 Minutes
  • August 6, 2018

使用Swift API 发送请求

环境

操作

  1. 创建URLSession
  2. 创建URLSessionTask
  3. 捕获Response
  4. 执行Task
1
2
3
4
5
6
7
8
9
let url = URL(string: "https//www.baidu.com") //创建url
// let url = URL(string: "http//www.baidu.com")
//创建dataTask 并捕获结果
let dataTask = URLSession.shared.dataTask(with: url!) { (data, response, error) in
// 错误退出
if let error = error {
print(error)
return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 状态码判断
guard let httpResponse = response as? HTTPURLResponse,(200 ... 299).contains(httpResponse.statusCode) else {
print("wrong statusCode")
return
}
// 判断返回结果类型,输出内容
if let mimeType = httpResponse.mimeType, mimeType == "text/html",
let data = data,
let string = String(data: data, encoding: .utf8){
print(string)
}
}
// 执行
dataTask.resume()

可能出现的问题

http协议的请求无法访问 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

编辑 info.plist 文件

Information Property List 点击 + , 添加 App Transport Security Settings ,点击 + 添加子属性 Allow Arbitrary Loads 设置值为 YES

无法连接到网络/找不到 dns A server with the specified hostname could not be found.

错误日志:

nw_resolver_create_dns_service_locked DNSServiceCreateDelegateConnection failed:

NSErrorFailingURLStringKey=http://www.baidu.com/, NSErrorFailingURLKey=http://www.baidu.com/, _kCFStreamErrorDomainKey=10, _kCFStreamErrorCodeKey=-72000, NSLocalizedDescription=A server with the specified hostname could not be found.}

点击项目左侧导航栏中的项目名称,右侧顶部标签选择 Capabilities 找到第一项 NetWork 勾选 Incoming Connections (Server)Outgoing Connections (Client)

或者干脆直接把App SandBox关了

总结

Swift 相关的信息网上比较少,尤其在百度环境下,基本上没找到任何有用的信息,全都是无用的复制粘贴帖子,而且 Swift版本已经更新至 4, 很多方法已经过时或被删除或类名修改。遇到问题最好还是去 Google,Stack Overflow 。

网上的教程可以作为参考,本文中的代码在以后的版本也许不适用,所以使用还得借助官方的文档,文档可以在官网或 X Code 中找到 ( Shift + Command + 0 / Help - Developer Documentation)