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 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框架的依赖和使用。 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sziitjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值