Tag: swift

SonarQube“托管在您的服务器上” + Travis CI + Swift

我在本地计算机上安装了SonarQube并成功运行,但目的是将其与Travis CI集成。 要将SonarQube与Travis集成,我有2种选择: 使用SonarCloud。 (文档位于https://docs.travis-ci.com/user/sonarcloud) 使用我的服务器上托管的Sonar。 选择第二个选项-我总是更喜欢服务器上托管的服务。 从SonarSource购买了Developer Edition,网址为https://www.sonarsource.com/plans-and-pricing/developer/ 为什么要使用开发人员版?? 答 :我想要Swift语言支持。 您可以在网络上找到足够的文档来将SonarCloud与Travis CI集成,但是要将其与托管在您自己的服务器上的SonarQube集成并不是一件容易的事。 这就是为什么我想到写这篇文章的原因 .travis.yml设置 我假设您已经知道如何使用您的Github帐户设置Travis。 接下来,您需要告诉Travis如何使用SonarQube对代码进行质量检查。 .travis.yml中的以下代码段将帮助您实现这一目标: 插件: sonarqube:truescript: -声纳扫描仪-D sonar.host.url = $ SONAR_HOST_URL -D sonar.login = $ SONAR_TOKEN -Xenv: 全球: —安全:SecuredSonarToken-SONAR_HOST_URL = SonarHostURL 要生成SonarHostURL的SONAR_TOKEN登录,请转至我的帐户->安全->生成安全令牌。 将生成一个令牌,使用travis encrypt SONAR_TOKEN=token —- add此令牌travis encrypt SONAR_TOKEN=token —- add sonar.projectKey = projectKey sonar.projectName =项目名称 #数字版本(可以在plist中自动找到,只需注释此行) sonar.projectVersion = 1.0 […]

了解使用iOS,Xcode 9和Swift的UI测试

Xcode提供了功能齐全的可编写脚本的UI测试框架。 使用该框架的关键是了解其架构以及如何最好地利用其功能。 了解Xcode UI测试 在Xcode中创建新项目时,新项目向导会询问您是否要包含单元测试 ,以及是否要包含UI测试 。 一个人可能会怀疑-UI测试不是单元测试吗? 如果没有,那是什么? 实际上,这些复选框及其结果主要是用来通知Xcode在项目中创建哪些目标的。 选中每个复选框都会在项目中生成不同类型的测试目标。 Xcode 单元测试和Xcode UI测试之间的根本区别: 单元测试用于测试源代码是否产生预期的结果。 例如:确保函数在传递特定参数时会生成某些预期结果。 UI测试测试用户界面是否按预期方式运行。 例如:UI测试可能会以编程方式点击一个按钮,该按钮会自动切换到新屏幕,然后以编程方式检查预期的屏幕是否确实加载并包含预期的内容。 单元测试和UI测试都支持完全自动化,并支持在应用程序生命周期内进行回归测试。 一般而言,Xcode 单元测试将练习并评估您的Swift代码 ,但不检查对用户界面的影响,而Xcode UI测试则评估响应操作的UI行为 ,但不检查您的代码。 与往常一样,这些是带有例外的通用语句。 当然,可以从(代码)单元测试中了解UI,并可以从UI测试中了解代码对象的状态。 但是,这些工具旨在根据此概括性说明使用。 UI测试示例 在检查UI测试的体系结构和实现之前,让我们看一下已完成的操作测试。 此测试的用户故事如下: 在第一个屏幕上,用户可以在表格视图中选择一个单元格,这将打开第二个表格,在标签中显示所选值。 然后,用户可以在原始标签下方的文本框中键入新值。 当用户随后返回第一个表单时,新值将显示在“表视图”中。 如果质量检查测试人员要手动检查此过程,则会执行以下顺序: 启动应用 连续点击 加载时观察表格视图行文本在第二个窗体上 在文本字段中输入新值 按下后退按钮 观察他们键入的值已替换表格视图中的原始文本 手动测试过程如下所示(这是一个动画的.gif-如果使用Medium应用程序,则可能需要在浏览器中打开此页面才能查看动画)。 如果我们可以自动化该过程,这样我们的QA测试人员就不必在每个版本之前都手动重复此过程,那不是很好吗? 这正是UI测试的目的所在-我们将逐步介绍如何使该测试过程自动化! UI测试架构 在深入研究代码之前,了解Xcode UI Test框架的工作方式非常重要。 通过了解UI测试如何访问和操纵UI组件,您将能够使您的UI易于构建测试。 与单元测试 (使用源代码的单元测试一样),XCode使用XCTest来运行UI测试。 但是XCTest代码如何知道如何检查和操作在Storyboard和/或Swift代码中设计的UI? 为了在运行时访问您的UI,XCTest使用iOS Accessibility公开的元数据。 例如,这与使iOS能够向盲人和弱视用户读取屏幕的技术相同。 在运行时,XCTest遍历您的UI控件,查找可访问性属性(例如accessibilityIdentifier和accessibilityLabel以查找您希望XCTest在UI测试中进行点击,更改或检查的UI组件。 […]

Tableview粘页眉

让我们谈谈有关iOS开发的一些技巧。 我将向您展示如何构建粘性标头视图。 在开始阅读之前,请先在此处打开GitHub项目。 您需要一些代码以粘贴到您的项目中。 写完后,它将像… 1-创建粘性标题视图 您需要创建2个类,分别为StickyHeader和StickyHeaderView。 这些是为我们提供初始化粘性标头组件的基类。 2-添加UIScrollView扩展 我们需要添加扩展功能来管理tableview滚动。 这些课程已准备就绪。 接下来是调用粘性标题并将其标题视图分配给它。

iOS:表格视图中的多个选择

第3部分。在iOS开发中继续采用MVVM 这是我的MVVM系列表视图中的第三个教程。 在前两部分中,我们使用不同类型的动态单元格创建了表视图,并添加了可折叠部分功能。 今天,我们将介绍另一个常用的“表视图”方案:多个选择。 在许多用例中,我们需要创建一个表视图,该表视图允许用户选择多个单元格。 通常,API提供您在表视图中显示的项目列表,用户可以选择一些项目以便以后使用(发送到后端,保存到本地存储,传递到下一个屏幕等) 。 有时,您希望将选择限制在一定数量之内,或者您不希望用户继续选择任何项。 这是我通常在现有应用程序中或在stackoverflow的一些答案中看到的内容: 让allItems = [Items]() var selectedItems = [Items]() 然后,当选择了单元格时,就可以通过这种方式在所选索引处添加或删除项目。 另一个解决方案稍微好一点:获取当前选定的TableView行的索引,然后将其映射到数据源项的数组: 如果让selectedIndexes = tableView.indexPathsForSelectedRows { //将索引映射到现有数据数组的棘手方法 //让selectedItems = … } 尽管第二种方法对于TableView来说更自然,因为它利用了内置方法indexPathsForSelectedRows,但如果要将ViewModel与View分开,仍然不是完美的选择。 将tableView索引映射到模型项是我们要避免的Massive View Controller模式的一个很好的例子。 如果要在重新加载tableView时保留选择,这将变得更加混乱:您需要保存当前选定的索引,重新加载tableView ,然后为每个选定的索引调用selectRow 。 但是两次重装之间dataSource发生了什么变化? 完成本教程后, TableViewController中将包含以下代码来处理多行选择: //什么代码? 那就对了。 完全没有代码。 一切将由ViewModel和TableViewDelegate处理 。 当您重新加载整个TableView或其任何部分时,选择将保持不变 。 听起来不错? 开始吧!

与Jenkins和Fastlane的持续集成和持续交付

测试一直是大多数大中型项目的重要组成部分,因此,对我们的主分支进行的每次代码更改都必须触发测试套件的完全执行,这一点很重要,以确保我们所做的更改不会破坏其他任何代码测试用例。 这就是我们所说的持续集成(CI)。 这是为了验证代码更改的正确性并快速识别集成错误。 在收到CI的同意后,下一步是确保交付包含新功能和/或错误修复的新软件。 这就是我们所谓的持续交付。 由于CI已解决了测试套件的问题,因此我们在此处运行脚本以对证书进行签名(在Xcode / iOS上下文中),并使用第三方工具(如FastLane)执行存档,以触发可发送到用户电子邮件的可部署软件。立即进行测试。 詹金斯是什么? 詹金斯(Jenkins)为我们提供了无缝方式,以使用管道为几乎任何组合的代码语言和源代码存储库设置CI / CD环境。 它是一个开源自动化服务器 ,可用于自动化与构建,测试以及交付或部署软件有关的任务。 它也是帮助DevOps团队的必不可少的工具,由于我们在特定时期内管理的项目数量不断增加,以确保其高质量的交付成果, DevOps团队如今越来越受欢迎。 Jenkins的插件可与Github和BitBucket等第三方源控制器集成。 什么是Fastlane? FastLane是用Ruby编写的CD工具,用于发布移动应用程序(iOS / Android),为您消除了繁琐的任务。 由于其针对iOS生态系统的较早开发,我们可以看到iOS提供了比Android更多的功能。 注意:如果您是Fastlance的新手,也可以查看我们的Fastlane教程 。 先决条件 为了完成本教程,我假设您已具备以下知识和工具: 有关构建iOS项目的一些基本知识。 Swift中一些具有Quick&Nimble的单元测试知识。 一些虚拟主机知识。 使用本教程的Mac机器。 用于生成证书的开发者帐户。 忍耐 设置整个过程非常耗时且乏味。 通过大量的试验和错误,我可以将所有内容拼凑在一起,以创建本教程。 在撰写本文时,可能会有更新进入,内容可能已过时。 请比较出现的版本升级并进行相应处理。 不要犹豫,给我留言,这样我就可以相信您并更新本教程,以使其余人员受益! 谢谢☺ 你会学到什么? 通过阅读本教程,您将学到很多有关CD和CI的知识,包括: 如何设置Jenkins 2.121.3(Java 8) 。 如何设置Fastlane 。 如何使用Jenkins + Github管理您的CI 。 如何使用Jenkins + Github + Fastlane管理CD […]

访问控制说明符(快速)—简而言之

开放,公开,内部,私有,文件私有 在本文中,我将用螺母壳介绍所有五个访问控制说明符,以便您可以长时间记住它。 您必须了解一件事: module 。 想象一个模块是一捆代码。 您的单个Xcode项目/框架/捆绑包被视为一个模块。 例如:CoreData,UIKit,CustomFramework是模块。 打开: 可以从外部模块(UICollectionView或UITableView)创建子类,添加更多功能,访问其自身的功能。 上市 : 没有子类,可以使用Delegate覆盖模块外部的功能(UICollectionViewDelegate或UITableViewDelegate)-只有子类只能在定义它们的模块内覆盖它。 公共访问级别使实体可以在定义模块之外使用 内部: 模块中对with的访问限制,例如:即使我们导入CoreData,iOS开发人员也无法访问CoreData工程师创建的内部函数。 FilePrivate: 从其类型之外但在同一文件中进行访问。 如果将某文件标记为filePrivate,则可以在声明该文件的同一文件中的任何位置读取该文件,甚至可以在该类型之外读取。 私人的 : 从外部访问,但只能在其类型(扩展名)中进行访问,只能在声明它的类型内部或在同一文件中创建的对该类型的扩展内部读取私有属性。 重要 公用类型默认为具有内部成员,而不是公用成员。 如果要让类型成员公开,则必须明确地将其标记为公共成员。 此要求确保您选择发布类型的面向公众的API,并避免错误地将类型的内部工作方式呈现为公共API。 参考文献: https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html

GitHub行动:持续交付Swift软件包

原始链接: GitHub行动:持续交付Swift软件包 GitHub正在推出GitHub Actions功能,该功能使开发人员无需使用任何操作即可自动执行CI / CD工作流程… shashikantjagtap.net GitHub Actions:持续交付Swift软件包– XCTEQ GitHub正在推出GitHub Actions功能,该功能使开发人员无需使用任何操作即可自动执行CI / CD工作流程… www.xcteq.co.uk GitHub正在推出GitHub Actions功能,该功能使开发人员无需使用任何其他应用程序即可自动执行CI / CD工作流程。 Github Actions可被视为Github本身内置的GitHub自己的CI / CD解决方案。 开发人员可以使用GUI编辑器或从代码创建工作流。 GitHub Actions可用于使用Apple的Swift Package Manager构建,测试和分发Swift库构建。 在本文中,我们将看到如何使用基于Docker的Github Actions为Swift软件包设置CI / CD。 在撰写本文时,GitHub Action仍处于有限的公共beta中,并且可能很快会添加更多功能。 但是,值得理解GitHub Actions和Workflows背后的概念。 有关如何配置工作流程和操作的官方开发人员文档,但是在摘要中, GitHub动作包含一个WorkFlow,其中包含各种动作。 可以使用可视编辑器或在.github/main.workflow文件内的代码中定义工作流程。 工作流必须解决特定的操作。 每个动作都在Docker容器内执行,并且可以依赖于另一个动作。 可以在Github存储库或远程Docker存储库中本地定义操作。 注册GitHub Actions的用户可以在公共存储库上使用此功能进行推送构建。 让我们不用讨论理论,而要使用由Swift Package Manager构建的Swift Packages的GitHub Actions for CI / CD。 苹果已经宣布了自己的软件包管理器来构建和分发Swift软件包。 目前,Swift软件包管理器不支持iOS平台,但可以构建和共享独立的软件包。 […]

Swift 4中iOS的Realm数据库入门

在 programmingwithswift.github.io上 查看我的其他帖子 如果您正在寻找深入的Realm Database教程,那么这不是适合您的文章。 我将通过xcode创建一个新项目,将Realm添加到您的项目中,然后再介绍Realm的基本用法。 将Realm数据库添加到项目中的第一步是下载它。 我将使用CocoaPods进行此操作。 如果您尚未安装CocoaPods,则可以通过转到项目的根目录并运行此命令sudo gem install cocoapods来轻松安装它。 之后,您需要运行pod repo update 。 此命令将更新CocoaPods,以便它了解Realm的最新版本。 接下来,您需要创建一个Podfile。 为此,在项目的根目录中创建一个名为“ Podfile”的新文件。 现在,您需要打开该文件,并添加以下内容。 目标'{YourProjectName}’做 use_frameworks! pod’RealmSwift’ 结束 请记住将{YourProjectName}更改为您称为项目的名称。 创建Podfile并从上方添加代码后,您需要在根目录中运行pod install 。 这样,CocoaPods会将Realm安装到您的项目中。 请注意,下载大约200MB可能需要一些时间。 不用担心,以后再存档应用程序时不会那么大。 安装完成后,如果需要打开Xcode,则需要关闭它。现在,您需要打开{YourProjectName} .xcworkspace。 如果双击该文件,它将打开Xcode,您应该可以运行您的应用程序作为测试。 在本教程中,我将为所有示例使用默认的ViewController.swift。 开始使用Realm之前,我们需要做的第一件事就是导入RealmSwift。 为此,请将此行代码添加到其他导入所在的文件顶部 导入RealmSwift 这样做将允许您创建Realm的新实例,但是我们还没有。 要创建模型,您只需创建一个继承Object类。 我将创建两个模型,一个用于用户,一个用于宠物。 看起来像这样: 现在,当您要创建一个新用户时,您需要做的就是创建一个User或Pet的新实例。 为此,我将创建两个函数。 一个将是创建一个新的User ,另一个将是创建一个新的Pet 。 函数将如下所示: 这两个功能将使我们能够创建新的用户和宠物。 为了用领域保存数据,我们需要做的就是创建我们在上面的代码中创建的对象的新实例。 要创建和保存新数据,我们要做的是以下操作: 在上面的代码中,我们要做的第一件事是创建一个Realm的新实例,稍后将在尝试保存数据时使用它。 我们创建一个名为“ Spot”的新Pet和一个名为“ […]

Moya入门

Moya是一个Swift网络抽象库。 它为我们提供了一种无需直接与Alamofire进行通信即可进行网络呼叫的抽象方法。 通过本教程,我们将学习如何开始使用框架,发现一些技巧和窍门以及从代码示例中学到所有基础知识。 让我们首先讨论为什么不使用 Moya: 它为您的项目引入了依赖性。 项目的成功部分取决于Moya的稳定性。 有更多原因使您不想使用Moya,但它们都是第一点的衍生副作用。 您应该始终考虑为任何项目添加依赖项的成本。 要更深入地分析为什么最好在Swift中从头开始构建自己的API管理器,请帮个忙,并阅读Matteo Manferdini撰写的精彩文章。 刚开始使用Cocoapods时,我以为找到了一些开发人员的超能力。 我最终意识到,了解事物的实现方式比拥有库中的超级代码更为重要。 这就是您提高开发人员技能的方式。 Moya背后没有一些与服务器通信并返回JSON的黑魔法代码! 如果我们允许别人去思考,我们将失去力量和收缩的能力。 —艾伦·怀特 为什么您会选择Moya: 立即设置API管理器。 干净的代码和最佳实践。 专注于应用程序的核心功能,而不是网络。 易于为单元测试添加网络响应。 了解如何使用流行的Swift网络库。 您是否曾在工作岗位上看到“使用REST API的最佳实践和知名库的经验”? 我一定有 使用Moya这些和其他包含的内容有很多好处,但这并不意味着用纯Swift编写网络层是困难的或不希望的。 可以使用首选的依赖安装方式来安装Moya:https://github.com/Moya/Moya#installation 提示:安装依赖项时,请始终指定库版本。 例如,如果您正在使用Cocoapods,请为您的项目指定一个特定的版本号! pod’Moya’,’10 .0.1’#撰写本文时为最新版本。 在建立网络经理之前,我会事先建议一些设计和规划! 是的,我知道,作为开发人员,我们只想获取代码。 但是花一些时间来计划我们的工作将是值得的投资。 那么,我应该计划构建一个网络管理器吗? 没有那么多! 让我们保持简单,直到两个问题。 我总是在计划时会先提出一些需要提供答案的问题: 我将向哪些端点请求数据? 如何建模从端点返回的数据? 当回答这两个问题时,我只需简单地在笔记中列出所有端点,然后从预期的JSON创建伪代码模型。 如果您正在使用已经有文档的API,则可以使用提供的文档作为参考。 对于大多数示例,我将使用The Movie Database API🍿。 借助Swift 4的Codable协议,我们无需使用任何对象映射库或编写自定义映射器即可将JSON转换为模型。 让我们建立我们的电影模型,MovieResults模型。 电影模特 如果我们向The Movie Database API请求获取播放电影的请求,则返回的JSON响应如下所示。 […]

在iMessage中创建看起来像聊天气泡的聊天气泡-简单的方法

本文是有关创建(iMessage样式)聊天气泡的两篇文章的第一篇。 本文基于Rob Kerr的原始教程。 在本文中,我们将探讨创建带有尾巴的聊天气泡的简单方法。 在第二篇中,我们将介绍高级方法。 本教程是使用Swift 4.1和Xcode 9.2创建的。 源代码在Github上可用。 本教程将教您如何创建一个带有尾巴的聊天气泡,它看起来像是iMessage中的聊天气泡。 但这与创建一个成熟的聊天应用程序无关。 我将专门关注如何以简单的方式创建动态大小的气泡。 让我们开始吧! 我们的气泡将基于易于拉伸的图像 为了拉伸图像,我们将使用resizableImage(withCapInsets capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage UIImage实例的resizableImage(withCapInsets capInsets: UIEdgeInsets, resizingMode: UIImageResizingMode) -> UIImage方法 另外,我们将使用boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect String实例的boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : […]