我们将以 iOS 开发 为核心,使用苹果官方推荐的 URLSession 框架,并结合业界最流行的第三方库 Alamofire 进行讲解,也会涉及到服务器端需要配合的一些要点。

第一部分:理解核心概念
在开始编码前,我们先要明白几个关键点:
-
客户端与服务器:
- 客户端: 就是你开发的 iOS App,它负责向服务器请求数据,并接收和展示服务器返回的数据。
- 服务器: 一台远程计算机,运行着特定的程序,它负责接收客户端的请求,处理业务逻辑(比如查询数据库),然后将响应数据返回给客户端。
-
通信协议:
- 目前最主流的是 HTTP/HTTPS,你可以把它想象成一种客户端和服务器之间沟通的“语言”或“规则”。
- HTTP: 超文本传输协议,数据是明文传输的,不安全。
- HTTPS: 安全的超文本传输协议,在 HTTP 的基础上加了一层 SSL/TLS 加密,是目前所有 App 的强制要求。
-
请求与响应:
(图片来源网络,侵删)- 请求: 客户端向服务器发送的数据包,它包含:
- URL: 请求的地址,告诉服务器你要找哪个资源。
- 方法: 最常用的是
GET(获取数据)和POST(提交/创建数据)。 - 请求头: 一些附加信息,
Content-Type(告诉服务器我发送的是什么格式的数据)。 - 请求体: 对于 POST 请求,通常在这里附上要提交的数据(如 JSON、表单数据)。
- 响应: 服务器返回给客户端的数据包,它包含:
- 状态码: 一个三位数字,表示请求的结果,最常见的是
200 OK(成功),404 Not Found(资源不存在),500 Internal Server Error(服务器内部错误)等。 - 响应头: 服务器的附加信息。
- 响应体: 你真正需要的数据,通常是 JSON 或 XML 格式,JSON 是目前的事实标准。
- 状态码: 一个三位数字,表示请求的结果,最常见的是
- 请求: 客户端向服务器发送的数据包,它包含:
第二部分:iOS 网络请求的实现方案
在 iOS 中,有几种方式可以发起网络请求,我们按推荐顺序介绍:
URLSession (苹果官方推荐)
这是苹果自带的、最底层的网络请求框架,功能强大,但代码相对繁琐。
基本步骤:
- 创建一个 URLSession 对象。
- 创建一个 URLRequest 对象,设置 URL、HTTP 方法、请求头等。
- 创建一个DataTask,将 URLRequest 传给它。
- 启动DataTask,它会异步地在后台线程执行网络请求。
- 在 Completion Handler (闭包) 中处理响应。
代码示例 (GET 请求):

import UIKit
// 定义一个结构体来解析服务器返回的 JSON,遵循 Codable 协议
struct User: Codable {
let id: Int
let name: String
let email: String
}
class NetworkManager {
static let shared = NetworkManager()
private init() {} // 单例模式
func fetchUsers(completion: @escaping ([User]?, Error?) -> Void) {
// 1. 定义 URL
guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else {
completion(nil, NSError(domain: "Invalid URL", code: 0, userInfo: nil))
return
}
// 2. 创建 URLSession 和 URLRequest
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 3. 处理错误
if let error = error {
print("Error: \(error)")
completion(nil, error)
return
}
// 4. 检查响应状态码
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
print("Invalid response")
completion(nil, NSError(domain: "Invalid Response", code: 0, userInfo: nil))
return
}
// 5. 解析 JSON 数据
if let data = data {
do {
// JSONDecoder 将 JSON 数据解码为 [User] 数组
let users = try JSONDecoder().decode([User].self, from: data)
print("Fetched users: \(users)")
// 6. 在主线程更新 UI
DispatchQueue.main.async {
completion(users, nil)
}
} catch {
print("JSON Decoding Error: \(error)")
completion(nil, error)
}
}
}
// 7. 启动任务
task.resume()
}
}
如何使用:
// 在某个 ViewController 中
NetworkManager.shared.fetchUsers { users, error in
if let error = error {
// 处理错误,例如显示一个提示
print("Failed to fetch users: \(error)")
return
}
if let users = users {
// 成功获取到数据,更新 UI
print("Successfully fetched \(users.count) users.")
// self.tableView.reloadData()
}
}
Alamofire (第三方库,强烈推荐)
Alamofire 是一个在 URLSession 基础上封装的优雅、简洁的 Swift 网络库,它能极大简化你的代码,提高开发效率,是业界的事实标准。
准备工作:
- 通过 CocoaPods 安装:
在你的
Podfile中添加pod 'Alamofire',然后运行pod install。 - 通过 Swift Package Manager (SPM) 安装:
在 Xcode 中
File->Add Packages...,然后输入https://github.com/Alamofire/Alamofire.git。
代码示例 (GET 请求):
import Alamofire
// User 结构体定义和上面一样
class AlamofireNetworkManager {
static let shared = AlamofireNetworkManager()
private init() {}
func fetchUsers(completion: @escaping (Result<[User], Error>) -> Void) {
let url = "https://jsonplaceholder.typicode.com/users"
// Alamofire 的请求代码极其简洁
AF.request(url).responseDecodable(of: [User].self) { response in
switch response.result {
case .success(let users):
print("Successfully fetched \(users.count) users with Alamofire.")
DispatchQueue.main.async {
completion(.success(users))
}
case .failure(let error):
print("Error with Alamofire: \(error)")
DispatchQueue.main.async {
completion(.failure(error))
}
}
}
}
}
对比一下你会发现,Alamofire 的代码量更少,可读性更强,并且内置了 JSON 解码功能,非常方便。
第三部分:App Store 上架与网络请求的注意事项
你的 App 要想在 App Store 上成功上架,并稳定地使用网络功能,必须遵守苹果的规定和最佳实践。
App Transport Security (ATS)
从 iOS 9 开始,苹果默认启用了 ATS,它的核心要求是:所有网络请求都必须使用 HTTPS。
-
如果你的服务器只支持 HTTP:
- 强烈建议:立即升级你的服务器,支持 HTTPS,这是最安全、最合规的做法。
- 临时方案(不推荐):你可以在
Info.plist文件中添加一个例外,允许特定域名使用 HTTP,但这会导致你的 App 被拒,并且存在巨大的安全风险。
<!-- 在 Info.plist 中添加 --> <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>yourdomain.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <!-- 可以添加更多子域名 --> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
后台获取
如果你的 App 需要在后台(即用户没有打开 App 时)从服务器获取数据(比如新闻、消息推送),你需要申请 Background Fetch 能力。
- 如何配置:
- 在 Xcode 中选择你的 Target。
- 进入
Signing & Capabilities标签页。 - 点击
+ Capability,添加Background Modes。 - 在弹出的列表中勾选
Background Fetch。
- 工作原理: 系统会在合适的时机(比如用户连接了 Wi-Fi)唤醒你的 App,给你几十秒的时间去执行网络请求并更新内容。
权限声明
如果你的 App 需要访问用户的个人信息(如位置、通讯录、相册、健康数据等),即使这些信息与
