IOS 13 网络哀求和Moya框架

王柳  金牌会员 | 2024-8-24 12:10:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 915|帖子 915|积分 2745

允许HTTP哀求

从iOS9开始,保举使用HTTPS,如果使用的HTTP,默认情况下会出现如下错误:
  1. 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标签内添加如下内容:
  1. <key>NSAppTransportSecurity</key>  
  2. <dict>  
  3.     <key>NSAllowsArbitraryLoads</key>
  4.     <true/>  
  5. </dict>
复制代码

意思是允许使用HTTP,当然还可以配置指定的域名使用HTTP,我们这里是配置全部域名。
可视化更改

通过可视化编辑器。找到:
App Transport Security Settings,下面的Allow Arbitrary Loads设置为Yes。

网络框架

OC常用的是AFNetworking,Swift常用的Moya,本文使用Moya网络哀求框架。
添加依赖

  1. # 网络请求框架
  2. # https://github.com/Moya/Moya
  3. pod 'Moya'
复制代码
还不相识怎样使用 CocoaPods 管理依赖的,建议先看前面的文章:IOS 01 CocoaPods 安装与使用 

添加完依赖后,看一下Pods文件夹内里是否添加乐成。 
配置哀求相关地址 

  1. //
  2. //  Config.swift
  3. //  MyCloudMusic
  4. //
  5. //  Created by jin on 2024/8/22.
  6. //
  7. import Foundation
  8. class Config {
  9.     /**
  10.      * 是否是调试模式
  11.      * 是因为单独定了一个变量更方便,不用真正更改项目的编译模式
  12.      */
  13.     static let DEBUG = true
  14.     /// BaseURL
  15.     static let ENDPOINT = "http://my-cloud-music-api-sp3-dev.ixuea.com/"
  16.     /**
  17.      * 资源端点
  18.      */
  19.     static let RESOURCE_ENDPOINT = "http://course-music-dev.ixuea.com/"
  20. }
复制代码
界说Service

框架文档保举使用枚举,本文也使用枚举进行界说。 
  1. //
  2. //  DefaultService.swift
  3. //  网络API
  4. //
  5. //  Created by jin on 2024/8/22.
  6. //
  7. import Foundation
  8. //导入网络框架
  9. import Moya
  10. enum DefaultService{
  11.     case ads(position:Int)
  12.    
  13.     case sheets(size:Int)
  14.    
  15.     case register(data:User)
  16. }
  17. // MARK: - 实现TargetType协议
  18. extension DefaultService : TargetType{
  19.    
  20.     /// 返回网址
  21.     var baseURL: URL {
  22.         return URL(string: Config.ENDPOINT)!
  23.     }
  24.    
  25.     /// 返回每个请求的路径
  26.     var path: String {
  27.         switch(self){
  28.         case .ads(_):
  29.              return "v1/ads"
  30.         case .sheets:
  31.              return "v1/sheets"
  32.         case .register:
  33.              return "v1/users"
  34.         default:
  35.              fatalError("DefaultService path is null")
  36.         }
  37.     }
  38.    
  39.     /// 请求方式
  40.     var method: Moya.Method {
  41.         switch(self){
  42.         case .register:
  43.             return .post
  44.         default:
  45.             return .get
  46.         }
  47.     }
  48.    
  49.     /// 请求的参数
  50.     var task: Moya.Task {
  51.         switch(self){
  52.         case .ads(let position):
  53.             return ParamUtil.urlRequestParamters(["position":position])
  54.         case .sheets(let size):
  55.             return ParamUtil.urlRequestParamters(["size":size])
  56.         default:
  57.             //不传递任何参数
  58.             return .requestPlain
  59.         }
  60.     }
  61.    
  62.     /// 请求头
  63.     var headers: [String : String]? {
  64.         var headers:Dictionary<String,String> = [:]
  65.         
  66.         return headers
  67.     }
  68.    
  69.    
  70. }
复制代码
 界说参数相关工具类

  1. //
  2. //  ParamUtil.swift
  3. //  参数相关工具类
  4. //
  5. //  Created by jin on 2024/8/22.
  6. //
  7. import Foundation
  8. import Moya
  9. class ParamUtil{
  10.    
  11.     /// 返回URL编码的参数
  12.     ///
  13.     /// - Parameter parameters: <#parameters description#>
  14.     static func urlRequestParamters(_ data:[String:Any]) -> Task {
  15.         return .requestParameters(parameters: data, encoding: URLEncoding.default)
  16.     }
  17. }
复制代码
哀求接口

  1. let provider = MoyaProvider<DefaultService>()
  2. provider.request(.sheets(size: VALUE10)) { result in
  3.         print(result)
  4.         switch(result){
  5.         case let .success(response):
  6.                 let data = response.data // Data, your JSON response is probably in here!
  7.                 let statusCode = response.statusCode // Int - 200, 401, 500, etc
  8.                 let dataString = String(data: data, encoding: .utf8)!
  9.                 print("request network success \(statusCode) \(dataString)")
  10.         case let .failure(error):
  11.                 print("request network error \(error)")
  12.         }
  13. }
复制代码

至此,简朴的实现了Moya框架的依赖和使用。 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表