Devากที่ได้รับหน้าที่เป็นMobile Dev.。 ฝั่งiOSก็ได้ทำCIบนJenkinsทั้ง单元测试และUi Testingผ่านFastlane…。 ก็สะดวกดี runาคือหลายครั้งที่เมื่อrun ui testบนเครื่องjenkinsมันไม่เสถียร iา ที่มั ผ่านบ้างแล้วแต่ดวง(พูดเล่นนะ) UiTestที่มันมากับ fastlane ui-testingเนี่ยโดย默认默认รันบน模拟器ที่ใช้ทรัพยากรของเครื่อื่ มีอมี工作ื่รๆนพร้อมกันก็ทำให้เครื่องช้า(Mac miniรันUi,单元测试ของทั้งAndroidและiOS) iางทีมก็เริ่มอยากรันUi TestingบนDeviceเพราะเชื่อว่ามันจะดีกว่าที่รันผ่าน仿真器 และมันก็เป็นอย่างนั้นจริงๆราะโดยปกติ UIา ที่รัน UI TestจะบนJenkinsด้วfastlane(simulator)ใช้เวลา〜20分钟 ีกอาจจะพังใช้เวลาหาสาเหตุอีก〜10分钟ลองรันบนเครื่องตัวเองอีก〜7分钟โถ่ววชีวิต Device ล อลองรันบนDeviceกลับใช้เวลา〜8分钟แล้วTesterก็เห็นscreenของdeviceตอนrunด้วยดี้ดีย์ ขี้เกียจเล่าแล้วมาลองกันเถอะ… สร้าง项目ง่ายๆเพื่อลอง เหมือนทำแอพเปิดปิดอะไรสักอย่าง… เมื่อเริ่มต้น应用 ให้状态เป็น关闭 วนไป上的และเมื่อกดปุ่มON / OFFให้状态เปลี่ยนไปเป็น…。 codeนcodeนั้นอยู่ด้านล่างจย้า 设置方案Ui测试设置项目ให้รันได้นDeviceได้นะครับ provisionานการเพิ่มเครื่องเข้าไปใน供应配置文件เซ็ทApps IDให้โปรเจค ส่วนนี้ค่อนข้างยาว ViewController.swift 导入UIKit 类ViewController:UIViewController { @IBOutlet弱var lightStatusLabel:UILabel! @IBOutlet弱var lightSwitcherButton:UIButton! var isLightOn = false 覆盖func viewDidLoad(){ super.viewDidLoad() […]
通常,您需要向财务部门证明如何为您提供新的笔记本电脑会提高生产率。 使用此脚本,您可以确切地向他们显示等待Xcode花费时间的时间。 #!/bin/bash 让我们开始一个新的BASH脚本。 在脚本的整个生命周期中,它应大约运行swiftc (Swift编译器)运行的时间,并应与Xcode项目完全脱钩。 当我们在这里时,让我们获得其他一些有趣的统计信息,例如最长的构建时间和我们编译代码的次数。 首先,我们需要声明我们的变量。 让我们在脚本顶部编写该代码,以便在需要时可以轻松地对其进行编辑: INTERVAL = 5#采样率,以秒为单位 COMPILE_TIME = 0#总编译时间 ALL_TIMES =()#所有编译时间的数组 PREV_TIME = 0#临时存储 在这个阶段,我正在想象该脚本没有自然的退出点-它会一直运行,直到您从终端用^C (control + c)杀死它为止。 我们应该截获(也就是“捕获”)此中断信号,处理我们收集的数据,打印它,然后退出脚本: #当用户键入^ C时, #运行函数ctrl_c而不是退出 陷阱ctrl_c INT 函数ctrl_c(){ #找到最长的构建时间 最大= 0 对于$ {ALL_TIMES [@]}中的v; 做 如果(($ v> $ max)); 然后max = $ v; fi; 完成 #很好地格式化我们的数据 TIME_SPENT_S = $(日期-u -r $ max […]
OAuth + NativeScript 这是第三部分系列的最后一部分。 在第1部分中,我将基于NativeScript的POV作为解决方案。 在第2部分中,我讨论了使用Angular + NativeScript进行更改检测。 在最后一部分中,我将介绍如何将OAuth工作流程集成到NativeScript应用程序中。 以下内容假设您对OAuth 2.0有所了解。 OAuth 在NativeScript中使用OAuth提供了一些障碍。 特别是如果您使用Google作为提供商。 过去(2-3年前),您可以在本机应用程序中执行OAuth,只需将Web视图嵌入到您的应用程序中,允许用户浏览工作流程并查看弹出的code或token的URL。另一端。 如今,Google已消除了该集成渠道(有关安全性,可用性…… yada yada yada😜),您需要使用真正的OS浏览器来引导用户完成工作流程。 这使其更加复杂。 现在,您不仅要查看嵌入式浏览器的URL,还必须了解操作系统将自定义协议的链接路由到您的应用程序的能力。 所以现在看起来像这样 使用callbackURL(例如customprotocol://google/oauth浏览器打开到OAuth工作流程 用户通过工作流程 在auth工作流程结束时,浏览器将重定向到customprotocol://google/oauth?code=blahblah 发生这种情况时,操作系统将拦截该链接并将事件路由到您的应用程序。 因此,您需要侦听它们,拉出code参数,然后从OAuth提供程序请求令牌。 对于iOS,这表示为: 提供一个SFSafariViewController (上面的步骤1)。 通过实现侦听UIApplicationDelegate (上面的步骤4)中的链接: -(布尔)应用程序:(UIApplication *)app openURL:(NSURL *)url 选项:(NSDictionary *)选项 最后,对于NativeScript,您需要: SFSafariViewController : … 让safariVC = new SFSafariViewController({URL:url}); page.ios.presentViewControllerAnimatedCompletion(safariVC,true,null); 实施自定义应用程序委托: 导出类AppDelegate扩展了UIResponder实现 UIApplicationDelegate { 公共静态ObjCProtocols = [UIApplicationDelegate]; applicationOpenURLOptions?(app:UIApplication,url:NSURL, […]
如果您想要更深入的解释,请跳至注释部分👇🏻,在其中我将详细分析脚本的每个组件。 总而言之,我想说,根据您想做的事情以及使用正确的工具,Swift当然是脚本编写的非常可行的选择之一! 有关信号量的注释 如果您想知道上面的脚本中为什么有DispatchSemaphore ,那是因为任何Swift脚本只要其控制流到达末尾就退出。 如果必须处理异步性(例如,由于加载了网页,就我而言),则需要使脚本保持生命的东西。 无耻的插件:如果想了解更多有关信号量的信息,请确保在此处阅读我的上一篇文章。 脚本和Xcode游乐场 如果您的脚本允许,我建议您在脚本开发过程中使用Xcode Playgrounds: 这样,无需在终端和代码编辑器之间进行切换就可以更快地进行测试。 准备就绪后,您可以快速将其变成真实的脚本。 代码段 对于这篇文章,我做了一个小仓库, Selenops🕷 (一只飞翔的蜘蛛,是的! 😱),在GitHub上: 在其中,您会找到与Xcode Playground,Marathon脚本和标准“ Command Line Tool ”脚本完全相同的脚本。 祝脚本编写愉快!
在iOS开发过程中,总会出现在整个项目中执行重复性任务的情况。 乍一看,您可能会发现其中的一些,后来又发现。 有可能: 管理所有项目资产,有时调整它们的大小以适合适当的尺寸,最后添加到Xcode项目中。 使用所有必需的文件(例如ViewControllers,Views,ViewModels等)创建新屏幕的文件夹结构。 在Fastlane和Quicktype之前,您需要手动执行以下任务: 在Testflight / Fabric上部署应用程序 根据API JSON响应创建模型 好消息是,iOS社区正在发展,并且有越来越多的工具可以自动执行日常开发流程,例如Sourcery或SwiftGen。 但是,如果它们都不满足您的需求怎么办? 您是否应该继续前进并继续手动重复进行所有操作? 还是应该使它们自动化? 好的,让我们写一些脚本,但是… 实际上,不需要使用Bash,Python,Ruby或其他脚本语言,因为Swift提供了编写脚本的功能。 与Marathon结合使用,在OSX上编写和安装脚本确实非常容易。 Marathon生成一个Xcode项目,并允许在脚本代码中使用依赖项。 让我们编写一个程序,该程序将生成具有所有所需类的自定义应用程序的屏幕文件夹结构。 在这种情况下,它将是“ 登录”屏幕文件夹。 每个文件都将包含样板代码以及已导入的所有必需库。 首先,让我们安装马拉松。 在撰写本文时,Homebrew还不支持最新版本的Marathon,因此我建议您通过Swift Package Manager安装它。 打开终端并输入: $ git clone https://github.com/JohnSundell/Marathon.git $ cd马拉松 $使 成功安装Marathon之后,第二步是创建FilesGenerator项目 $➜马拉松创建FilesGenerator $ Files在FilesGenerator.swift中创建脚本 $✏️打开FilesGenerator.xcodeproj / 它应该打开一个包含main.swift文件的Xcode项目 因为我们要对文件进行操作,所以最好添加名为Files的帮助程序依赖项。 让我们通过执行命令来做到这一点: $ marathon add https://github.com/JohnSundell/Files.git 关闭您的Xcode项目,然后输入以下内容再次将其打开: $ marathon edit FilesGenerator.swift 您应该看到添加了文件依赖关系的新的依赖关系目录。 现在,我们准备进行第三步编码。 […]
设置完成后,当您的应用程序启动并调用专用的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代码就是这种类型的行: […]
本文档提供有关如何配置构建脚本以在执行命令行工具的每个构建上运行的逐步说明。 以SwiftLint为例。 步骤1:首先,在构建脚本中安装要执行的工具(例如,通过Homebrew或Mint) 酿造安装swiftlint 步骤2:在Xcode中,选择目标以将构建脚本添加到 步骤4:点击+按钮,然后选择New Run Script Phase 步骤5:通过双击文本Run Script来重命名新脚本 步骤6:将以下脚本复制到Shell: /bin/sh下面的文本字段中Shell: /bin/sh Xcode复制脚本时会破坏所有缩进。 只需手动重新缩进即可。 步骤7(可选): 拖放您的构建脚本以指定应以哪个顺序运行。 现在只需构建您的目标( Cmd+B )即可查看它的工作原理。 请注意,脚本将确保仅在安装工具后才执行该工具。 其他未安装该工具的项目开发人员将看到Xcode警告,指出: 未安装SwiftGen,请从https://github.com/realm/SwiftLint下载 就是这样,快乐的编码! 本文 由 CihatGündüz 撰写 , Jamit Labs iOS开发 主管