当前位置: 首页 > news >正文

IOS 13 网络请求和Moya框架

允许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 Foundationclass Config {/*** 是否是调试模式* 是因为单独定了一个变量更方便,不用真正更改项目的编译模式*/static let DEBUG = true/// BaseURLstatic 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 Moyaenum 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 .postdefault: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 Foundationimport Moyaclass 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 inprint(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, etclet dataString = String(data: data, encoding: .utf8)!print("request network success \(statusCode) \(dataString)")case let .failure(error):print("request network error \(error)")}
}

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例
  • 图片转pdf:tif是什么格式?如何将tif转成PDF?
  • 【hot100篇-python刷题记录】【找到字符串中所有字母异位词】
  • 工厂模式和策略模式区别
  • 汽车冷却液温度传感器的作用与检测方法
  • Windows10如何关闭Edge浏览器的Copilot
  • 钓鱼的常见几种方式
  • css之grid布局(网格布局)
  • 力扣 128. 最长连续序列
  • 深度学习加速秘籍:PyTorch torch.backends.cudnn 模块全解析
  • python办公自动化:初识`python-docx`
  • win10 新建、删除文件不会自动刷新的问题解决方案
  • 92.WEB渗透测试-信息收集-Google语法(6)
  • idea 2024.2切换到旧版的UI
  • CTF杂项题:easy_nbt writeup
  • [case10]使用RSQL实现端到端的动态查询
  • 2017前端实习生面试总结
  • ComponentOne 2017 V2版本正式发布
  • Docker 笔记(2):Dockerfile
  • es6(二):字符串的扩展
  • FastReport在线报表设计器工作原理
  • gops —— Go 程序诊断分析工具
  • javascript数组去重/查找/插入/删除
  • Java知识点总结(JavaIO-打印流)
  • Redis字符串类型内部编码剖析
  • SpiderData 2019年2月16日 DApp数据排行榜
  • VuePress 静态网站生成
  • 高度不固定时垂直居中
  • 人脸识别最新开发经验demo
  • 什么是Javascript函数节流?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 消息队列系列二(IOT中消息队列的应用)
  • 小而合理的前端理论:rscss和rsjs
  • 用Visual Studio开发以太坊智能合约
  • 由插件封装引出的一丢丢思考
  • 中文输入法与React文本输入框的问题与解决方案
  • 2017年360最后一道编程题
  • MyCAT水平分库
  • #前后端分离# 头条发布系统
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)bark-ml
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (转)树状数组
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ..回顾17,展望18
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net 路由处理厉害了
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET学习教程二——.net基础定义+VS常用设置
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • [1]-基于图搜索的路径规划基础
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现