允许HTTP请求
从iOS9开始,推荐使用HTTPS,如果使用的HTTP,默认情况下会出现如下错误:
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
这是因为iOS9引入了新特性App Transport Security (ATS),他要求App内网络请求必须使用HTTPS协议,也就是默认情况下,不允许发送HTTP请求,但我们这里后端实现的API是HTTP协议,虽然后端课程中讲解了HTTPS,但为了降低课程难度,这里我们先允许HTTP请求,后面在讲解HTTPS请求。
解决方法是要么改为HTTPS,要么声明可以使用HTTP,可以声明部分使用HTTP,也可以所有;但需要说明的是如果APP内所有请求都是HTTP,那么如果要上架App Store的时候基本都会被拒。
源码方式更改
这种方式是直接编辑配置文件。打开工程下的Info.plist文件,在文件dict标签内添加如下内容:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
意思是允许使用HTTP,当然还可以配置指定的域名使用HTTP,我们这里是配置所有域名。
可视化更改
通过可视化编辑器。找到:
App Transport Security Settings,下面的Allow Arbitrary Loads设置为Yes。
网络框架
OC常用的是AFNetworking,Swift常用的Moya,本文使用Moya网络请求框架。
添加依赖
# 网络请求框架
# https://github.com/Moya/Moya
pod 'Moya'
还不了解如何使用 CocoaPods 管理依赖的,建议先看前面的文章:IOS 01 CocoaPods 安装与使用
添加完依赖后,看一下Pods文件夹里面是否添加成功。
配置请求相关地址
//
// Config.swift
// MyCloudMusic
//
// Created by jin on 2024/8/22.
//
import Foundation
class Config {
/**
* 是否是调试模式
* 是因为单独定了一个变量更方便,不用真正更改项目的编译模式
*/
static let DEBUG = true
/// BaseURL
static let ENDPOINT = "http://my-cloud-music-api-sp3-dev.ixuea.com/"
/**
* 资源端点
*/
static let RESOURCE_ENDPOINT = "http://course-music-dev.ixuea.com/"
}
定义Service
框架文档推荐使用枚举,本文也使用枚举进行定义。
//
// DefaultService.swift
// 网络API
//
// Created by jin on 2024/8/22.
//
import Foundation
//导入网络框架
import Moya
enum DefaultService{
case ads(position:Int)
case sheets(size:Int)
case register(data:User)
}
// MARK: - 实现TargetType协议
extension DefaultService : TargetType{
/// 返回网址
var baseURL: URL {
return URL(string: Config.ENDPOINT)!
}
/// 返回每个请求的路径
var path: String {
switch(self){
case .ads(_):
return "v1/ads"
case .sheets:
return "v1/sheets"
case .register:
return "v1/users"
default:
fatalError("DefaultService path is null")
}
}
/// 请求方式
var method: Moya.Method {
switch(self){
case .register:
return .post
default:
return .get
}
}
/// 请求的参数
var task: Moya.Task {
switch(self){
case .ads(let position):
return ParamUtil.urlRequestParamters(["position":position])
case .sheets(let size):
return ParamUtil.urlRequestParamters(["size":size])
default:
//不传递任何参数
return .requestPlain
}
}
/// 请求头
var headers: [String : String]? {
var headers:Dictionary<String,String> = [:]
return headers
}
}
定义参数相关工具类
//
// ParamUtil.swift
// 参数相关工具类
//
// Created by jin on 2024/8/22.
//
import Foundation
import Moya
class ParamUtil{
/// 返回URL编码的参数
///
/// - Parameter parameters: <#parameters description#>
static func urlRequestParamters(_ data:[String:Any]) -> Task {
return .requestParameters(parameters: data, encoding: URLEncoding.default)
}
}
请求接口
let provider = MoyaProvider<DefaultService>()
provider.request(.sheets(size: VALUE10)) { result in
print(result)
switch(result){
case let .success(response):
let data = response.data // Data, your JSON response is probably in here!
let statusCode = response.statusCode // Int - 200, 401, 500, etc
let dataString = String(data: data, encoding: .utf8)!
print("request network success \(statusCode) \(dataString)")
case let .failure(error):
print("request network error \(error)")
}
}
至此,简单的实现了Moya框架的依赖和使用。