Tag: swift

Swift PH在mClinica Health Solutions举行的2019年首次聚会!

mClinica Health Solutions Inc.主持并赞助了Swift PH的第19次聚会。 该活动的参与者包括开发人员和学生。 该活动始于Michie宣布Swift PH的2019年计划。其中包括计划于今年第三季度或第四季度举行的iOS会议。 第一次演讲是由高中生Chio,Carla和他们的团队举行的。 演讲的主题是Javascript如何与Swift进行连接,以及它们的iOS和Web应用程序原型的展示。 演讲结束后,他们询问有关如何改进其系统的建议,并由参加该活动的开发人员迅速回答。 因此,在所有讨论完成之后,他们与一些开发人员进行了动手实践。 跟着Charmaine和她在Universal Links上的演讲。 她首先简要介绍了深层链接及其工作方式。 她的演讲中还包括一个有关如何设置通用链接的教程,从编辑Xcode项目到在网页上实施以添加iOS支持开始。 还描述了使用通用链接的优点。 短暂休息之后,我谈论了Xcode Schemes和Targets,它们主要侧重于管理环境。 我解释了将用于我的主题的Xcode的一些部分,然后我做了一个简短的演示。 演讲后,听众问了几个问题,并迅速得到答复。 最后,伊曼纽尔谈到了由Airbnb开发的动画库Lottie。 他说:“开发人员不仅应该专注于代码,还应该关注用户的体验。” 他的演讲重点更多地向我们展示了如何使用它以及我们可以使用Lottie做什么。 他展示了将Lottie集成到项目中是多么容易,并且针对Lottie的一些用例做了简短的演示。

Xcode 9的主线程检查器和XCUITests

苹果公司最近发布了Xcode 9的稳定版本,其中包含许多新功能。 大多数iOS开发人员都说Xcode 9是最好的版本,因为它具有iOS开发人员一直想要的强大新功能。 您可以在此处阅读有关Xcode 9功能的更多信息。 我们刚刚将现有的XCUITest套件迁移到Xcode 9,发现通过XCTest编写的单元测试通过了,但是XCUITests停止工作并出现以下错误。 主线程检查器:在后台线程上调用的UI API:-[UIApplication委托] PID:740,TID:51958,线程名称:(none),队列名称:FIRAnalyticsQueue,QoS:9 XCUITests根本无法启动代理测试运行器应用程序,并且测试套件崩溃了。 从错误消息中可以明显看出,这与Firebase SDK有关,并且与主线程检查程序有关。 你们中的某些人可能已经陷入这个陷阱,或者您将很快迁移到Xcode9。在本文中,我们将讨论该错误的全部原因,以及新的具有Xcode功能的主线程检查器将如何帮助捕获潜在的错误。在应用程序中。 在陷入错误之前,我们将学习WTF是Main Thread Checker,以及Apple为何将其作为Xcode 9的一部分引入的原因。根据文档,“ Main Thread Checker从后台检测到对AppKit,UIKit和其他API的无效使用”线。 “ 这是什么意思?。 iOS开发人员可以轻松理解这一点,但是对于其他人,我将尝试用简单的语言进行解释。 有一些Apple框架旨在仅在主线程中在iOS应用中使用,在后台线程中使用这些框架是一种罪过。 如果您在后台线程中使用这些框架,那么您可能会在下一生中下地狱。 如果iOS工程师在后台线程中使用这些框架,则会发生疯狂的事情,如UI响应迟钝,视觉缺陷,数据损坏和崩溃。 简而言之,在后台线程中使用这些框架将使您的iOS应用成为可能。 主线程检查器发现框架的这种无效用法,并在运行时警告工程师,不要这样做。 它可以检测出罪魁祸首,以便您在不解决问题时对其进行惩罚。 Main Thread Checker是方便的工具,可以尽快检测到代码中的错误。 默认情况下,它在Xcode 9中被激活。 XCUITest启动名为XCUIApplication的代理测试运行器应用程序,以在代理应用程序中启动测试。 相应方案的XCUITest的主线程检查器处于活动状态。 在启动应用程序的UI时,主线程检查器检测到Firebase SDK在后台线程中使用了UP API。 Firebase团队已修复了Github上存在的问题。 可能还有其他一些第三方框架可能存在相同的问题,例如Flurry用户也在此处在Github上报告了相同的问题,但在撰写本文时仍未解决。 我们几乎没有办法解决此问题并开始使用带有Xcode 9的XCUITests。 如果问题在应用程序内部,我们可以通过解决iOS框架无效使用的问题来修复XCUITests。 如果主线程检查器检测到Firebase SDK等第三方框架中的问题。 我们需要让他们立即解决问题。 如果主线程检查器检测到第三方框架中存在的问题,并且他们无法及时解决该问题,那么不幸的是,我们需要从该方案中禁用主线程检查器。 转到“产品”>“方案”>“管理方案”,搜索用于测试的方案,然后在左侧栏中按“编辑”,然后按“测试”,然后转到“诊断”并取消选中“主线程检查器”复选框 请记住,这不是理想的解决方案,这是我们不应该在代码中添加的hack。 我们应该专注于直接在代码中解决导致无效使用框架的问题。 我希望,当您遇到相同的问题并节省几个小时的调查时,您会发现这篇文章很有用。 您是否已将XCUITests迁移到Xcode […]

SonarQube与iOS的集成

什么是SonarQube? SonarQube是SonarSource开发的开放源代码平台,用于连续检查代码质量,以对代码进行静态分析来执行自动检查,以检测20多种编程语言中的错误,代码气味和安全漏洞。 声纳斯威夫特 Backelite开发的Swift插件帮助人们将Sonar集成到Swift项目中。 它涵盖以下几点。 代码覆盖率:这是Sonarqube中可用的度量之一,它描述了在运行自动测试时执行了多少行代码。 Sonar-Swift将为您提供已执行的代码块,并允许您深入数据并确切查看在特定测试期间执行和未执行的代码行。 在项目中设置代码覆盖率设置有助于保持代码的可维护性和易更改性,并且拥有涵盖大多数或全部应用程序的测试套件意味着您将拥有更高的安全性,以确保某些产品不会在生产中崩溃。 可维护性:声纳可维护性是代码气味的数量加上根据一组预定义规则(基于您使用的Lint)在代码中所欠的技术负担。 Sonar为每个部分提供了简单的评分,使您可以快速查看所分析的应用程序的性能。 可靠性:可靠性等同于正确性,发现和修复的错误数量,应用程序在交付中的一致性以及对代码例程已知结果的信心 安全性:关于安全性,Sonar涵盖了可以在项目中找到的漏洞数量。 几分钟即可显示解决所有漏洞问题的工作。 为Swift设置Sonar 步骤1.下载并设置SonarQube 1.下载SonarQube:https://www.sonarqube.org/downloads/ 2.解压缩下载的文件。 3.将下载的文件移到/ Applications /文件夹下。 4.将其重命名为SonarQube并删除版本后缀。 第2步。下载并设置SonarScanner 1.下载SonarScanner:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner并单击Mac OS X 64位。 下载Mac OS X专用的SonarScanner 2.解压缩下载的文件。 3.将下载的文件移到/ Applications /文件夹下。 4.将其重命名为SonarScanner并删除版本后缀。 步骤3.使用新路径更新.bash_profile 1.启动终端并运行以下命令。 $ cd〜/ $ vi .bash_profile 2.上面的命令将在vi编辑器中打开您的bash_profile 。 3.使用向下箭头键跳至最后一行。 4.使用左右箭头导航到最后一个字符。 5.按i启用插入模式。 6.复制并粘贴以下行。 #声纳设置 导出PATH = $ PATH:/ Applications / SonarScanner […]

Xcode Server + Ansible:可扩展和可编程的iOS CI / CD基础结构

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 关于Xcode Server的抱怨之一是它不能扩展用作大型或企业级。 但是,如果您具有理解和管理用于iOS部署的基础结构的技能,则可以使用iOS和DevOps工具包的混合为中小型或大型iOS团队轻松实现可伸缩性。 过去,在我之前在Photobox Group工作时,我们使用工具Ansible + Fastlane + TeamCity的组合实现了这一目标。 您可以在此处阅读我在Moonpig Engineering博客上的博客文章,以了解我们如何实现这一目标。 在这篇文章中,我们将看到学习Ansible和Apple的CI解决方案Xcode Server之类的DevOps工具如何可以轻松地管理大规模的iOS CI / CD基础架构。 与iOS相比,iOS开发的持续集成实践并不理想,因为iOS开发有一些独特的挑战。 必须了解整个iOS生态系统才能为团队设置和管理CI / CD基础结构。 一些高级/高级iOS开发人员或iOS技术架构师/主管非常了解Apple开发人员工具,技术和基础架构的全部堆栈,并在其项目中实施,但是目前业内大多数iOS开发人员只是iOS开发人员,他们擅长编写Swift或Objective-C为Xcode内部的应用程序构建UI。 但是,在了解基础架构时,它们确实很烂。 他们没有正确理解Xcode在幕后使用的底层工具和技术,这就是为什么他们完全无法设置或管理iOS应用程序的CI / CD做法。 因此,他们始终必须依赖本地Xcode或DevOps团队的人员来管理所有基础架构堆栈,否则CI / CD将由昂贵的第三方服务来处理。 这意味着开发人员不是完整的堆栈,也不了解他们自己的工具和技术。 不幸的是,iOS开发的世界充满了这类业余爱好者和烦恼的开发人员。 没有团队中的熟练工程师,持续集成将不会成功。 在我以前的文章中,我写到了CI失败的5大原因。 这些是错误选择的CI服务器,CI Amature工程师,缺少作为代码的基础架构,质量差的构建服务器以及团队缺乏支持。 除了iOS工程师无法理解整个iOS生态系统之外,iOS生态系统的自动化还存在一些传统挑战。 其中一些是由苹果专有软件强加的,而其他则是由于缺乏自动化iOS和macOS基础架构的工具。 一些常见的挑战是 缺少可用于自动执行基础结构的配置管理工具。 Chef,Ansible和Puppet不适用于macOS服务器。 缺少用于配置和自动安装软件的官方软件包管理系统。 我们必须使用第三方解决方案,例如HomeBrew 缺乏官方的依赖管理工具。 我们必须使用迦太基或Cocoapods来管理依赖关系。 Swift […]

Moya作为具有可编码的网络层

莫雅是什么? 为什么呢? Moya是我们想要一些网络抽象层来充分封装实际直接调用Alamofire的层。 它应该足够简单,以使常见的事情变得容易,但是应该足够全面,以使复杂的事情也变得容易。 Moya的出色功能: 编译时检查API端点访问是否正确。 使您可以定义具有关联的枚举值的不同端点的明确用法。 将测试存根视为一流公民,因此单元测试非常容易。 安装 安装部分在Moya的Github页面上描述得非常好。 API 我们将使用JSONPlaceholder作为我们的API。 让我们从模型开始 对于输出模型,我们将使用typealias Codable = Encodable&Decodable 。 使用TargetType创建API枚举 为了使发布尽可能容易,我们将只使用1个POST和2个GET路由。 让我们创建API枚举: 并在其之上添加Moya的必要扩展: 首先, baseURL 。 这用于我们的API的基本URL: 接下来, path 。 我们使用它来定义不同的路由(例如/ posts , / comments等): 接下来, 方法 。 我们可以为不同的func定义不同的方法: 接下来,我们需要样本数据进行测试。 我们不会在那个帖子上介绍这个。 因此,让我们给它一个简单的Data() : 接下来,我们需要定义任务 。 我们需要.requestPlain来获取所有Post 。 .requestParameters用于获取特定的Post 。 最后, .requestJSONEncodable用于使用我们的Codable对象创建一个Post 。 最后,我们需要headers 。 这将与我们的所有请求一起发送: 创建我们的网络代表 […]

Swift中不可恢复的错误的处理

本文是一个示例,说明了我们如何研究Swift标准库的功能行为,不仅在库文档上而且还在其源代码上建立了我们的知识。 程序员称之为“错误”的所有事件都可以分为两种类型。 由外部因素(例如网络连接故障)引起的事件。 由程序员的错误引起的事件,例如到达开关操作员的情况,这是不可达的。 第一类事件在常规控制流中处理。 例如,我们通过向用户显示一条消息并设置一个应用程序以等待网络连接恢复来对网络故障做出反应。 我们尝试在代码投入生产之前尽早发现并消除第二种类型的事件。 这里的方法之一是运行一些运行时检查,以可调试状态终止程序执行,并打印一条消息,指出错误在代码中的何处发生。 例如,如果未提供但调用了所需的初始化器,则程序员可以终止执行。 在第一次测试运行期间,将始终注意到并修复该问题。 现在很清楚,对于程序员来说,最重要的选择是,如果运行时检查显示错误,那么发行时的程序行为应该是什么样的。 这里的关键要点是assert(_:_:file:line:)和assertionFailure(_:file:line:)使得程序失败的影响不那么严重。 例如,iOS应用可能已损坏UI(因为某些重要的运行时检查失败),但不会崩溃。 但是这种情况可能不是您想要的。 您可以选择。 Never用作无条件引发错误,陷阱或无法正常终止的函数的返回类型。 这些功能实际上不会返回,它们永远不会返回。 在这五个终止函数中,只有preconditionFailure(_:file:line)和fatalError(_:file:line)返回Never因为只有这两个函数无条件地停止了程序执行,因此永不返回。 这是利用Never键入命令行应用程序的一个很好的示例。 (尽管该示例不使用Swift标准库终止函数,而是使用标准C exit()函数)。 如果printUsagePromptAndExit()返回Void而不是Never ,您将收到一条生成时错误消息:“ ‘守卫’主体不能掉落,请考虑使用’return’或’throw’退出范围 ”。 通过使用“ Never您可以事先声明您永远不会退出范围,因此编译器不会给您生成构建时错误。 否则,您应该在保护代码块的末尾添加return ,这看起来不太好。 如果您确定所有运行时检查仅与Debug配置相关,则使用哪个终止函数都没有关系。 在应用-Ounchecked同时仅使用fatalError(_:file:line)同时允许使用fatalError(_:file:line)指令的程序可以访问。 如果您担心运行时检查可能会在发布中以某种方式失败,请使用assert(_:_:file:line:)和assertionFailure(_:file:line:) 。 至少您的应用程序不会崩溃。 使用“ Never使您的代码看起来很整洁。 WWDC视频“ Swift的新功能”介绍了SWIFT_OPTIMIZATION_LEVEL构建设置(从11分钟开始)。 在Swift中从不内部工作 NSHipster关于Never性质的文章 Swift论坛上有关建议弃用-Ounchecked讨论。 最初于 2018年12月19日 发布在我的独立博客 witbit.io 上。

小片段#1:在Swift 3中分组

Swift 3中经典的“分组依据”功能的简短实现,作为数组扩展。 给定一个元素数组和一个条件函数,grouped(by :)使用条件函数返回的键将该数组转换为字典。 条件函数接受一个Element并返回其分类。 例如,如果您要将偶数和奇数分开,则条件闭包将返回“偶数”或“奇数”。 我经常用它来按创建日期分隔元素。 我希望这能帮到您。 如果您知道这样做的更好方法,请在下面的评论中告诉我! 谢谢! 🙌

Swift脚本可在iOS上对本地化字符串文件进行管理

设置完成后,当您的应用程序启动并调用专用的SDK方法进行OTA更新时,您的应用程序将收到下一次启动的 Localizable.strings的最新版本。 请记住这一点! 此外,建议 您冻结先前版本的捆绑软件。 因此,某些更新的值(不是键)将导致 String(format 🙂 崩溃 。 如预期的格式值“版本%s”而不是“版本%@”)或任何翻译错误。 Bundle featurr听起来不错,但: 第一次启动还是网络问题呢? 如果出于任何原因,Lokalise.co不再响应该怎么办? 你明白了。 我们还需要使本地Localizable.strings文件保持最新。 此外,我们需要安全生成的SwiftGen密钥在整个项目中使用它们,因为没有人有时间进行这种类型的行: [[Lokalise sharedObject] localizedStringForKey:@”key” value:@”default value” table:@”table name”]; 通过更新模板模板,我们已经完成了此操作。 要通过Lokalise.co API下载最后一个可本地化的文件,我们可以制作bash脚本,Ruby脚本或Python脚本。 但是 … 创建Lokalise.co Swift脚本下载器🚀 使shell命令可以调用🤓 为了与Swift代码中的shell交互,我们必须编写两个实用程序方法。 它们是使用bash命令编写脚本脚本的关键。 现在,每次开发人员或翻译人员在Lokalise.co上更新您的翻译时,只需运行您的Swift脚本即可将其自动放入您的项目中。 更好:为它创建一个别名 要由项目上的翻译告知更新的键,请不要犹豫使用集成。 我们使用 Slack集成, 每天跟踪更改非常有用。 您可以通过链接直接访问特定的更新或添加的密钥。 创建一个Swift脚本构建阶段以生成复数 等等,SwiftGen不管理复数吗? 是的,SwiftGen尚不管理复数: 解析Localizable.stringsdict文件以支持复数·问题#184·SwiftGen / SwiftGen 我检查了整个存储库,找到了一些有关如何使用Swiftgen处理复数的文档,但是我没有找到…… github.com 您可以为其创建专用的模板或演化版,但是自从我们第一个Lokalise.co Swift脚本以来,我们迫不及待地要编写另一个模板,尤其是我的同事Arnaud🍻。 让我们迅速吧! L10n扩展为复数 我们想要的Swift代码就是这种类型的行: […]

利用开发包

许多CocoaPods Pod开箱即用,可以满足您的应用程序需求。 但是有时,您必须修改它们以执行某些特殊操作。 CocoaPods使过程更加轻松。 因此,将您的项目成像到SwiftyDropbox 。 这意味着,您的Podfile有类似以下Podfile : 平台:ios,“ 9.0” 项目’MyApp.xcodeproj’ use_frameworks! 目标“申请” use_frameworks! #Dropbox pod’SwiftyDropbox’,’〜> 4.1.0′ 结束 在某个时候,您决定修改SwiftyDropbox某些文件。 您可以导航到Pods Xcode项目下的文件,但是当您尝试编辑它时,Xcode会询问您有关解锁的信息。 即使使用Unlock进行响应,下一次$ pod update时, 所做的编辑也会丢失。 您要做的是将吊舱安装为开发吊舱。 首先,派生原始存储库并将其克隆到本地文件系统很有用。 我建议重命名目录,将派生名称为SwiftyDropbox-yourusername突显事实,这是您的派生而不是原始存储库。 同样,您计划进行的更改值得保留与当前HEAD分开的分支。 为了从磁盘上的git repo安装Pod,而不是将其托管在云上,必须将Podfile记录修改为: pod’SwiftyDropbox’, :git =>’/ Users / yourusername / path / to / repo / SwiftyDropbox- yourusername ‘, :branch =>’mybranch’ 可是等等! 这样,依存关系仍以锁定的文件状态安装,并且在下一次$ pod update删除更改。 要在Podfile指定Development Pod, […]

Swift片段#9-然后

2017年2月6日,星期一 您可以在这里找到其要点! 每当我们必须安全地解开可选值时,通常我们有2个选项- if let guard let 两种解决方案都很棒,而且都没错。👍但是我感到安全地解包可能会变得更好。🤔因此,我对Optional进行了扩展,并创建了一个函数,该函数仅当存在某些解开值时才执行闭包! 可以这样使用: 让名字:字符串? =“ Ritesh” name.then {print($ 0)} 其中$0是您可以根据需要使用的展开值🚀 如果您对 Swift-Snippets 的诞生感到疑惑, 或者想查看更多此类片段,可以在 这里 找到它们 😊