允许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框架的依赖和使用。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |