Tag: Urlsessions

使用URLComponents和URLQueryItem在Swift中构建安全URL

构造URL是每个Swift开发人员在构建iOS应用程序时都会执行的一项日常任务。 确保我们构建的网址安全且使用百分比编码格式正确编码非常重要。 构造URL的最简单且最容易崩溃的方法是使用传递原始字符串的URL Struct String initalizer。 让 searchTerm =“ obi wan kenobi” let format =“ wookiee” 让 url = URL(字符串:“ https://swapi.co/api/people/?search= \(searchTerm)&format = \(format)“)! //异常(致命错误)! 虽然它适用于没有查询参数的简单URL,但是当我们手动将查询参数添加到未使用百分比编码正确编码的字符串时,就会出现不安全行为。 手动为每个查询参数附加字符串的过程也很容易出错。 输入URLComponents和URLQueryItem 为了解决此问题,Apple的Foundation框架实际上提供了两种类型的Struct,我们可以将其用作构建带有安全查询参数的URL的构件,它们是URLComponents和URLQueryItem 。 URL由许多部分组成,例如方案,主机,路径和查询。 使用URLComponents结构,我们可以通过手动指定方案,主机和路径来安全地构建URL。 为了安全处理查询参数的百分比编码, URLComponents还公开了queryItems作为属性。 QueryItems是URLQueryItem的数组,我们可以使用URLQueryItem初始化程序传递查询参数的名称和值。 通过分配queryItems数组, URLComponents将在内部添加查询参数的百分比编码。 将键值字符串的字典映射到URLQueryItem数组 我们可以使用的另一种有用模式是将查询参数封装在具有String作为键和值的Dictionary内。 我们使用一个接受Dictionary的变异函数向URLComponents添加扩展,然后使用每个项目键和值将Dictionary映射到URLQueryItem数组,然后将其分配给URLComponents queryItems属性。 使用URLComponents和URLQueryItems构建SWAPI API存储库(示例) 这是一个示例,说明如何使用URLComponents和URLQuery项目作为每个端点的构建块来构建Remote DataRepository类。 我们还将为每个Planets, Spaceships, Vehcicles, People, Films, Species, Wookiee format, JSON format […]

迅捷网络层-更新

首先,我要对拍手的每个人表示感谢,对我以前的文章发表评论:“在Swift中编写网络层:面向协议的方法”。 经过评论中的反馈和更多研究后,我认为解决本文中建议的改进将是有益的。 我们可以对项目进行两个简单的修改,以改善其功能。 在我们先前的URLSession实现中,我们使用了URLSession.shared 。 此代码有效,但不是最佳方法。 每次发出请求时,我们都会实例化一个新会话。 建议有一个URLSession和多个任务。 以前的实现。要解决此问题,我们将在使用默认配置创建路由器时实例化会话。 您可以使用3种不同类型的配置来创建会话。 我建议您从Raywenderlich.com阅读本文。 使用此代码,我们可以创建一个会话并执行多个任务。 这里的另一个优势是,我们可以调整路由器初始化代码以具有会话参数,通过使用模拟,我们将使编写测试变得更加容易。 为此,我要感谢Koen Punt和ilya stroganov的评论。 我不知道URLQueryItem已经编码了我们的参数。 这是一个快速更新,只需删除 .addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)。 并做了。 我永远不会表现出我所了解的一切。 我在Medium上写作时正在学习所有这些内容。 有时候,我会引用自己的帖子来提醒如何实现目标。 具有终身学习者的态度将使人成长。 我喜欢分享自己的发现,并希望能在此期间帮助某人。 话虽如此,如果有任何主题,您可能希望我发表评论,请在评论中提及。 再次感谢您的所有👏🏾。 在Swift⚡️中继续学习和思考。

街区有一个新的iOS网络库

正如任何iOS开发人员所知,网络是任何移动应用程序的重要组成部分。 当苹果公司在iOS 7中引入URLSession时,社区就敞开了怀抱。 新的API是对旧版URLConnection API的重大改进。 在Bottle Rocket,我们始终在为客户构建应用程序时试图在效率与可维护性之间寻求平衡。 因此,我们通常会直接在URLSession上从头开始编写网络代码。 从可维护性的角度来看,这非常好-使我们的网络代码与Apple的SDK保持同步非常容易。 但是,随着我们的成长,我们意识到经常需要重复编写一些通用的样板化网络代码。 我们决定编写自己的解决方案,而不是使用第三方解决方案(其中许多解决方案非常繁琐)。 我们最近以Apache 2.0许可在GitHub上开源了Hyperspace。 在构建Hyperspace时,我们有一些目标: 减少您需要手工编写的HTTP模板。 这包括定义HTTP方法,状态代码和标头之类的内容。 保持轻巧—开箱即用即可轻松便捷地处理90%的网络用例。 这包括指定您希望从请求中获取的模型类型,以便可以使用Swift 4的Codable协议的魔力自动对其进行解析。 保持简单-我们想让任何人都容易做出贡献。 整个图书馆约为600个SLOC。 将超空间添加到您的项目 将Hyperspace添加到项目中后,您将立即启动并运行。 只需将Hyperspace添加到您的Podfile中(不久将添加对其他依赖项管理器的支持): 吊舱“超空间” 定义网络请求 定义请求很简单。 只需创建AnyNetworkRequest的实例并指定您的请求参数: 让someRequest = AnyNetworkRequest (方法:.post, url:URL(string:“ …”)!, 标头:[。contentType:.applicationJSON], 正文:postBody) 注意, Model是指您的请求的成功模型响应类型。 这意味着,如果您请求的响应类型符合Decodable ,我们将为您自动处理解码。 还要注意, method和headers参数依赖于预定义的类型。 不再有容易出现拼写错误的“字符串型” API! 执行网络请求 BackendService的工作就是执行您的网络请求。 只需创建一个BackendService ,然后调用其execute()方法即可: 让backendService = BackendService()backendService.execute(request:someRequest){(结果)在 切换结果{ case .success(让responseObject): //请求成功 […]

如何从头开始创建iTunes Samples Player? (第2部分)

注意:这是“如何从头开始创建iTunes Samples Player? (第1部分)”。 此部分根据应用程序的功能分为两部分。 能够执行搜索并将结果显示为列表。 能够下载示例歌曲并播放。 为了实现这个目标,我们需要完成以下任务。 在搜索栏上输入搜索关键字后,知道何时点击“搜索”按钮。 根据搜索关键字启动“ URLSessionDataTask”。 响应到来后,解析它并将其转换为字典。 使用字典填充tableView。 解决方案1.1 :创建“ SearchViewController”的扩展名,以使该扩展名充当搜索栏的委托。 选择“添加新文件”选项,然后选择“快速”文件。 将其命名为“ SearchViewController + SearchBarDelegate”。 该代码的第一个版本如下所示: 解决方案1.2。 我们需要创建一个新的swift类,该类将启动URLSessionDataTask,解析响应数据,然后根据解析的数据创建模型对象的集合。 一旦成功完成,该模型将被传递给View,以填充tableView。 这也意味着我们需要在项目中添加一个模型类以保存跟踪信息。 该类看起来像下面的那个。 将其添加到“模型”组下的项目中。 SearchViewController将如下所示: 该版本的源代码在GitHub中。 下一个目标是实际下载声音文件,然后在选择行时播放它。 让我们清理TrackCell中的configure方法,以便隐藏“暂停”按钮,“取消”按钮,ProgressView和“进度”标签。 我们稍后将取消隐藏它们。 让我们看看如何实现下载机制。 以下是高级任务: 2.1 —单击下载按钮后,应用程序应找到必须从中下载文件的URL,然后开始下载。 2.2 —下载结束后,应使用文件在本地可用的事实来更新模型对象。 另外,下载按钮应该被隐藏。 2.3 —如果在下载完成后用户点击该行,则应播放该文件。 2.1的解决方案:下载按钮位于单元格上。 这意味着我们需要使用委托模式来处理下载按钮的点击。 我们将在TrackCell中定义一个协议,并在其中声明一个委托变量。 在TrackCell中编辑代码,以包括协议定义和委托变量。 同样,当点击“下载”按钮时,必须有一个被调用的函数。 现在,我们将在’SearchViewController’上有一个新扩展,它将作为TrackCell的委托。 首先,将只有一个委托方法触发下载。 但是,随着时间的流逝,我们那里将有更多的方法。 将其命名为“ SearchViewController + TrackCellDelegate” 下一步是向Networking组添加一个新类,该类负责文件下载过程。 […]

如何从头开始创建iTunes Samples Player? (第1部分)

注意 :本文的灵感来自Audrey Tam的出色教程-raywenderlich.com上的“ URLSession教程:入门”。 她的教程基于一个入门项目,该项目已完成约60%,并且她将该项目用作启动板,以介绍URLSession的其他更深入的方面。 我的文章解释了填补0%到60%之间的差距所需的步​​骤。 这里的目的是增加以上教程中已经存在的内容,但绝不替代它。 但是,如果您了解基于NSURLSession的网络的基础知识,则可以继续阅读并将其视为独立的教程。 在开始之前,让我们看看我们要实现的目标。 在本文的结尾,我们将创建一个应用程序,该应用程序可以使用关键字搜索iTunes,显示结果,启动下载,根据需要暂停恢复下载并播放歌曲。 该应用程序的体系结构是MVC-N。 它具有模型,视图,控制器和网络层。 在Xcode中启动一个新项目。 选择“单视图应用”。 在下一个屏幕上,输入产品名称,选择团队,根据需要输入组织和组织标识符,选择语言为Swift。 在下一个屏幕中,选择项目的位置。 现在已经创建了项目,在“项目导航器”中进行分组。 创建四个组,分别是视图,模型,控制器,网络和支持文件。 选择“ ViewController.swift”到“ Controller”文件夹。 将Xcode随项目创建的其余文件移动到“支持的文件”中,Info.plist除外。 还要从编辑器窗格中选择“ ViewController.swift”,将其名称重构为“ SearchViewController.swift”。 完成后,您的“项目浏览器”应类似于以下内容: 在这里,我们需要选择“ Main.storyboard”,该文件通常为空。 拖放搜索栏并调整其尺寸,使其填充视图顶部。 然后,添加一个充满整个屏幕其余部分的tableView控制器。 将tableviewcell拖到tableView的顶部,它将用作原型单元。 完成后,情节提要将如下所示。 只需运行该应用程序,然后查看您的位置即可。 如果您看到与以下内容相似的商品,那就很好。 接下来,我们将为此应用程序设计原型单元。 我们有七个UI元素可用于此原型单元。 它们是曲目标题,艺术家标题,下载进度指示器,下载进度描述标签,下载按钮,取消按钮和恢复按钮。 根据需要调整原型单元的高度。 此时不要花时间建立完美的约束。 我们的重点必须放在放置项目并将它们连接到我们将很快创建的自定义UITableViewCell类文件上。 我已经对单元上的三个标签进行了基本的自定义,以在视觉上区分它们。 我将曲目标题字体类型设置为粗体,将艺术家标签字体颜色设置为灰色,将进度描述标签大小设置为10.0。 原型单元现在看起来像这样。 现在,我们已经准备好原型单元UI,让我们在“视图”下创建一个类来连接UI元素。 右键单击“视图”文件夹,选择“新文件”,在下一个屏幕上选择“可可接触类”,输入名称为“ TrackCell”,然后从下拉选项中选择“ UITableViewCell”。 选择要保存的位置。 添加新类后,将原型单元的类设置为TrackCell。 同样,我们需要为原型单元设置一个可重用的标识符。 是时候将原型元素作为IBOutlets连接到新创建的tableViewCell类了。 选择主板。 启用助手视图,以便您可以轻松地从情节提要中按住Ctrl +拖动,然后拖放到类文件中。 选择的元素名称为titleLabel,artistLabel,progressView,progressLabel,pauseButton,cancelButton和downloadButton。 […]

如何从头开始创建iTunes Samples Player? (第3部分)

注意:这是“如何从头开始创建iTunes Samples Player? (第2部分)”。 本文分为两个部分: 在ProgressView和标签文本中显示下载进度。 实现暂停,恢复和取消下载。 上一篇文章的最后一步是添加URLSession的委托方法。 URLSession中还有另一个委托方法,可提供进度的确切状态。 我们可以利用此委托获取当前的进度信息,并在TrackCell中使用新方法,更新标签和进度视图。 TrackCell中进行了一些更改。 删除了隐藏进度标签和progressView的行。 将进度视图的进度值设置为零。 下载完成后,我们将隐藏进度视图。 另外,在Main.storyboard中,删除进度标签上的默认文本“ Label”。 请注意,在底部添加了新方法updateDisplay。 生成,运行并点击下载。 在下载过程中和下载之后,您应该看到以下屏幕。 到此完成第1节 。 解决方案 :URLSession支持暂停/恢复和取消。 我们已经在单元格上隐藏了按钮。 当用户点击它们时,某些委托方法应触发。 这些方法应由SearchViewcontroller处理。 暂停,恢复或取消之类的操作应直接应用于活动下载。 为了进行这些更改,我们需要在T​​rackCell上声明三个新的委托方法。 然后,我们需要将按钮操作连接到IBAction方法,该方法将依次调用委托,在这种情况下为SearchViewController。 我们还在单元格行上进行了一些UI调整,以便与下载相关的控件仅在活动下载时出现。 完成的课程如下所示: 我们已经更改了Configure方法TrackCell的签名,以便传递活动的下载对象。 更改“ SearchViewController + TableViewDelegate”内部的方法调用以通过活动下载。 cell.configure(跟踪:跟踪,下载:跟踪。下载,下载:downloadService.activeDownloads [track.previewURL]) 生成,运行,搜索,下载,暂停,恢复,取消。 该版本的源代码在GitHub中可用。 希望您能够成功看到具有预期功能的上述屏幕。 这标志着我们为本文设定的所有目标的完成。 学习愉快!