Tag: ios

与Jenkins和Fastlane的iOS持续集成和交付(第1部分)

在这一部分中,我们将: 了解什么是持续集成和持续交付以及为何如此重要 在MacMini上设置Jenkins 创建一个构建作业,从Github存储库中签出您的项目 在构建服务器(以及本地开发计算机)上安装fastlane工具 将fastlane集成到您的项目中并创建示例车道 请注意,我使用MacMini作为专用的构建服务器。 如果您使用的是MacBook,也可以阅读本文。 但是,在生产场景中,您可能要避免在执行自动构建的本地计算机上运行Jenkins。 1.什么是持续集成和持续交付? 持续集成(CI)是一种软件工程实践,通常将孤立的更改集成到较大的代码库中并立即对其进行测试。 持续集成的目标是验证这些更改的正确性,并尽快检测出集成错误。 为此,在每次集成后运行自动化测试是很普遍的。 连续交付(CD)是构建可以随时发布到生产环境的软件的功能。 持续交付的目标是确保软件代码始终处于可部署状态,无论它包括新功能还是仅包含错误修复。 2. CI和CD为什么重要? 每个与许多开发人员一起在开发团队中工作过的人都知道,将团队成员一直在努力的不同分支整合在一起可能会带来问题。 即使没有任何合并冲突,也总是有可能您在不注意或破坏构建的情况下弄乱了某些功能。 如果您使用的是持续集成,则更改将在集成之后立即进行测试,如果有任何问题,几乎会立即通知您。 频繁执行集成测试可确保大大降低交付损坏功能的风险。 频繁执行集成测试可确保大大降低交付损坏功能的风险。 除了对新功能和变更进行测试之外,能够随时发货也很重要。 想象一下,在最新的生产版本中存在一个严重的错误,您需要尽快发布一个错误修正版本。 如果您的交付过程花了几天时间才能准备好发布,这可能已经太迟了,有些用户已经卸载了您的应用程序。 3.为什么要在iOS项目中使用CI / CD? 无论您是定期将内部版本上传到测试服务(如TestFlight,Beta还是Hockey),还是要在较短的发布周期内提交应用程序更新(应该这样做),您都很可能会浪费大量时间重复以下步骤再三,一而再再而三: 执行回归测试 递增版本/内部版本号 负责签名和配置 上载到iTunes Connect 更新AppStore截图和元数据 考虑一下如何可以做一些有生产力的事情。 好在,这是个好消息:您可以轻松地自动化此繁琐的过程。 🚀 4.在MacMini上设置Jenkins 1.重新安装Mac OS X(在本文撰写时为Sierra) 2.创建一个新的管理员用户帐户。 (詹金斯稍后会创建一个单独的用户帐户) 3.从www.jenkins.io下载最新的Mac OS安装程序并运行它。 或者,您可以使用自制软件安装Jenkins( brew install jenkins) 4.安装程序完成后,它将自动打开浏览器并转到http:// localhost:8080,这是您的jenkins的本地地址。 (如果您是Mac OS的全新安装,则需要先安装Java。只需打开终端,输入jave并选择More Info…或从此处下载最新版本的JDK)。 […]

TIL:重新定基

当我第一次开始基础调整时,我发现它令人恐惧。 我认为肯定需要进行重大更改,覆盖我为特定分支所做的所有工作,而成功做到这一点是不可能的。 但是,经过几次失败的尝试,我实际上可以说我在另一边还活着,现在,我喜欢变基!!! 因此,对于外行来说,这是您需要重新设置基准的方案: –您是从master分支开始的,但是其他人同时将他们的更改合并到master,因此您需要合并这些更改。 应用更改的最好方法是重新设置基准。 如果将rebase命名为其他名称,例如说“ update”或“ modernize”或“ get-wid-it”,我认为更多的人会发现rebasing很有趣。 首先,在尝试重新设置基准之前,可以通过备份所做的更改使自己省心。 您可以通过以下方式做到这一点: 创建一个临时分支,该分支将冻结您的分支更改,直到重新定基础 复制并保存您已更改的任何文件,或将整个项目本地保存在计算机上 因此,现在,世界就在您的牡蛎上,而您必须彻底出错,才能完全失去所有工作。 因此,这是有关如何重新设置基准的简短教程: 在分支机构的基础项目目录中,在终端中运行: git rebase master -i ←’i’表示交互式,它使您可以管理和修改提交历史记录。 您将在分支上看到提交列表,并且可以选择pick , squash , drop等等。它们中的每一个都是有用的,并且具有不同的用途,但是为了简单起见,在本教程中,我不再赘述。 您可以按原样离开并pick每个提交(或压缩除第一个提交以外的所有提交)。 如果没有合并冲突,您将看到以下消息: Successfully rebased and updated refs/heads/your-branch-name. 但是,您可能会有合并冲突。 同样, merge conflicts是一个令人恐惧的名称-如果将其称为“需要编辑”或“选择武器”或“购物”,它将更容易获得。 因此,这是纠正合并冲突的方法: git status ←这将向您显示哪些文件存在合并冲突 open file-name-that-has-merge-conflict ←然后,在IDE中打开每个文件,然后选择所需的代码(您将在HEAD上看到该版本,并在本地分支上看到该版本)。 git add file-name-that-had-merge-conflict ←添加/保存更改 git rebase –continue ←继续基础 您可能需要重复上述步骤几次(每次正在处理的提交中存在合并冲突时,一次)。 最后,您应该看到令人垂涎的消息: […]

Photogram 2构建和发布您的应用

我们如何拥有一个有效的应用程序,我们已准备好将其推向世界! 由于Ionic团队已将本指南中的Todo应用程序提交至应用程序商店,因此您可能想在本章中继续使用自己制作的新应用程序。 因此,首先,我们需要针对希望部署的每个平台生成应用程序的发布版本。 在部署之前,我们应该注意调整开发期间所需的插件,这些插件不应该处于生产模式。 Android发布 要生成Android的发行版本,我们可以使用以下cordova cli命令: $ cordova build –release android 这将基于config.xml的设置生成一个发行版本。 Ionic应用程序将在此文件中具有预设的默认值,但是如果您需要自定义应用程序的构建方式,则可以编辑此文件以适合您的首选项。 请查阅config.xml文件文档以获取更多信息。 接下来,我们可以在platforms/android/build/outputs/apk找到未签名的 APK文件。 在我们的示例中,文件为platforms/android/build/outputs/apk/HelloWorld-release-unsigned.apk 。 现在,我们需要对未签名的APK进行签名并在其上运行对齐工具以对其进行优化,并为应用商店做好准备。 如果您已经具有签名密钥,请跳过这些步骤,而改用该步骤。 让我们使用JDK随附的keytool命令生成私钥。 如果找不到此工具,请参考安装指南: $ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 首先将提示您为密钥库创建密码。 然后,回答其余好工具的问题,当所有这些完成后,您应该在当前目录中创建一个名为my-release-key.keystore的文件。 注意 :请确保将此文件保存在安全的地方,如果丢失,将无法向您的应用提交更新! 现在,打开您的photogram2文件夹,并根据您的环境更改文件build.json : 在进行构建之前,我们将允许执行一些脚本,以帮助您进行构建 $ chmod 755 ./bin/* 创建一个名为releases的文件夹,该文件夹将生成您的APK以发布到Google Play $ mkdir releases 每当您为Google Play生成apk时,您都可以输入此命令,以便自动运行生产的整个构建过程 […]

iOS应用:小费计算器

目标 :构建可自动计算不同小费金额的小费计算器iOS应用。 代码 :查看我的代码存储库以获取完整的代码。 👩🏻💻 摘自:我不得不认真思考如何在用户点击其他小费按钮时动态更新应用程序以计算正确的小费金额。 主要突破是连接提示按钮。 在iOS中,按钮是分段的数组,每个按钮都可以表示为数组的索引。 一旦我意识到🦉,那么真正的问题就是创建提示[18%,20%,25%]数组,该数组映射到相应的按钮段索引。 例如)分段按钮索引0映射到我的笔尖数组18%。 (基于零的索引) 最后,将视图链接到Swift内的函数或变量对我而言是一个神奇的时刻。 😮我❤️iOS应用程序的编码非常直观,就像我在调试器中编码一样。 快去吧! 👩🏻💻 让我们打开Xcode。 文件>新建>项目>单视图应用 产品名称:tippy 团队:这是您在MacBook上向Xcode注册的团队名称 组织名称:保留默认值 组织标识符:这是您的网站名称,但DNS顺序相反。 按下一步>将其保存在桌面上>创建 小费应用程式启动 注意按一下此按钮,很少有面板切换可以打开/关闭左侧和右侧面板。 接下来,单击Main.StoryBoard 单击View Controller内的大框以选择>单击文档图标(文件检查器)>取消选中“使用自动版式”复选框 双击放大 在对象库中搜索ui标签并将其拖到主应用程序视图中:“ uilabel” 将标签放置在主应用程序视图的左上角 接下来,在Objec(Obj)库(lib)中搜索“ uiview”>选择“视图”元素>拖入主视图区域。 3,元素Search Obj Lib:“按钮”并拖入主应用程序视图。 查看左侧面板,查看已添加的所有元素的列表。 这类似于Photoshop中的图层视图。 接下来,单击面板的右上角>选择“属性”图标 尝试更改“视图”图标的背景颜色:单击“视图”>确保“属性”图标突出显示为蓝色>将背景颜色更改为浅灰色。 要查看模拟器的选项>单击活动的方案按钮>,您可以看到许多版本的iPhone。 注意:如果您有iPhone Comamand + r(或按播放按钮)以运行模拟器。 我已连接设备,因此现在我可以在iPhone上看到它的运行状态。 或选择iphone 6s模拟器>点击播放按钮(Comamand + r) iOS应用程式)绝对位置可以。 您所看到的一切。 将“标签”移到故事板左侧>单击播放按钮(命令+ r)。 注意更改已反映在您的模拟器上。 […]

在UIkit中创建iOS自定义视图

最初 由 Andres 在2017年10月17日 发布在 www.scalablepath.com 上。 我刚从大学毕业就开始使用iOS。 使用不熟悉的平台和编程语言是一项挑战。 真正使我紧张的是什么? 是创意团队要完成的设计。 出色的设计可以为网站注入新的活力,但它越独特,就越有可能需要在UIKit中创建iOS自定义视图。 作为一个新开发人员,这可能会令人生畏。 本文的目的是解释如何将任何设计转换为功能用户界面元素。 iOS定制视图 视图是应用程序用户界面的基本构建块。 通常,您可以通过将故事板中的视图从库中拖动到画布来在其故事板上创建视图。 但是,有时您需要使用UIKit中的标准“标签”或“按钮”元素创建一个不可用的元素。 这是您需要自定义视图的时间。 顺便说一句,如果本文中的任何术语听起来都不熟悉,您可能需要查看Apple的UIKit文档。 在本文的其余部分,我将假设您具有UIKit和Swift的使用知识。 初始设计 让我们从选择无法在标准UIKit视图中重新创建的设计开始。 我找到了由耿高设计的“圆形进度栏”,它非常适合该法案。 此元素由两个文本标签(标题和副标题)和一个圆形完成指示符组成,该指示符旨在在任务进行时填充灰色轨道。 我们将从创建一个新的Xcode项目并将其命名为CircularProgressBar开始。 文件>新建>项目>单视图应用程序 当我们将创建自定义UIView时,我们需要使用新类CircularProgressBar扩展UIKit的默认UIView。 导入UIKit class CircularProgressBar:UIView { } 有两种向设计中添加标签的方式:通过代码或使用.xib文件。 为了避免进一步的混乱,术语“ xib”和“ nib”通常可以互换使用。 NIB来自“ NeXTSTEP Interface Builder”,这是苹果现已停产的操作系统。 虽然.nib文件已替换为.xib文件,但开发人员仍将其称为“ nibs”。 我喜欢使用.xib文件创建我的iOS自定义视图,因为它们需要较少的编码并且更容易进行更改。 因此,我们执行此操作,并将其命名为CircularProgressBar。 文件>新建>文件,然后选择查看 我们将在导航器中选择CircularProgressBar.xib,然后将.xib的文件所有者定义为我们的类扩展名:CircularProgressBar 等一下,什么是文件所有者? StackOverflow提供了比以往任何时候都更优雅的解释: “文件所有者是一个实例化的运行时对象,在加载.nib时,它拥有.nib的内容及其出口/动作。 它可以是您喜欢的任何类的实例。” 有了这些了解,我们将隐藏状态栏,并将.xib的大小设置为“自由格式”。 这样,我们可以更改尺寸,以便视图具有与设计相似的尺寸。 在这种情况下为300 x […]

键入gcc main.c – Ekaterina Kalache –中会发生什么

键入gcc main.c会发生什么 gcc是一个进行预处理,编译,汇编和链接的编译器。 让我们更仔细地研究这些过程。 让我们在名为main.c的文件中编写一个简单的C程序(必须具有.c扩展名才能执行C程序)。 并在其中编写我们的代码。 保存文件并返回提示后,我们需要t0编译文件,以便可以执行它。 我们使用命令gcc和文件名。 这将开始编译过程,我们可以分为以下步骤: 1,预处理 预处理程序将删除注释(/ *此处的文本将被预处理程序* /删除)。 它还将包含来自标头(#include )的库。 它将用代码替换宏名称。 现在我们的文件进入编译器。 2.编译 编译器将生成一个汇编代码,并将我们的代码转换为汇编语言。 现在可以将其传递给汇编器。 3.组装 汇编程序会将代码转换为二进制代码,该二进制代码将仅包含1和0,因此计算机可以理解它。 现在,我们的代码已准备好传递给链接器。 4.链接器 链接器会将我们的代码与代码运行所需的库链接,并将所有内容打包到单个可执行文件中。 通过运行“ gcc main.c”命令后列出文件,我们可以看到它。 在我们gcc-ed main.c之前 在我们gcc-ed main.c之后 现在,我们有了名为a.out的可执行文件。 这是一个默认文件,如果我们不指定应将可执行代码放入的文件,则会创建该文件。 最后,我们可以继续执行代码。 我们还可以决定创建一个可执行文件,并使用– o选项将其命名为所需的任何名称,后跟所需的文件名,例如helloC。 在这种情况下,所有内容都将打包到可执行文件helloC中。

gDoc主屏幕

通过创建一个使用docs url架构转发到您的文档的html文件,从iPhone主屏幕打开一个gDoc文件。 我想以一种一键式方式从手机访问我的每日签入文档-问题是Google文档无法让您保存到主屏幕,并且无法在Safari中编辑文档。 是的,我可以将Docs应用程序保留在主屏幕上,但是如果最近未编辑该文档,则很难获取。 所以这里是解决方案:我创建了一个单行html文件,该文件使用docs应用url架构转发到doc: 为了使事情变得更加用户友好,我添加了标题和图标。 我知道我遗漏了所有其他(多余的)html🙂 示例文档 您可以从ios移动设备对其进行docs-homescreen测试。 您也可以在此处下载文件并对其进行自定义。 然后上传并使用Safari访问它,系统会提示您打开Goog​​le文档。 点击取消,然后将该网址保存到主屏幕。 现在,当您单击新创建的主屏幕图标(单击)时,它将要求您打开Goog​​le文档(单击),然后您将tadaa放入文档中。 两次点击! 本文最初出现在这里。

Core蓝牙入门

核心蓝牙 核心蓝牙是Apple提供的iOS框架,允许使用低功耗蓝牙技术开发应用程序。 该框架抽象了Bluetooth LE内部工作的一些技术方面,使开发人员可以专注于其实际使用。 中央x外围设备 蓝牙LE标准中的通信由两个主要角色构成:中央和外围设备。 外围设备是提供信息的元素:在客户端-服务器方法中,将是谁拥有其他设备所需的信息。 中央利用外围设备提供的信息来运行其任务,如下所示: 为了使中央可以看到外围设备,它发送广告数据包,指示其存在并将传输数据。 该数据包的尺寸很小,仅包含基本信息,例如外围设备的名称和所传送数据的类型。 中心进行扫描,换句话说,它“侦听” BLE广告数据包,以决定是否应从特定设备读取数据。 设备可以具有各种不同的服务,而不仅限于发送一种类型的信息。 温控器可以发送其实际温度及其最近的每小时读数。 外围设备提供的每个服务可以具有许多信息类型,称为特征: 如前所述,由于性能原因,广告包故意很小,它们没有列出外围设备可用的所有功能和信息。 由中心来询问外围设备具有的服务和特性的列表。 这些特征可以分为3种类型:读取,写入或通知。 在此示例中,我们将使用可写特征将数据发送到外围设备,而不仅仅是从外围设备读取信息。 这将颠覆我们先前将外围设备视为服务器而将中央设备视为客户端的概念,但将向您展示事物的灵活性。 让我们在Pratice中看到它 首先,创建一个新的单视图项目: 给它一个名称和项目的包ID,在下一个屏幕上选择“在Mac上创建Git存储库”,到此为止。 使用以下属性创建一个名为Constants.swift的新swift文件: 您可以在终端上使用命令“ uuidgen”创建一个UUID。 Core Bluetooth将使用此标识符来快速有效地找到您的服务。 为了简单起见,我们将有两个视图控制器,一个用于发送数据(外围),另一个用于获取数据(中心)。 您可以通过更改Main.storyboard中的视图控制器基类来选择要在每个设备上运行的设备。 PeripheralViewController(接收器) 在项目中添加一个名为PeripheralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中: 另外,创建一个名为peripheralManager的属性来保存CBPeripheralManager的实例,并在viewDidLoad下对其进行初始化。 核心蓝牙几乎可以使用了。 为了能够处理外围设备响应(并停止XCode的警告消息),请将其添加到PeripheralViewController.swift文件的末尾: 我们的代码仅应在用户打开蓝牙无线电时运行。 外围设备管理器代表有一种方法,该方法在每次蓝牙状态更改时运行。 将其添加到最近创建的扩展中: 现在,当状态更改为开机时,很好地打印一条消息并调用一个名为startAdvertising()的方法,如下所示: startAdvertising()最初调用createPeripheralService(),后者创建一个可写服务以用于接收消息,该消息将由另一台设备的中央设备写入。 外围设备管理器收到写调用时,将触发didReceiveWrite委托: CentralViewController(发送方) 在项目中添加一个名为CentralViewController.swift的新视图控制器。 在UIKit语句下,将Core Bluetooth导入其中: 另外,创建一个名为centralManager的属性来保存CBCentralManager的实例,并在viewDidLoad下对其进行初始化。 我们需要一个集合来保存对我们发现的外围设备的引用,因为如果Core Bluetooth没有强大的引用,它们会自动取消分配它们。 在外围示例之后,在CentralViewController.swift的末尾添加此扩展名: 这次,当蓝牙状态更改为打开时,中央管理器将开始使用与外围设备管理器中使用的SERVICE_UUID相同的外围设备进行扫描。 这样,中心将仅扫描具有该特定服务的设备,而不扫描附近所有可用的蓝牙设备,这将导致不必要的电池消耗。 当中心发现一个新的外围设备时,它将其添加到我们的createdPeripherals集合中并尝试连接到它: 之后,如果外围设备已连接,我们将尝试发现其服务,并出于与发现外围设备相同的原因指定SERVICE_UUID。 […]

Bundler是iOS开发人员的好朋友

这是“ 一切都与工具有关 ”周期 的第2条 。 所以, 抽象 Bundler是一个简单而强大的Ruby gem依赖管理器。 等等,为什么标题为“ iOS developer”的Ruby? 答案很简单-两种最流行的iOS开发工具(cocoapods和fastlane)几乎完全用红宝石编写,并以Ruby gem的形式分发。 尽管您可能尚未使用fastlane,但您肯定已经听说过cocoapods,并且我99.99%的人肯定在开发过程中使用了cocoapods(或使用了它,但停止使用Carthage)。 所以,让我告诉您一些有关上述宝石的故事… 故事1 最近,我意识到我的机器上确实堆满了XCode游乐场: 其中一些是Swift独立的,另外一些则必须嵌入XCode项目中,因为它们应该与Alamofire,ReactiveSwift等3d方库一起使用。 我决定为此目的创建一个XCode项目“ PlaygroundsHost”,用我正在使用的最广泛使用的Pod填充它,然后将所有Playground缓慢移入该项目以将它们保持在单个位置。 将3d-party库集成到游乐场的流程很简单: 创建一个新项目。 关闭它。 在根文件夹中创建一个Podfile。 装上必要的豆荚(例如Alamofire) 运行pod install 运行open *.xcworkspace打开新创建的工作区 创建一个新的Playground,将其放置在项目文件夹中的某个位置(在我的情况下为$PROJECT_DIR/Playgrounds/MyPlayground.playground ) 将创建的Playground拖到XCode中。您将看到类似以下内容: Cmd + B构建所有Pod和项目 完成后,您现在可以在操场上使用import Alamofire了。 您的XCode Project Navigator选项卡如下所示: 好吧,我做到了…… 错误:无法查找符号: __T09Alamofire7requestAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodO6methods10DictionaryVySSypGSg10parametersAA17ParameterEncoding_p8encodingAJyS2SGSg7headerstFfA3_ 我很困惑,尝试使用Google问题,结果发现可可足类1.4.0和1.5.0之间的游乐场集成出现了问题。 我的本地版本是1.5.2。 一个人可以将可可豆的版本降级到某个版本吗? 绝对可以。 在项目之间进行切换时,是否值得一直上下使用版本? 绝对不… 故事2 我的开发人员几天前曾问我,我是否现在正面临一个奇怪的问题,即他正在CI配置上,而在导出存档时却遇到了“ Lottie.framework不支持配置文件”的构建失败。 我们聊了一会儿,猜测该问题可能与cocoapods更新及其Copy Frameworks构建阶段有关。 […]

在Xcode 10中启用新添加的选择加入功能

在WWDC 2018期间,Apple宣布了具有许多新功能的Xcode 10。 其中的许多功能会自动为您提供并默认启用,但其中一些功能可能不会显示,需要进行一些手动调整。 代码折叠 要启用它,请在“ Text Editing > Editing下打开首选项,然后选择Code folding ribbon 。 增量构建 在其他年份中,我们当中许多人可能会使用“ Whole Module编译模式来缩短构建时间。 正如苹果在博客上告诉我们的那样: 全模块优化是Swift编译器的优化模式。 整个模块优化的性能胜利在很大程度上取决于项目,但是它可能高达两倍甚至五倍。 建议今年,我​​们建议不要隐式使用“ Whole Module编译模式,而应使用“ Incremental以获得更好的结果。 默认情况下,应在Xcode 10中启用此功能,但您可能需要在项目中进行验证。 正如Apple在“ Swift的新功能”会议中提到的那样: 使用 整个模块 进行 调试 构建是改进构建的权宜之计。 整个模块 可防止增量构建。 定义正确的优化级别 自Swift 4.1起可用,有一个新的优化模式可用,该模式可以进行专门的优化以减小代码大小。 更深入的细节可以在Swift博客文章Swift 4.1中的代码大小优化模式中阅读。 提高测试性能 Xcode 10引入了许多与测试性能有关的改进。 单元测试和UI测试的完成速度都比过去快得多。 通过打开测试方案设置,可以启用三个新选项: Execute in parallel on Simulator 。 这将在多个模拟器上并行运行UI和单元测试,并大大加快测试速度。 Randomize execution order […]