Tag: iOS应用开发

iOS CI,增压

当Skyscanner看到为其iOS代码库做出贡献的开发人员的数量大大增加时,它便着手重建其私有Mac云。 这是发生了什么事。 为iOS开发-不像Apple Pie那样简单 在过去的五年中,我一直是Skyscanner的iOS工程师,致力于塑造我们的移动应用程序的功能。 后来我加入了移动DevOps团队。 这使我可以利用自己的移动体验来改善我们的iOS平台基础结构。 业内许多人认为可以简化针对iOS的开发。 在构建一致且可扩展的iOS CI系统时,这一点更加明显。 当我第一次加入DevOps团队时,Skyscanner将Jenkins CI与本地Mac Minis和Mac Pros结合使用。 这些负责运行Android和iOS作业,我们一一管理。 如果要增加工作执行者的数量,则需要购买新的Mac。 这是因为Apple EULA声明您只能在正版Mac硬件上构建iOS代码。 如果还希望使执行程序保持一致,则可以选择创建NetRestore映像或使用JAMF。 无论哪种方式,您都必须手动关闭Mac,并忍受在配置Mac时无法使用它们。 如果您在所有这些方面都认识到当前的CI系统,或者遇到类似的问题,请继续阅读。 我们有一个解决方案供您考虑。 通往云的阶梯 在2018年初,我们看到为iOS代码库做出贡献的开发人员数量呈上升趋势。 具有CI资源修复的更多开发人员意味着更长的队列和等待时间。 我们需要尽快实现动态的负载平衡资源。 对于Android,我们的任务相对简单。 Skyscanner Web堆栈位于AWS上,因此我们已经拥有必要的云知识和工具。 在先前的研究中,我们已经定义了配置虚拟机所需的命令。 使用HashiCorp的Packer,我们可以生成Amazon Machine Image。 Jenkins可以使用Jenkins EC2插件实例化它们。 在此过程中,我们学到了很多有关如何在虚拟机上呈现必要状态(例如缓存)的知识。 最后,我们可以将并行作业从4个增加到30个。 对于iOS,我们必须多走一些路:我们在知识上有些不足,需要在皮带上添加一些新工具。 在开始该项目后不久,我们遇到了Veertu提供的虚拟化技术Anka。 由于其性能和易用性,它成为了我们的私有Mac云的核心。 这是您如何使其工作的方法: 设置Anka控制器和注册表Docker容器。 前者接受对新Mac虚拟机的请求。 后者管理不同版本的VM。 在Mac硬件上安装客户端。 将客户端连接到控制器和注册表。 通过Anka Jenkins插件集成控制器并进行配置。 例如,您需要设置控制器应为其触发新VM的Jenkins标签。 开始在自由式和管道作业中使用标签。 这里没有银弹,我们所做的更改涉及权衡: 🤩可以在单个Mac Pro上运行多个VM,这意味着CI环境中可以使用更多资源。 有了Anka,我们不必在过渡期间牺牲速度。 完整的项目存档大约需要18分钟才能在裸机Mac […]

Swift中的通用数据源

在我从事的绝大多数iOS应用程序中,表视图和集合视图是最常用的UI组件。 由于设置表视图或集合视图需要很多样板,因此我最近花了一些时间来寻找一种避免一遍又一遍地编写相同代码的好方法。 我的工作重点是尝试通过一组抽象来封装所需的样板。 随着时间的流逝,许多其他开发人员都致力于解决这个问题,并且随着Swift的最新发展,已经开发了许多有趣的方法。 在这篇文章中,我将说明一段时间以来一直在使用的方法,以减少在应用程序中设置集合视图所需的样板。 表格视图与集合视图 “为什么只谈论集合视图而不是表视图?”你们中的一些人可能会问。 在过去的几个月中,我一直在每个实例中使用过集合视图,而以前,我本可以使用表视图。 到目前为止,它一直运行良好! 它帮助我避免了由于使用两个几乎相似但不完全相同的概念而产生的双重性。 我做出此决定的理由如下: 任何表视图始终可以作为具有一列的集合视图实现/重构。 桌面视图在大屏幕(例如iPad)上无法正常工作。 我想指出的是,我不建议您遍历代码库并将所有表视图重新实现为集合视图。 我的建议是,如果需要添加需要显示项目列表的新功能 ,则应考虑使用集合视图而不是表视图。 尤其是在使用通用应用程序的情况下,集合视图可能会通过动态调整布局来简化所有屏幕尺寸的工作。 Swift泛型和有用的抽象搜索 我一直是泛型编程的狂热者,所以可以想象,当Apple在Swift中引入泛型时,我感到非常兴奋。 但是,一段时间以来,泛型和协议无法很好地协同工作。 然后,随着Swift 2.x中相关类型的引入,创建通用协议变得更加容易,许多开发人员开始尝试使用它们。 我将要呈现的抽象开始是使用泛型(特别是泛型协议)的实验。 这样的抽象使我能够封装设置集合视图所需的样板,并将为集合视图创建数据源所需的代码减少为两行代码(用于简单用例)。 我想指出的是,我建立的并不是万灵丹。 我实现的抽象专注于解决一组特定的用例。 对于这些情况,它们在简化设置集合视图所需的代码方面做得相当不错。 对于某些更复杂的用例,可能需要其他代码。 我主要致力于隐藏与集合视图相关的最常见功能。 如果需要,可以封装更多功能,但是对于我的特定用例而言,并不是必需的。 出于这篇文章的目的,我将提供一些抽象,这些抽象涵盖使用集合视图时通常需要的功能。 这应该是一个很好的起点,以说明您可以使用泛型(尤其是泛型协议)构建的内容。 集合视图单元格抽象 我通常在实现集合视图时的第一步是创建要用于显示所需数据的单元格。 处理集合视图中的单元格时始终需要执行以下操作: 出队 配置单元 为了简化上述任务,我创建了两个协议: 可重用单元 可配置单元 让我们看一下上述抽象的细节。 可重用单元 ReusableCell协议要求您定义一个reuseIdentifier ,在使单元出队时将使用它。 在我的应用中,我通常采用以下约定:单元标识符与单元类名称相同。 因此,很容易通过创建协议扩展来使它抽象化,该协议扩展使复用标识符返回具有类名的字符串: 可配置单元 ConfigurableCell协议要求您实现一种方法,该方法将用于使用特定类型的实例来配置单元,该实例被声明为通用类型T : 当需要加载单元格内容时,将使用ConfigurableCell协议。 我将详细介绍它的一些细节。 就目前而言,我只想强调以下几点: ConfigurableCell扩展了ReusableCell 2.使用关联类型( associatedtype […]

编写一次,使用Create React(Native)App和react-native-web在任何地方运行

aka当工具存在时…组成它们! 编辑2018年1月:我已经用最新版本更新了本文(没有更多的beta依赖项!)。 感谢@KajiTetsushi的帮助! 🙂 编辑2018年2月:所有版本都与React v16.2.0保持同步。 (不再需要将React降级到16.0.0) 自从React Native的第一个版本发布以来,我一直希望建立一个可以在任何平台上运行的React代码库。 我喜欢使用Cordova和Web技术构建多平台应用程序,但是React Native现在凭借其本机性能提高了标准。 到目前为止,当您想要拥有Web和Native的统一代码库时,您必须弄乱构建系统(Webpack和React Native打包器),以使所有内容协同工作。 现在有了Create React Native App和Create React App,我们不必担心这一层的复杂性。 我将指导您完成一个可在任何地方运行的代码库的步骤! 你需要 : 最新版本的Node(当我写这篇文章时,它是8.6.0) 创建反应应用 首先,使用创建一个React应用程序: create-react-app my-hybrid-app && cd my-hybrid-app 我们需要在项目中添加一些依赖项: 要安装这些软件包,可以使用 npm 或 yarn 。 npm install –save-dev babel-plugin-transform-object-rest-spread babel-plugin-transform-react-jsx-source babel-preset-expo jest-expo flow-bin react-native-scripts react-test-renderer@16.2.0或yarn add –dev babel-plugin-transform-object-rest-spread babel-plugin-transform-react-jsx-source babel-preset-expo jest-expo flow-bin react-native-scripts react-test-renderer@16.2.0 […]

为什么选择iOS平台进行应用开发?

您的移动应用程序开发使用哪个平台? 嗯,这是几乎在所有会议室中都出现的问题,在这些会议室中,主管们正在为自己的业务决定合适的平台。 是否选择Android或iOS? 我们不要讨论哪个平台更适合您的业务,因为每个平台都有自己的优势。 相反,让我们讨论您的企业是否需要iOS平台来进行下一个应用程序开发,或者说为什么要选择iOS平台来进行应用程序开发: 最高的应用程序质量 我们一直在讨论有关在全球范围内采用Android设备的问题。 现在,如果我们看到下图,Android OS将以38.27%的市场份额统治世界(来源): 但是,这里我们关注的是应用程序的质量,而不是数量。 与其他任何OS相比,无论应用程序的功能和功能如何,iOS均可提供最高质量的应用程序。 2.高度安全的iOS平台 在2010年,苹果公司对其安全功能变得极为重视,这导致企业对iOS应用程序的使用增加。 苹果已经确保在iOS中拥有任何恶意软件并对其进行破坏绝非易事。 好吧,甚至连FBI和DOJ都没有,后者宣布他们已经尝试了19次来破坏iPhone的安全性。 但是,如果没有苹果的帮助,他们将无法做到这一点。 这意味着iOS平台非常安全,并且由于Apple在其App Store上全力以赴,因此没有恶意软件或威胁可以进入OS。 3. iOS平台表现更好 由于其严格的安全功能,iOS在企业中很受欢迎。 企业可以轻松地依靠iOS开发其应用程序。 我们了解数字化转型并了解其2018年的趋势,似乎要在数字化转型时代生存下来,企业需要提出企业应用程序以提高员工的生产力。 为此,他们认为应用程序需要高度的安全性。 而且,当考虑到安全性时,iOS会击败所有其他操作系统。 好吧,我们在iOS趋势中讨论了安全性统计信息。 4. iOS应用程序的可靠性 大多数组织在iOS上进行投资以获得最高的应用程序安全性和出色的用户体验。 在iOS中开发的应用程序易于使用且设计精美。 无论iOS应用是小型还是大型,开发人员都可以在任何应用程序中植入惊人的功能。 实际上,iOS与开发用于帮助任何硬件正常工作的应用程序非常兼容。 因此,您将看到更多使用iOS支持AR / VR的儿童游戏。 由于其卓越的用户体验,iOS是最受欢迎和最受欢迎的平台。 5.没有质量差的第三方应用程序 应用程序质量一直是Apple的重中之重。 而且,这就是为什么它绝不允许质量不佳的第三方应用程序进入iOS应用程序商店的原因。 与Apple不同,Android允许开发人员即使质量很差也可以上载应用程序,用户可以下载并体验最差的应用程序。 由于具有Android的垃圾应用程序体验,因此Apple iOS有更多优点。 6.支持HTML5的iOS 苹果公司一直以其客户服务而闻名,仅出于此目的,它提出了支持HTML5来开发混合iOS应用程序以提供更好的用户体验的想法。 实际上,Apple也希望iOS开发人员也能享受开发iOS应用程序的经验,这就是它在版本8期间改进HTML5支持的原因。iOS中HTML5的支持可帮助开发人员在他们开发的应用程序。 无论是用户还是开发人员,Apple都不会妥协提供更好的体验。 7.即兴的Siri 苹果公司的智能虚拟AI助手Siri吸引了iPhone和iPad用户的关注。 Siri可以回答您所有的问题,甚至可以与您交谈。 是的,在Apple的iOS 11公开Beta版中,Apple将即兴的Siri交给了开发人员。 看来苹果正在对人工智能和机器学习进行巨额投资,以改善其自己的Siri的用户体验。 8.改进的电源管理 日经新闻最近报道称,苹果计划最早在2018年在iPhone中推出其内部设计的电源管理芯片。 苹果一直站在最前沿,为iOS用户提供更好的电源管理。 […]

🍦去吃冰淇淋!🍦

为了迎接一年一度的七夕情人节特别隆重巨献奉上各式各样各样甜腻可人的冰淇淋青菜萝卜东坡肉〜各人有各爱请自行挑选口味吧 一只不够也可以吃两只还可以内部服外敷保证让你打从心里冷遍全身心如槁灰内附隐藏版彩蛋冰淇淋喔敬请好好吸收喔〜 moon0411 / 0817-iceCream 人们可以在GitHub上构建软件。 超过2千8百万的人使用GitHub来发现,发掘和贡献超过…… github.com 这次主要使用程式码+ Storyboard ID识别的方式来串连两页资料不过写完作业感到特别饿还是让我先出门吃支冰淇淋先 1.首页: getViewController •storyboard放置面 •action&outlet拉线完成,准备开始写程式噜〜 •struct iceCream型别•宣告数组ice []并编写内容•在IB动作func buttonPressed()写入要指定串连的控制器是哪个(用故事板ID识别) •数组。 randomElement() • present() @IBAction func buttonPressed(_ sender:Any){ 如果让controller = Storyboard?.instantiateViewController(withIdentifier:“ iceCream”)为? iceCreamIntroViewController { 让图片= ice.randomElement() controller.iceimage =图片 目前(控制器,动画:true,完成:nil) } 2.次页: iceCreamIntroViewController •动作与插座拉线•宣告可选变数 (注意:这次的变数名称取得不太好,以致到后来我自己都糊涂了,指称范围应该要更广更直觉一些,以免误会设定的变数内容) var iceimage:iceCream? •在viewDidLoad()写入次页想显示出的内容 如果让iceimage = iceimage { showImageView.image = UIImage(名称:iceimage.image) titleLabel.text =“ […]

在Swift中从回调到异步/等待

自从我写了一篇博客文章已经有一段时间了(实际上,这是我的第一篇文章,我没有任何借口!),但是我真的很想接触Swift中的异步编程。 您在Swift中编写的大多数代码至少必须在某种程度上考虑异步性。 在经过一些通常不属于控制器层的计算后更新ui时,即使如此,您也必须考虑这段代码的正确位置。 在除主线程之外的其他线程上更新UI是一个常见错误,可能会导致错过UI更新,视觉缺陷,数据损坏和崩溃。 当初学者从iOS开始时,他们会在其他进程完成后使用回调执行某些功能。 通常,如果需要,在操作完成后执行的功能链的最后一部分将是更新UI。 假设是这种情况,使用回调我们将必须在整个回调链中反复传递“ Update the UI”回调,直到到达链的末尾,最后调用该回调来更新UI,假设我们不想通过调用UI来污染我们的域/基础架构逻辑,因为我们重视关注分离。 让我们看一下一段代码如何从简单的回调演变为使用异步/等待,从而使您可以在后台线程中编写完全阻塞的代码,而每次只需编写几行额外的样板代码。 这与我刚开始使用Swift时编写的混乱非常接近。 我们的用例:我们正在构建一个应用程序,该应用程序将首先发出HTTP请求以检索一些json。 此json中是我们要下载的图像的URL。 最后,下载完该图像后,我们应该将其呈现给用户并在UI中显示。 让我们首先使用回调来构建它。 第一步是使用Data(contentsOf:)下载一些json,该json只是向端点执行GET请求,而没有任何标头或其他信息。 实际上,这是执行下载的最差方法。 Data(contentsOf:)应该仅用于本地文件,但是出于本博客文章的目的,假定绝对没有故意进行错误检查。 Grand Central Dispatch,简称GCD,提供了一个简单而强大的API,通过它我们可以在单独的线程中执行“后台”操作。 首先,让我们创建一个接受String并返回UIImage闭包。 然后,我们可以将其传递给对JsonDownloader的调用。 首先让我们看一下入口点,即ViewController 。 为了使这项工作涉及承诺,我们还需要做其他事情,但是目前,这是顶层代码。 我已经使用PromiseKit和AwaitKit已有几个月了,从编写带有回调的异步代码到此方法的变化令人震惊-它们使我的开发变得更加轻松和有趣! 我希望这篇文章能说服一些人看一下async / await,并将其从回调地狱更改为看起来更简洁易用的东西。 在下面的评论中让我知道,如果您当前的代码库中有回调地狱,是否正在考虑将其检查出来,或者是否有其他替代方法在更复杂的代码库中也能正常工作! 最初于 2018 年8月8日 发布在 blog.j7mbo.com 上。

2019年Stack Overflow开发人员调查中的移动开发人员要点

原始链接: 请阅读原始链接以获得更好的图形和格式。 2019年Stack Overflow开发人员调查中的移动开发人员要点 Stack Overflow发布了2019年开发人员调查,这可能是世界上最大的技术调查。 按照… shashikantjagtap.net XCTEQ的Stack Overflow Developer Survey 2019中的移动开发人员总结 Stack Overflow发布了2019年开发人员调查,这可能是世界上最大的技术调查。 按照… www.xcteq.co.uk Stack Overflow发布了2019年开发人员调查,这可能是世界上最大的技术调查。 根据Stack Overflow的统计,全球有将近9万名不同年龄,种族,性别,国籍和经验的开发人员。 该调查包括所有流行,喜爱和恐惧的技术/工具。 您可以在此处阅读详细调查。 Stack Overflow还列出了调查的主要结果,其中包括以下几点 Python是增长最快的编程语言 DevOps Specialist和SRE是收入最高,最令人满意的工作。 中国拥有世界上最乐观的开发商。 有毒的工作环境是生产力的主要障碍 这些是Stack Overflow的主要结果,但有些事实在2019年临近时我们不容忽视。在本文中,我们将介绍与移动应用程序开发相关的一些事实。 热门美食 与去年相比,今年的调查发现一些非常特殊的事情。 我们将介绍前7个外卖菜: 1] Swift:爱的增加 Swift,现代,快速和类型安全的编程语言Swift也在今年获得了更多的喜爱! Swift在最受欢迎的编程语言中排名较高。 与去年相比,斯威夫特的爱情从65%增长到69%。 用于原生Android开发的类似Swift的编程语言Kotlin的恋爱率从75%下降到72%,但Kotlin仍然主导着编程世界。 毫无疑问,在Apple的支持下,Swift的热爱将在不久的将来继续增长,并得到一群有才华的贡献者的支持。 2] Visual Studio Code已成为IDE的主导者 不管您是Web开发人员,移动开发人员还是DevOps工程师,Visual Studio Code都在整个领域占据着主导地位。 就本机移动应用程序开发而言,Xcode和Android Studio仍然是首选,但Visual Studio Code在所有地方都占主导地位。 毫无疑问,DevOps / […]

iOS上的实时远程配置

需要快速推出“远程配置”更改时该怎么办? 也许您所做的最后更改没有奏效,您想尽快撤消它们。 否则您的应用出现问题,您需要禁用整个功能。 调用fetchWithExpirationDuration:completionHandler:更为频繁(有效期较短)是一种方法,但Firebase不建议这样做。 这样您就有被节流的风险。 如果您可以根据需要使Remote Config缓存无效,而不必对较短的到期时间进行硬编码怎么办? 不必反复要求服务器进行更新,而是让服务器在发生更改时通知您。 Firebase Remote Config现在与Cloud Functions集成,因此可以在发布或回滚配置时触发执行。 这意味着您可以使用一个函数向应用程序发送静默推送通知,以使其知道配置已更改。 静默推送通知将不会显示给用户,同时仍会触发AppDelegate中的回调。 您甚至可以通过将选项content_available设置为true来使iOS在推送通知到达时在后台启动您的应用程序(或恢复它)。 一个陷阱:如果用户手动将其杀死,iOS不会在后台启动您的应用程序。 这一直持续到下一次重启(第一次解锁后)。 除此之外,您真是太棒了。 实作 该过程归结为: 将应用程序订阅Firebase Cloud Messaging主题 创建一个在远程配置更改时触发的云功能 在AppDelegate中处理无提示推送通知 在下次启动时使远程配置缓存无效 如何设置Firebase Cloud Messaging不在本文讨论范围之内,但是文档是一个不错的起点。 1.订阅主题 推送通知启动并运行后,我们需要为该应用订阅主题。 我们将专门为远程配置目的使用一种。 2.创建云功能 Cloud Function只是一个Node.js脚本,因此您的计算机上将需要Node.js。 在撰写本文时,Cloud Functions支持Node v6或Node v8,默认为v6。 拥有Node.js后,请先安装Firebase CLI。 npm install -g firebase-tools 然后使用CLI工具进行身份验证。 Firebase登录 现在,为函数创建一个文件夹,将其cd入其中并初始化Firebase项目。 Firebase初始化功能 这将启动CLI向导。 完成它,您就可以开始了。

保持您的Cartfile为最新

这篇文章将详细介绍如何在项目中添加构建阶段,当Cartfile在项目中不再是最新时,它将发出警告并通知您。 第一步是将新的“运行脚本”任务添加到项目的“ 构建阶段 ” 然后在构建脚本中添加以下脚本

我最喜欢的iOS开源库。

作为为初创公司构建移动应用程序的自由职业者,以及为构建我自己的应用程序的初创公司创始人,我构建和维护许多应用程序。 ( 如果您是Android开发人员, 请查看我 最喜欢的Android开放源代码库中的 文章) 多年来,我使用了许多不同的开源库来帮助我完成移动应用程序中的任务。 最近,随着Swift的频繁更改,您承受着确保所有库都是最新的并且与您正在运行的iOS版本兼容的压力。 这是一个最新的开源库列表,我很喜欢。 我在自己构建的所有(或几乎所有)移动应用程序中都使用了这些功能。 Alamofire如果您要构建通过Internet连接到API的移动应用程序,则必须使用Alamofire。 领域我将Realm用作iOS上的数据库,而不是使用Core Data。 这是一个很棒的移动数据库,对开发人员非常友好。 我是Realm MVP计划的一部分,因此,如果您对如何使用Realm有疑问,请与我联系:)。 RxSwift维护应用程序的状态具有挑战性。 编写样板代码很痛苦,而且容易出错。 RxSwift是一个了不起的库,我不知道该怎么办。 我使用它来将我的数据与用户的视图同步,并且是一种更好的管理数据流的方式。 ObjectMapper处理从API下载的JSON数据时,ObjectMapper是我使用过的(最好的)最好的库,用于从JSON数据创建对象以在代码中使用。 翠鸟如果您需要在应用程序中显示图像,请使用翠鸟。 易于使用,强大,快速。 Mac构建脱机优先的移动应用程序。 从用户中删除加载屏幕,并允许他们在脱机时执行任务。 我在启动新应用程序时会用到它,所以我可以立即使其与离线版本兼容,而不必稍后再添加。 IQKeyboardManager管理键盘的状态不难,但在iOS上却很困难。 只需安装IQKeyboardManager,即可为您完成所有工作。 我并不总是使用的库,但在正确的用例中考虑值得: KeychainAccess如果您需要在钥匙串中添加,删除,更新数据,则可以使用KeychainAccess。 DZNEmptyDataSet如果在代码中使用UITableViews,并且需要显示加载视图或无数据显示的视图,则这是适合您的库。 您有喜欢的图书馆吗? 与我分享,我很想听听。 查看有关如何为Cocoapods构建iOS库的高度评价的教程,以便您可以在多个项目中重复使用代码。 注册我为期5天的免费电子邮件课程,以使用我作为移动应用开发人员的工具以及对我内部Wiki的访问权。 另外,您还可以尽早获得有关如何提高您的Android和iOS开发技能的在线课程的信息。 最初于 levibostian.com 于2017年8月4日发布。