Tag: iOS应用开发

Swift并行编程:承诺

并发在我们的日常工作中越来越重要。 在我的上一篇文章(使用Swift进行并行编程:基础知识,操作)中,我们研究了Apple提供的工具。 这次,让我们看一下没有得到官方支持的东西。 总结一下: 并发是指同时进行工作的能力。 想象一下,任务长期存在。 需要一段时间,最后,我们得到了结果。 例如,这可能是下载文件。 结果将是图像。 同时,我们知道将图像设置为UIImageView。 那么我们如何实现呢? 最简单的版本是通过NSURLSession下载文件,然后将其关闭。 我们都知道,该怎么做。 所以这里没问题。 但是让我们稍微复杂一点。 我们没有该文件的链接,而是必须从后端请求该文件。 这样做将包含请求链接,将响应解析为我们期望的格式,请求图像然后进行设置。 对于像这样的简单用例,这可能会变得越来越复杂。 最后,我们处于回调地狱。 相反,我们可以创建一个委托并对此做出反应。 如果您有两个以上的请求,将很难维护。 调查操作,我们将这些任务拆分并以这种方式编写。 但是正如您所看到的,很难遵循用例的逻辑。 那么还有哪些其他选择呢? 承诺 有一个想法,考虑在将来创建包含值的变量。 它现在不需要立即包含其值,但是在某个时候,它将具有该值,然后我们就可以在其上执行代码。 这无非就是承诺-在某个时间点交付价值的保证。 对于Promise,您可以编写有关此想法的代码,即该变量有时会包含值或错误。 只要兑现了承诺,它就会被执行。 创作与创作 一个Promise包含一个带有2个回调的闭包。 您可以通过调用具有相应值的complement()来实现Promise,也可以通过错误拒绝它。 要创建Promise,只需包装要创建值的代码即可。 用法 承诺分为多个部分:承诺本身,成功代码(如果包含值)和错误代码。 只要没有代码,promise将不会执行任何代码,这将对其值做出响应。 要添加此代码,我们使用`.then()`。 这仍然不能决定执行时间。 它只是说,诺言如果愿意就可以开始。 由于经常需要创建代码链,因此我们不仅可以返回值,而且还可以返回承诺。 如果响应者链中有任何错误,执行流程将跳转到catch子句,而不继续执行其他then()闭包。 PromiseKit 有多个承诺库。 Google刚刚发布了自己的版本。 还有一个鲜为人知的竞争者,称为HoneyBee。 我将使用PromiseKit,因为它已经相当成熟并且已经开发了多年。 根据我的经验,他们的问题响应时间非常快,仅几个小时之内。 此外,PromiseKit提供了许多扩展,您可以在iOS中使用这些扩展来简化其使用过程。 由于Swift及其对Promises的解释,它确实包含一些特殊情况,但无论如何,让我们深入研究一下如何使用它。 安装 PromiseKit支持几乎所有的安装方式。 您可以通过Cocoapods做到这一点: 迦太基: SwiftPM: […]

跟踪您的iOS应用性能

这些是每个App Store分析师都应注意的5个最重要的指标 ,以跟踪其应用程序的运行情况。 如果我们检查上面的渠道,我们可以轻松地看到下降最多的地方。 这些是我们应该首先关注的领域,因为它们可以帮助我们最大程度地减少整体转化。 改进每个转换步骤本身就是一个另外的问题,但这是每个步骤的快速入门: 印象太少? 尝试通过Twitter,Facebook,Reddit等不同渠道进一步推广您的应用。 要增加页面浏览量,您的标题和第一张屏幕截图(请记住:视频效果更好!)至关重要。 单元下载非常难于改进,因为某些用户只是浏览而不打算首先下载。 提供良好的视觉效果和清晰的“为用户提供的内容”说明会有所帮助。 在下载阶段之后,一切都与应用程序的“粘性”有关。 将移动仪表板与数据框集成 既然我们已经建立了一套衡量标准并明确了衡量成功的目标,那么保持持久性并始终了解您的应用如何响应引入的更改就很重要。 输入数据框。 Databox与Apple的iTunes Connect门户提供了现成的集成,您可以在其中了解有关应用程序性能的所有信息,以进行评估。 初始模板具备上述所有指标以及其他一些基本要素,因此不需要您进行最终的分析工作即可快速启动并运行。 但是,必须指出的是,您可以根据需要自定义模板(不同的可视化效果,时间间隔,指标等),因为我们会提取官方iTunes Connect门户上的所有可用信息。 如果您想亲自体验一下它,这是一个很好的起点,可以帮助您入门并使用Databox。 不要忘记,在构建应用程序时,您不仅需要考虑iOS用户。 Android是一个巨大的平台,为了真正能够成长, 必须同时支持这两个平台。 不过不要汗,因为Databox也在那儿。 我们还提供了Google Play开发者控制台集成,可提供跟踪Android应用程序运行状况所需的一切。 这是Databox真正发挥作用的地方-每个指标只需滑动几下即可。 通过比较两个平台,您可以真正了解正在发生的事情以及需要重点关注的地方。 使用 Databox Designer ,您可以组合不同的指标来查看整个应用程序业务的状况。 我们始终以移动为先,但除了确保您的数据随身携带外,所有这些指标都可以轻松地通过大电视屏幕,Apple Watch甚至在您的Slack频道中传递到您的办公室。 如果您在一家公司工作并希望成为真正的数据驱动者,那么轻松访问关键指标是必要的起点。 如果您找到使数据访问民主化并共享相关业务见解的方法,则可以使组织中的每个人都有能力以数据为依据进行决策,从而更具成本效益。 下次计划启动移动应用程序时,请考虑一下您希望转化渠道的外观。 使用正确的方法,您可以尽早避免很多问题! 有了一组正确的指标和一个仅需清除数据即可采取行动的工具,您的下一个发行版将更好! 如果您有任何疑问或想与我们分享您的反馈,请随时使用下面的“评论”部分或向我们发送@DataboxHQ的推文。

CAGradient与UIImage渐变性能比较

CAGradient , CAGradient速度很慢,我们应该使用UIImage渐变代替它。 让我们来看看。 TL&DR:具有shouldRasterize = NO CAGradient与UIImage具有相同的性能,并且比具有shouldRasterize = YES更快。 在比较它们速度的第一个实验中,我创建了带有UITableView和每个UITableViewCell内部的渐变的示例项目。 每个单元格都在prepareForDisplay重绘其渐变,因此我们可以测量渲染时间。 共有三种类型的渐变: CAGradientLayer(红色) 带有shouldRasterize == YES (绿色) UIImage渐变(黑色)

祈祷应用启动-爆米花还是独角兽?

在2016年在App Store上启动移动应用程序的真实故事。 上周,我们在iOS App Store上发布了Pray:The Catholic Novena App,我向你保证我会分享发生的结果。 它是否随着iPhone携带的独角兽在朝天堂飞舞的彩虹中爆炸? 我们是否通过到达教皇的天主教社区发出了冲击波? 😏,不完全是。 按照承诺,我在这里告诉您发生了什么。 让我们首先回顾一下我们所做的发布工作。 通过Devin的联系(我的业务伙伴),我们能够在天主教网站上发表5篇文章,包括教堂流行,史诗皮尤,天主教答案,Devin自己的博客和Productive Catholic。 他还接受了3个天主教广播节目的采访(SonRise,Mater Dei和Jen Fulfiller)。 此外,德文(Devin)组成了一个由15人组成的启动团队,该团队将进行推文,转发和总体上也有助于向其关注者推广我们的广告系列。 这里的重点是,我们的发布活动针对这一细分市场非常针对性和实质性。 另一个关键点是,与付费广告相反,这全是宣传。 如果没有Devin过去10年的建立观众和人脉关系,这将是不可能的。 如果您正在开发应用程序,但还没有考虑过如何吸引受众,请记住这一点。 结果? 好的,让我们先了解一下数字。 我在这里结合了部分营销和产品渠道,以说明1)发布日营销的影响,以及2)我们在应用内实际“激活”了多少用户(即发布的最终结果)。 好消息是,我们的营销活动将成千上万的人带到了应用商店。 我们的应用徽标或应用页面在第一周显示了超过16k次。 这样一来,我们的应用程序下载量就超过了4k,但只有20%的人决定使用Facebook登录名来祈祷。 最终,我们以不到700人的祷告结束了本周的活动,至少在他们的第一只novena的第一天祷告。 我们所有人都被认为是该应用程序商店是一个神奇的金矿,每个应用程序都只是在不进行市场营销的情况下在全球范围内病毒式传播。 如您所见,我们有大量的免费宣传,但最终只有不到1k的激活用户。 它向您表明,如果没有这么多的目标受众,那么您基本上就没有成长的机会。 它还显示了跟踪分析并弄清用户来自何处以及是否离职的重要性。

2018年澳大利亚十大iPhone应用开发公司

移动应用开发公司| 澳大利亚的移动应用开发公司| iPhone App开发公司| iPhone App开发公司在澳大利亚| 澳大利亚的iOS应用开发公司| 顶级移动应用开发公司 iPhone应用程序的开发正在并且将以越来越快的速度发展。 因为当今对iPhone的需求正在增长。 由于存在巨大的安全隐患,增强的视觉效果和出色的性能。 与其他平台相比,iPhone / iOS应用程序的独特性令人难以置信,并且根据其粉丝群表现良好。 澳大利亚是世界上最美丽的国家,当然,越来越多的年轻人拥有最先进的技术和技术资源。 当前,每个企业和企业都需要数字临场感和智能设备支持的支持。 那就是开发与人类生活智能运行的移动应用程序。 由于iPhone是人们最喜欢的智能设备,因此开发人员已开始研究iPhone应用程序开发。 来到澳大利亚的应用程序开发公司之后,我们聚集了一组研究过的公司,这些公司被称为澳大利亚顶级iPhone应用程序开发公司。 让我们向他们介绍: Auxano全球服务 Auxano Global Services是全球多功能移动应用程序开发公司。 该公司专注于管理定制软件开发并在所有移动应用程序开发平台中实现复杂的项目要求。 该公司正在与各个行业打交道,并使其业务范围扩大到最终用户和客户。 Auxano Global Services拥有使用高级工具和平台在iOS平台上工作的专家。 该公司在iPhone应用程序开发方面的行之有效的产品组合对获得客户满意具有核心兴趣。 成立时间 :2011 员工人数 :10–50 时薪 :<$ 25 / hr 电子邮件: admin@auxanoglobalservices.com 联系人 :+ 1–209–348–9807 病态 Mobiddiction正在提供当前业务时代急需的移动解决方案。 该公司提供端到端应用程序开发服务,从创建独家设计到iPhone应用程序的上市后。 Mobiddiction的开发人员永远不会落后于时间表,并会随着iOS的更新和趋势的变化不断更新自己。 Mobiddiction的iOS开发人员具有丰富的技术知识。 此外,利用语音命令技术,利用iPhone开发电子商务应用程序,其目的是让世界各地的移动设备探索其兴趣。 成立时间 :2010 员工人数 :10–49 每小时费用 […]

2016年iOS最佳应用开发趋势

在iOS App开发方面,Apple一次又一次证明了它的确是世界领导者。 通过执行使客户保持热情的新任务,Apple似乎每次都破解了如何保持领先地位的代码。 Apple的最新发展很可能是技术爱好者和应用程序市场的新闻。 iOS很好地改变了我们联系和利用创新的方式。 苹果扩大的移动应用程序在我们的iPhone及其应用程序商店之间建立了牢固的纽带。 以下是2016年iOS应用程序开发的5大预期趋势 Apple Watch 2引起关注:最近在4月,Apple Watch 2推出了,并且在很大程度上是小工具类中的顶级可穿戴品牌。 随着Watch OS2的改进,小工具分类中的应用程序将被迫获得新的地位。 从现有的应用程序到进行扩展,Apple Watch在今年和未来的几年中都有令人难以置信的广泛改进。 更多地整合Swift编码: Swift编程方言似乎是框架和应用程序方言设计者的年度讨论。 它基于当前的编译器框架,使设计人员能够使用Xcode工具来编写代码。 苹果将​​Swift花费了一年,但仍使用Objective C,因为它可能在不久的将来才确定该编程方言何时可能成为创建Apple应用程序的必要工具。 关于当前时间,它仅用于很少的应用程序改进。 这也是今年可能会继续发生的模式。 更多免费应用程序:对于许多与iOS相关的开发人员来说,今年和不远的将来似乎都充满了收入。 因此,无论您要适应应用程序市场的要求如何,为iOS创建应用程序都是合理的。 到目前为止,报告给出了超过70%的免费申请数字,到今年年底之前,这一数字可能超过90。 基于高云的开发:工程师将能够从云支持中获得巨大的优势,因为他们将有能力减少应用程序的大小和可用空间。 此外,精明的同步同样会受到基于云的支持的支持。 这些应用程序最有可能在OS x和iOS中获得关注。 更加强调安全性:由于对隐私的需求激增,因此正在为通过通用应用程序进行购买的客户进行安全性查询。 设计者的职责是利用顶级安全性,以使客户相信组织的应用程序为目标。 同样,这适用于单个工程师可能制作的任何游戏应用程序,这些应用程序都可以促进并安全处理其用户的数据。 与我们联系并单击此链接

阻碍iOS移动应用开发的常见错误

iOS应用程序已经成为企业的强大营销工具,因为它们将服务范围扩展到了精英客户群。 但是,拥有出色的iOS应用程序对大多数企业而言都是一个挑战,因为只有经验丰富的开发人员才能信任他们。 iOS移动应用程序开发 这是一个复杂的旅程,需要大量的技能和专业知识。 同时,即使很小的错误也会对应用程序的质量和可用性产生深远的影响。 此外,在创建它们时必须遵守一些非常严格的规则。 以下是一些可能会完全破坏iPhone应用程序体验的常见错误: 不专注于UX 大多数移动应用程序开发人员 迷失于iOS编码的复杂性,并倾向于忘记UX。 提供出色的用户体验是成功开发应用程序的基础。 因此,这是开发人员不能忽视的一个方面。 要对界面,其加载速度和可用性给予足够的重视,以确保出色的用户体验。 包装太多功能 iOS开发专业人员常犯的另一个常见但代价昂贵的错误是为应用程序添加了太多功能。 试图以多余的功能来打动用户确实是一种诱惑。 但是冗余的应用会使应用变得复杂,并影响其速度和性能。 使社交媒体登录成为一种强迫 在大多数情况下,社交媒体登录已成为ios应用程序开发的一部分,但使此功能成为强制性功能可能是一个错误。 很多用户不习惯使用Facebook或Twitter登录,因此由于这个原因宁愿不下载该应用程序。 除社交媒体登录外,它还应包括其他选项,例如电子邮件或标准注册。 应用程序开发的过程并不仅限于创建它,还包括测试其性能和可用性。 不选择Beta测试是移动应用程序开发公司最严重的错误 在 印度 或国外都可以。 Beta测试吸引了一部分目标受众,而不仅仅是随机用户。 他们的反馈对于在应用程序中进行所需的改进/更新至关重要。 错误处理错误 错误是开发过程中不可或缺的一部分,但是如果不正确地处理这些错误,最糟糕的事情就会发生。 例如,当用户尝试在社交媒体平台上更新其密码时,该应用可能正在显示错误消息。 发送一条含糊不清的消息,指出某事有误,使错误变得更糟,使用户感到困惑。 不一致的不一致消息会激怒用户,甚至驱使他卸载应用程序。 应用程序开发过程(尤其是针对iOS应用程序)是一项技能和精确度的任务。 完美是无法实现的,因为开发人员必须在应用程序的生命周期中不断进行改进。 但是,意识到这些常见错误会有所帮助,因为开发人员可以避免这些错误并减少与之相关的复杂性。

企业持续交付YOOX NET-A-PORTER GROUP移动框架

在移动应用程序开发中,可靠的架构模式在更快地构建应用程序中起着重要作用。 因此,为了确保多个应用程序中现有代码的质量和可重复使用性,公司开始构建可重复使用的软件开发工具包(通常称为SDK)来开发移动应用程序。 对于iOS,Apple已经创建了无数SDK,供应用程序开发人员构建应用程序,但公司仍需要构建自己的自定义iOS SDK,以在其应用程序中共享产品特定的通用代码。 为了加快YOOX NET-A-PORTER GROUP(YNAP)的iOS应用开发速度,我们构建了通用的iOS库,这些库可以在NET-A-PORTER,MR PORTER,YOOX,THE OUTNET和30+以上的多个iOS应用之间共享我们为其经营数字商店的品牌。 主要的iOS SDK之一是我们的客户端应用程序与后端API之间的一层,在本文中,我们将其称为“ iOS-SDK”。 什么是iOS-SDK YNAP在App Store上提供了许多iOS应用程序以及为我们的同事服务的许多其他企业应用程序。 我们希望为同事们反映客户的经验,同时减少重复编码。 为此,我们决定构建一个通用的iOS-SDK,以方便在我们的客户和企业应用程序之间共享。 这也使我们可以通过在方法和返回类型方面定义一组行为来简化构建过程。 然后,使用SDK的人只需为每个应用实现适配器。 这意味着iOS-SDK是iOS库的集合,可使用CocoaPods或Carthage轻松分发。 我们仅用Swift编写了该库,并且它具有一个内置的示例应用程序,可让我们测试特定于客户端的功能。 为什么我们需要iOS-SDK的持续集成和持续交付 由于iOS-SDK代码可能会影响多个客户端应用程序,因此必须确保iOS-SDK的代码质量满足所有受支持的应用程序的要求。 为此,定期运行可靠的自动化测试非常重要,以确保一个客户端的代码更改不会对其他客户端产生负面影响。 为此,我们需要持续集成(CI)来获取对iOS-SDK代码库所做的任何更改的即时反馈,并需要持续交付(CD)来相应地更新客户端应用程序。 通过将CI / CD添加到iOS-SDK,我们可以获得有关Swift代码更新的早期反馈,并定期在客户端应用中测试新功能。 为SDK实施CI / CD实践与对普通iOS应用同样重要。 我们开始通过构建自动化,自定义脚本和使用Travis CI功能在iOS-SDK库上实现CI / CD。 我们的iOS-SDK CI / CD火箭现已准备好发射。 iOS-SDK部署自动化 我们的iOS-SDK是一个Swift库,我们使用CocoaPods或Carthage分发它。 手动部署iOS-SDK库是一个耗时,重复(而且很无聊!)的过程。 以前,每当我们要发布新版本的iOS-SDK时,开发人员都需要经历手动过程。 我们需要克服这一点,并开始寻找可以执行以下操作的自动发布过程: 当源代码在Master分支中合并后,会自动构建该库的新版本,运行所有自动化测试并自动使用Podfile或Cartfile提到的版本创建标签 使用Github Changelog.md发行说明自动制作该库的Github版本 将库的新版本推送到YNAP的专用Cocoapods存储库,以便我们可以从专用存储库下载规范 在Slack频道上自动宣布该库的新版本 我们通过结合使用自定义脚本,Fastlane工具和Travis CI来实现这一目标。 在此过程中,几乎没有引入任何更改来帮助自动部署iOS-SDK。 iOS开发人员必须在每个.podspec文件中维护Changelog.md文件以获取发行说明和凹凸版本,以便部署脚本将读取此信息以实现发行自动化。 我们可以从.podspec文件中读取版本,并使用Fastlane在Github上创建一个自动标记。 $ […]

迅速

我现在要来写一系列关于iOS程式开发的文章。不是为了教学,而是为了把我懂的知识整理起来,系统化。里面的概念可能跟别人讲的不一样,不保证我写的是对的。 我会用英文来表示技术性词汇。 首先,我是用Swift来写app的。Swift是一种编程语言(程式语言)。编程语言是一种写给编译器(编译器)看的语言,而不是电脑硬体直接看得懂的。硬体看得懂的语言叫做二进制代码(二进位码),而编译器的作用就是把编程语言编译成二进制。 Binary就是长这个样子— —只有1跟0。很容易的,要人类用这种方法去写程序,有点太麻烦了,所以才会有人类更容易理解的编程语言出现。这些编程语言大多都是都市套用而Swift在编程语言当中又是属于高阶的,也就是一种高级编程语言。简单地说就是越像英文就可以阶入,而Swift确实是非常接近口语英语了。 Swift社区特意写了一个API设计指南,去推广“清晰度之上”这个美学观念。什么意思呢?就是说在用Swift写代码的时候,最好写得清楚一点,让其他读代码的人可以更容易理解你在写什么。 Swift的基本语法有以下几个。 分配(分配) 将单等号(=)后面的东西分配(分配)给单等号前面的变数/常数。用白话来说的话,就是把一个东西放到容器里的过程。某种说, a = 1 就是把「1」这个值放到「a」这个容器里面的意思。 呼叫(呼叫) 要求执行某个功能(函式)的意思。函式简单来说就是一个动作,某种说: print(a) // 把 a 的內容印出來。 当中, print是函式的名字,而加上括号就代表你要机器在这里去执行这个函式。这,光是写print ,该函式是不会被呼叫的,还要加括号才行。最后,括号里面的东西就是你要给函式的东西。 有没有加括号,差异真的很大。某些说以下这两句所代表的意思完全不同: // 呼叫 randomInt 函式並將其輸出值指派給 a。 a = randomInt() // 將 randomInt 函式本身指派給 a。 a = randomInt 然而,对有参数(参数)的功能来说,加括号不代表一定就是调用,还要丢参数进去才算。有时说以下语句都是将combine这个功能分配给a的意思: // 省略參數列表。 a = combine // 把參數名都寫出來。 a = combine(a:b:) 参数又是什么呢?首先,功能就像是一台小机器,被呼叫的时候它就会去执行它里面的程序代码,一行一行。最后,它会输出一个值,或者说return(传回)一个值。而参数,就是一个功能在执行时需要输入的一组值。例如说,如果我们把combine这个功能的功能设计成把两个输入值加起来再输出,那这两个输入值就是它的参数。以下就是呼叫combine的句型: // 輸入 1 […]

Swift中的可测试网络层—第1部分

在编写程序时,根据编码最佳实践,代码应具有可读性,可维护性和可测试性 。 “无法测试的代码存在缺陷。” 作为iOS移动应用程序开发人员 ,我们经常编写许多涉及UI,网络,持久性和其他业务逻辑的代码。 在本文中,我们将共享我们的网络层实现,该实现处理API / web-service交互,以帮助编写有关网络层逻辑的测试。 在编写测试之前,我们需要熟悉如何将网络层代码与UI相关代码和其他业务逻辑分离。 没有这种去耦,就不可能孤立地测试网络层。 网络层包括: 准备请求 (URL,方法类型,标题,参数) API调用 (NSURLSession) 解析响应 (将数据转换为模型对象(或返回错误消息) 网络层测试使我们能够确保API请求已正确形成,并且API响应解析已按预期完成,从而模拟了Web服务器。 根据我们的测试方案,我们将需要进一步分离网络层。 为此,我们将创建一个APIHandler,该APIHandler用于发出请求并解析响应。 遵循APIHandler ,请参阅以下有关LoginAPI的示例请求/响应处理程序。 Path() -不用担心Path()。login 。 Path()只是一种根据DEV / TEST / RELEASE环境返回特定端点的方法。 更多详细信息可以在这里找到。 所有API请求都将包含url,httpMethod,参数和标头 。 set —由于上述示例API调用是一种post方法,因此我们需要准备httpBody,这是通过RequestHandler协议扩展来完成的。 BaseRequest对于所有常见的请求配置(例如标头,timeoutInterval等),我们可以创建一个符合Request Protocol的 BaseRequest类, 如下所示。 设置好通用配置后,每个API可能会有要在API请求中发送的自定义参数。 对于需要身份验证令牌的任何API,我们可以使用AuthRequest对象而不是BaseRequest对象,以便API请求具有auth-token。 现在,我们已根据需要准备了URLRequest 。 准备好API请求后,我们可以调用API(我们将在一分钟内逐步完成)。 放置API调用并且服务器响应后,我们将收到需要根据我们的要求进行解析的原始响应。 通常,我们将原始响应解析为模型对象。 为此,我们可以使用泛型来处理ResponseHandler中的响应 。 上面的代码处理来自服务器的success , known-error和unknown-error api响应 为了调用API,我们编写了一个通用类APILoader ,该类使用可达性库处理网络错误,URLSession和Internet连接错误,如下所示。 我们可以将LoginAPI对象传递给通用APILoader […]