Tag: 命令行

iOS:使用命令行在设备上进行UI测试!

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() […]

simctl:从命令行控制iOS模拟器

在开发iOS应用程序时,模拟器是开发人员的最好朋友。 这是在开发过程中测试应用程序的快速简便的方法,因为我们可以使用GUI与iOS模拟器进行交互。 苹果公司关于模拟器入门的文档很棒,我们几乎可以通过使用图形用户界面来学习有关控制模拟器的所有知识。 尽管模拟器很容易与GUI一起使用,但是脚本模拟器交互要在Continuous Integration服务器上运行有点痛苦。 幸运的是,Apple有一个不错的命令行实用程序,名为“ simctl”。 在本文中,让我们看看如何使用’simctl’与iOS模拟器进行交互。 我们将介绍以下内容 创建,删除和引导模拟器 将照片和视频添加到模拟器 在模拟器中安装/卸载,启动/终止应用程序 捕获截图并录制模拟器视频 收集模拟器日志和其他技巧 simctl Apple具有“ simctl”二进制文件,可从命令行与iOS模拟器进行交互。 它与Android的adb非常相似。 再次,这是Apple记录不足的另一个实用程序,但是我们可以在/Applications/Xcode.app/Contents/Developer/usr/bin/simctl中找到二进制文件,并将其与xcrun实用程序一起使用。 我们可以使用help命令访问所有可用选项 $ xcrun simctl帮助 我们可以使用’simctl’在iOS模拟器上执行各种操作,包括创建新模拟器,擦除模拟器,在模拟器内部安装应用,向模拟器添加照片/视频等等。 让我们详细研究其中的几个。 列出所有可用的模拟器 我们可以使用命令轻松列出所有可用的模拟器 $ xcrun simctl列表 该命令将列出运行时所有可用的模拟器。 如果已经在运行,它还将显示“已启动”模拟器。 在模拟器上的CRUD操作 我们可以使用simctl创建,擦除,删除,引导,关闭和升级模拟器。 创建 我们可以使用命令在现有的iPhone7(iOS 10.3)模拟器之上轻松创建名为“ My-iPhone7”的新模拟器。 $ xcrun simctl创建My-iphone7 com.apple.CoreSimulator.SimDeviceType.iPhone-7 com.apple.CoreSimulator.SimRuntime.iOS-10-3 我们可以看到使用列表选项新创建的模拟器,并且拥有模拟器’C86A559A-1F50–40D1–8D84–954EDFBBCE18’的UUID 关机/擦除/启动 正如我们已经看到的那样,已经启动了另一个模拟器,让我们关闭它并擦除其内容。 这里的顺序很重要,我们不能在引导状态下擦除模拟器,我们需要先关闭然后再擦除。 $ xcrun simctl关闭C8C050F3–062D-4444-A888-BBEC783E31BD $ xcrun simctl擦除C8C050F3–062D-4444-A888-BBEC783E31BD 开机 现在,让我们使用新的UUID引导新创建的模拟器 […]

使用Swift Package Manager ArgumentParser处理命令

在命令行应用程序中解析参数不是一件容易的事。 随着时间的推移,应用程序可以演变为支持许多功能,这使得支持的参数数量大大增加。 例如,令人印象深刻的curl命令行工具具有207个不同的参数选项,包括参数和标志。 大量的选择使curl非常灵活和有力。 但是,它也很难使用。 很难学习和掌握。 较新的命令行工具(例如git , gem , carthage或travis通过将其分组在子命令中来更好地组织其功能。 例子: git clone , git fetch , git branch , git commit , git push … gem install , gem update , gem build … carthage update , carthage build , carthage archive … travis login , travis monitor , travis status … 让我们看看如何使用Swift […]

我最终如何完成我的第一个副项目?

我编写了一个简单的命令行工具,用于从macOS终端将屏幕快照更新为Imgur。 在开发此工具时,我做了一些注释以供将来参考。 API整合 在花哨的项目中使用API​​是很常见的。 需要我们实施的真正的API转换实际上是有限的。 对于这个项目,我们只需要: 用户授权 刷新用户授权 开机自检图片 因此,最好列出所需的API,然后仔细编写可重用的函数。 束 处理项目的资源文件的路径非常令人困惑,因为二进制文件的工作目录在编译时和运行时可能会有所不同。 使用Bundle对构建项目的全面结构非常有帮助。 对于迅速的框架,macOS应用程序或iOS应用程序,Xcode将为您创建plist和一个简洁的Bundle。 但是,对于快速的CLI,我们可能需要对其进行一些配置。 如果要在运行时访问文件,则需要:1.转到项目2.选择目标3.在“ Build Phases添加“ New Copy File Phase 4.添加所需的文件 然后,您可以使用Bundle.main.path()搜索路径。 Bundle.main.path(forResource: “config”, ofType:”plist”) 读取配置文件? 再想一想 我当时是从Swift SPM构建项目的,但后来更改为使用XCode命令行工具项目,因为SPM不支持资源。 在实现Imgur的API时,我尝试使用网络框架Alamofire ,但是在CLI中安装它时遇到了很多麻烦。 此外,我发现“复制文件阶段”没有复制回文件,因此更新的配置将根本不会保存。 然后,我意识到我不需要从头开始读取用户配置,只要二进制文件可以访问我长期存储的配置文件即可。 最后,我放弃了XCode以使用SPM,并使用’Boundle`方法在产品目录中写入用户配置文件。 Bundle.main.bundleURL.appendingPathComponent(“config.plist”) 具有OAuth的API 对我来说,这个项目中最困难的部分是弄清楚如何在我的快速代码中转换Imgur的API。 我强烈推荐API模拟应用Postman。 使用独立的GUI测试API逻辑和参数要容易得多。 但是,即使我对POST请求使用了完全相同的标头和正文,我遇到的问题是“ URLRequest”和“ URLSession”不起作用。 这是我关于Stackoverflow的问题。 事实证明,主体数据有许多编码格式。 这是有关Stackoverflow的有用参考。 application / x-www-form-urlencoded→默认 multipart / form-data→输入文件时使用 文字/纯文字→不推荐 我在Postman中使用了“表单数据”格式,但在“ […]

在C,Go和Swift中构建小型跨平台CLI工具

这就是我写一个简单工具的方式。3次,用不同的语言。 本实验 我的目标是编写一个非常简单的命令行工具,该工具可以生成与Google Authenticator兼容的一次性密码。 Google身份验证器使用基于时间的一次性密码算法(TOTP)生成代码。 我不想使用自己的实现,而是想使用现有的TOTP库,因为已经有很多不错的库。 本质上,我要我的工具要做的就是接受一个秘密作为单个输入,然后调用现有的TOTP库生成代码,并将生成的访问代码打印到标准输出中。 我问自己的问题是:假设我想在多个平台(Mac,Windows,Ubuntu)上使用该工具,并且希望 在少数人(不一定是技术人员)(例如同事)中分配工具,哪种编程语言将是最实用/可行/有趣的选择? 当然,您可以从多个角度看待这个问题。 让我们专注于构建和分发工具。 然后,这些是我的“应有”要求: 应该有可能将工具分发为“开箱即用”的单个可执行文件,这意味着用户不必安装运行时,框架,库等依赖项。 使用相同的代码库(但可能使用不同的工具链),应该可以为多个平台生成构建。 语言选择 我想为这个特定的实验创建一个二进制文件,这就是为什么我没有为此特定工具考虑诸如Node.js,Ruby和Python之类的解释语言的原因。 当然,尽管总的来说,这些语言都能为编写跨平台命令行工具提供完全可行的选择。 这些语言还有一个缺点,那就是最终用户需要安装运行时(例如Node.js)。 尽管许多平台都预先安装了常见的运行时,但是用户可能需要安装其他版本。 对于非技术用户而言,这并不总是一件琐碎的任务。 (我知道有一些工具可以将解释后的语言编译为独立的可执行文件,但这有点像在作弊) 。 最后,我的选择是尝试使用C , Go和Swift 。 我决定留在“编程语言舒适区”,因为学习一种新语言不是我实验的一部分。 因此,我没有尝试过(很有用)非常有趣的其他语言,例如Rust ,我将在以后尝试 (随时对您的Rust经验发表评论)。 也许还需要注意:在本实验中,我考虑了C ++的过大杀伤力(或者实际上,我的C ++ 只是缺乏知识)。 我学到的是 C 通常,使用C构建的可执行文件是动态链接的。 这意味着最终用户需要安装依赖项(链接的库)才能运行该工具。 那绝对不是理想的。 有很多解决方法,但是所有这些都有一些缺点: – 静态链接:创建单个二进制文件,其中将包含所有必需的二进制代码。 但是,这要求您使用的所有库(例如TOTP库)都支持静态链接。 绝对不是总是这样。 此外,Apple在Mac OS X上不支持静态链接的二进制文件。 – 将链接的动态库与您的应用程序一起分发 。 这意味着对于每个目标操作系统,您都必须预先构建所有链接的库,请确保可执行文件可以找到这些库(例如,在macOS上更改rpath),并将其与应用程序捆绑在一起。 换句话说,您需要将.dll (Windows) .dylib (macOS)或.so […]

如何在Xcode中构建命令行应用

我最近在Xcode中为命令行创建了一个代码练习,但是遇到了很多配置问题。 最后,我能够构建两个目录,一个目录用于可执行文件,另一个目录用于测试并容纳所有代码。 在本快速教程中,我将引导您通过Terminal设置命令行项目。 这将使用Swift Package Manager,因此我将使用它生成的默认代码。 跳到底部,可以查看有关如何允许用户输入.txt文件名并允许Terminal打印其内容的非常快速的教程。 本文使用: Xcode版本9.2 Apple Swift版本4.0.3 首先,打开两个终端窗口并输入以下内容: mkdir CommandLineAppDirectory cd CommandLineAppDirectory / mkdir CommandLineApp mkdir CommandLineAppExe 到目前为止,非常简单,设置一个目录文件夹,导航到其中,并创建两个文件夹,其中一个附加了Exe,这样我们就知道哪个是可执行文件。 接下来,让我们设置我们的CommandLineApp。 我们将最后保存可执行文件。 cd CommandLineApp / swift package init –type库 快速测试 迅捷包generate-xcodeproj 打开CommandLineApp.xcodeproj / Swift Package Manager的库包设置了使球运转所需的一切。 它将为您提供Package.swift文件,Sources目录和Tests目录。 swift test将构建并测试您的项目,因此您可以通过命令行从根目录进行测试。 生成Xcode项目并打开它后,便可以使用⌘+ U进行构建和测试。 它会自动具有一个示例测试和主文件,供您查看它的工作原理。 打开CommandLineApp.swift文件并添加一些公共级别的代码,以便Exe可以访问它。 公共结构CommandLineApp { public var text =“您好,世界! 我已经成功创建了一个可测试的项目!” public init(){}} 现在我们有了要使用的文件,我们将初始化一个git […]

用Swift编写结构化CLI

Commander是一个Swift框架,用于通过与Swift标准库协议Decodable&Decoder集成来解码命令行参数。 Commander可以通过声明command的结构和该命令的options而无需编写任何代码来解析cli参数,从而帮助您编写结构化的cli程序。 使用Commander,您只需要专注于编写命令的options结构,其余工作将由Commander自动处理。 结构化CLI,命令和选项均通过struct或class声明进行struct 。 通过实现可Decodable协议,选项类型是类型安全的。 自动为commander或command生成帮助消息。 支持Shell补全。 支持Bash / zsh自动完成脚本。 Swift 4兼容性。 零依赖和纯Swift。 支持Linux和swift build 。 Mac OS X 10.10 + / Ubuntu 14.10 Xcode 10 斯威夫特4.2 // swift-tools-version:4.2 依赖项:[ .package(URL:“ https://github.com/devedbox/Commander.git”,“ 0.5.6 .. <100.0.0”) ] 指挥官命令–key值–key1 = value1 指挥官命令–bool 指挥官命令-k值-K = value1 指挥官命令-z = value#{“ z”:“ value”} 指挥官命令-z#{“ z”:true} 指挥官命令-zop#{“ z”:true,“ o”:true,“ p”:true} […]

适用于iOS开发人员的前5个命令行工具

注意:这是我在XCblog上的原始博客文章的转发 。 Xcode附带了许多命令行工具,您可以在以下路径找到它们 /Applications/Xcode.app/Contents/Developer/usr/bin 每个人都有特定的目的,但其中一些对于iOS开发人员的日常角色非常重要。 大多数iOS开发人员喜欢通过Xcode或使用第三方GUI工具来完成GUI的所有操作,但是经验丰富且经验丰富的开发人员会使用诸如boss之类的命令行工具。 每个iOS开发人员都应该知道一些有用的工具,并且其中几乎没有以“ XC”为前缀的工具。 在这篇文章中,让我们浏览其中的五个。 xcodebuild xcodebuild命令是iOS开发中所有命令的父级。 您可以使用“ xcodebuild”命令执行大多数iOS开发人员任务,例如清理,分析,构建,测试,存档,但是您需要将很多选项传递给“ xcodebuild”才能完成正确的事情。 您可以使用手册页浏览这些选项 $ man xcodebuild 或者,您可以在此处的网页中找到所有这些有用的信息。 我们可以使用xcodebuild来构建,测试和归档我们的项目目标或方案。 “ xcodebuild”的示例为 > xcodebuild测试-project MyAppProject.xcodeproj -scheme MyApp -destination’platform = OS X,arch = x86_64′ -destination’platform = Simulator,name = iPhone,OS = 10.2′ “ xcodebuild”是一个巨大的命令,掌握它会花费很多时间,但是一旦知道了它,就可以编写与iOS开发相关的任何脚本。 Xcode选择 Xcode具有活动的开发人员目录,通常位于/Applications/Xcode.app/Contents/Developer/或我们可以使用环境DEVELOPER_DIR进行设置。 命令xcode-select用于管理Xcode的活动开发人员目录,以便我们可以同时管理两个版本的Xcode。 我们可以在Xcode版本之间切换,例如我们想使用Xcode beta $ sudo xcode-select —切换/Applications/Xcode-beta.app/ 我们也可以使用’xcode-select’通过命令使用GUI交互来安装Xcode命令行工具 $ xcode-select-安装 xcrun […]