Tag: 开发

我见过的iOS开发最佳实践在GrubHub上

鉴于GRUBHUB是我工作过的第一家技术公司,所以我分享的一些实践可能会受到限制。 在加入GRUBHUB之前,我曾在企业公司工作,这些公司通常在业务和技术实践之间存在分歧。 他们不一定彼此一致。 通常,企业拥有更大的发言权,因为它们控制着公司的财务方面。 因此,我喜欢在技术驱动的公司工作。 这也是我第一次体验真正的敏捷开发过程。 以下几节是我作为开发人员的经验。 团队架构 为了使该过程正常进行,每个人都必须在同一页面上。 在我们的案例中,利益相关者包括开发人员,产品所有者,分析代表和质量检查工程师。 有时,设计师需要参与。 在GRUBHUB,我们非常重视产品的质量。 因此,我们选择以高质量实现较少的功能。 产品管理 在GRUBHUB,我们与产品所有者紧密合作。 产品所有者负责管理其票务的优先级,我们将其作为一个团队进行梳理。 修饰过程每周进行一次,持续30分钟,偶尔会召开临时会议来修饰需要紧急完成的其他票证。 在会议期间,开发人员可以确定需求中的任何差距,并在组合中添加任何单元测试和功能测试,因为开发人员还负责实施自动化测试(单元测试和功能测试)。 我们的质量检查团队会进行更多的探索手动测试,以检查整个应用程序的运行状况。 他们有更全面的看法。 这就是质量检查团队参与修饰过程的原因。 它们有助于确保票证包含需要由开发人员自动化的用例。 产品负责人负责提供足够的详细信息,包括验收标准,设计模型,API请求,流程和测试数据。 在计划过程中,开发团队的负责人将根据产品所有者的优先积压工作,获取冲刺门票,并进行相应分配。 在这一点上,任何经过修饰且可用于计划的票证都将具有开发人员要处理的所有详细信息。 由于我们的冲刺周期大约为两周,因此我们所有人都在确保票证上有足够的信息以在一周的短时间内完成开发。 发展管理 除非包含单元测试/功能测试并通过代码更改,否则不会创建任何请求请求。 为了使开发团队能够做到这一点,我们在工作开始之前进行了设计审查,编码风格指南,持续集成系统以及代码审查流程。 开发人员在其各自的分支机构工作,并负责在合并到主分支机构之前从其分支机构创建临时构建,以完成所有验证。 验证包括与设计人员进行的任何视觉质量检查测试以及与负责任的产品所有者进行的功能测试。 开发人员需要完成的其他其他任务包括在登台环境中进行实验。 需要注意的一个重要关键是,我们有很多时间专注于开发而不会受到任何干扰。 所有会议均安排在中午12点之前和下午4点之后。 因此,这段时间之间的任何时间都致力于开发。 发布管理 我们的发布周期为每两周一次,因此每天都会举行发布会议,以对任何新缺陷进行分类并检查发布状态。 与会人员包括质量检查小组和开发人员主管。 在这段时间里,他们还会优先处理需要解决的所有关键错误。 任何超出范围(包括产品所有者期望的其他更改)的提议,都会将它们放入待办事项列表中,以优先考虑将来的冲刺。 我们的目标是最终将发布周期缩短至一周,随着我们完善上述流程,我们将能够实现这一目标并更频繁地发布到应用商店。 我们的流程是可预测的,为开发人员完成工作以及按时按计划交付提供了一定的稳定性。 然后去哪儿? 您是否在团队中经历过类似的最佳实践? 您是否发现其他有价值的东西可以提供质量。 最初发表于《如何在Swift中做到》。

更新Movesense设备固件-一个简单的iOS解决方案

因此,您有一个带有旧固件的Movesense设备(也称为“ Movesense传感器”,尽管我将使用“ Movesense设备”或下面的“设备”),并且您想更新固件以获取一些新功能(例如改进的蓝牙数据)串流(1.8.0中引入),但您尚未成功在笔记本电脑上安装开发工具来自己创建固件映像。 该怎么办? 嗯,一种非常简单的解决方案是使用手机在Movesense设备上刷新固件。 iPhone和Android设备均可使用。 下面,我将为iPhone用户介绍该过程,因为我对iPhone更加熟悉,并且目前没有可用的Android设备。 使用Android时,刷新过程似乎绝对容易,并且稍有不同(例如,无需使用Xcode自行编译Movesense Example iOS应用)。 请注意,由于您需要使用Xcode编译Movesense Example iOS应用并将其转移到iPhone,因此本指南仍需要您具备一些开发技能。 另请注意,由于Suunto计划发布新版本的iPhone Example应用程序,因此在不久的将来,iPhone用户的过程也将变得更加轻松,该版本将在App Store上可供您安装。 获取工具 您的手机上需要两个应用程序:一个将Movesense设备置于固件更新模式(我将在下面使用Movesense Example应用程序),另一个将新固件传输到Movesense设备。 您只需在手机上安装这些应用程序一次,然后就可以一次又一次地使用它们来更新各种Movesense设备上的固件。 这两个应用程序中最简单的应用程序是美国国家半导体的nRF Toolbox 。 这用于将新固件包传输到Movesense设备。 从App Store安装该应用程序,一切顺利。 您可能还可以使用nRF Connect ,尽管我尚未测试过。 另一个应用程序需要您做更多的工作。 为了能够在iPhone上使用Movesense Example应用程序,您将需要从Movesense移动存储库下载源代码并进行编译以在iPhone上运行。 在本文中,我将不包括完成此操作的完整步骤,因为该过程很漫长,并且在线上有很多文章可以指导您完成iOS应用的编译和安装。 例如,您可以检查Movesense移动库的README文件上的过程描述,该文件非常紧凑。 如前所述,需要一些iOS开发经验(并且您需要Mac才能运行Xcode)。 获取固件 然后,当然您需要安装固件映像。 幸运的是,Movesense设备存储库在此目录中(在目录Movesense-device-lib / samples / bin / release中)为您提供了一堆现成的固件映像。 现成的在Movesense设备上使用的是“ hello_world”,在此目录中可以作为“ Movesense-hello_world.zip ”文件使用。 下载该文件并通过电子邮件发送给您。 若要将此zip文件获取到您的手机,则需要执行此电子邮件发送步骤。 我们稍后会再讲。 请注意,您还可以从可用的源代码存储库中编译固件。 我还没有自己做,因为所需工具的安装脚本存在一些问题。 如果最终从源代码编译固件,最终将得到一个moveense_dfu.zip文件,您需要将该文件通过电子邮件发送给您。 闪烁过程 […]

iOS的持续集成-艰难的道路

我们的iOS团队注意到,我们的大部分时间都浪费在了构建和分发项目上。 构建和分发的任务非常适合于自动化,因此我们决定对此做一些事情。 这就是故事。 我们的更大项目之一是着重于旅行的社交媒体应用,其中新功能和错误修复正在不断实施。 它的代码库总共包含约350.000行代码: 55%是斯威夫特 其中40%是Objective-C 剩下的5%使用C,C ++,Ruby或Shell脚本 在具有8 GB RAM的Macbook Pro Retina 2016上,该应用程序的构建和分发时间平均约为30分钟,而在较旧的Mac Mini上,则约为40分钟。 如果它不在我们用于开发的机器上运行,或者如果我们想在Macbook上煮一个煎蛋,那将是可以接受的。 关于持续集成和持续交付(CI / CD),存在许多选择。 这些是我们考虑过的: 1.詹金斯 优点: 我们的后端和质量检查团队已经在使用它 文档内容丰富 很多社区的支持 经过“实战测试” 缺点: 用户界面相当……令人困惑 有很多术语 它对开发人员不友好 某些问题很难调试 2.特拉维斯 优点: 易于使用 免费提供开源软件 缺点: 仅支持Github(在我们使用Bitbucket时不适合使用入门工具) 3.比特币: 优点: 面向移动 有据可查 易于配置和使用 缺点: 有价位 还包括Nevercode,CircleCI,Github Actions和Bitbucket工作流。 最后,我们已经选择了Jenkins,因为我们已经让开发人员非常熟悉它。 至于测试设备,事实证明,旧的Mac Mini和Macbook Air非常适合(后来用于生产)。

RxSwift#2 —可观察的과主题(+中继)알아보기

可观的下载, 可观察的主题 ,RxCocoa 中继的继电器 。 룬룬다룬룬알아 可观察的 Observable이지속적으로이있것을发射이라고다。 1.可观察的生命周期 next 통해1,2,3을可观察 뒤뒤종료된可观察 1,2에러에러종료된 error 를종료된可观察 이전다뤘던정정해보자 next :최신(다음)값을이벤트 error :可观察到的错误 complete :성공적으로이벤트스시퀀이벤트。 可观察的이더상배출하지않음

iOS:Swift中的滚动头

我正在做一个项目,我必须为此开发一个可滚动浏览的圆形聊天对象,并使其圆头,可以水平滚动,并且当用户在视图内部/外部轻按时可以展开/折叠。 首先,我们需要创建一个我最终以某种方式将其命名为ProfileHeadsView的视图。 这将是我们集合视图的容器视图,并将由用户添加为视图的子视图。 因此,此容器视图以及随后的收集视图将自动采用目标视图的宽度。 ProfileHeadsView是UIView的子类,并且具有相同名称的Xib文件。 Xib的视图是ProfileHeadsView的类型。 该视图需要一种方法来从包中加载Xib文件,并将实例返回给调用函数。 这是通过以下方法实现的。 class func loadViewFromXibWithFrame(_ frame:CGRect)-> ProfileHeadsView { 让viewFromXib = Bundle.main.loadNibNamed(“ ProfileHeadsView”,所有者:无,选项:无)? ProfileHeadsView viewFromXib.clipsToBounds = true viewFromXib.frame =框架 返回viewFromXib } 接下来,我们为设备旋转设置了一个观察器。 这使我们能够以纵向和横向模式处理流程。 我设置了旋转观察器,并在awakeFromNib中设置了我们的collectionView(这是所有插座都将连接的点。 在查看上面介绍的代码片段之前,我们必须了解UICollectionViewFlowLayout的疯狂功能 。 当我们需要自定义与集合视图的行为有关的任何事情时,这是首选。 为了获得所需的行为,我们利用了单元格的z索引。 Z索引允许垂直堆叠收集视图单元格。 为此,我们重写了集合视图的流程布局的layoutAttributesForElements(in 🙂方法。 在此方法内部,我们打算 计算电池堆中心 获取元素的布局属性以进行修改 根据堆叠因子和堆叠中心计算这些单元的新位置 显式地将第一个单元格放在堆栈顶部(除非您想将其他单元格放在顶部) 返回修改后的属性 下面是自从看到最后一个代码以来我们已讨论的所有代码的片段。 var stackCenter:CGPoint = CGPoint(x:0,y:0) var stackFactor = CGFloat(0.1)// MIN:0 …. MAX:1 @IBOutlet弱var […]

iOS开发参考-模糊与活力

我们经常需要在图像视图上模糊或在任何动态背景上模糊视图。 有两种方法可以完成此任务。 1.进行具有所需模糊效果的模糊视图,并添加任何标签。 2.具有模糊视图和鲜艳度视图。 然后在这些内容之上添加一些内容,例如文本。 添加模糊视图– 让blurEffect = UIBlurEffect(style:.regular)让blurEffectView = UIVisualEffectView(effect:blurEffect)blurredEffectView.frame = view.boundsview.addSubview(blurredEffectView) 添加标签以模糊视图 让tLabel:UILabel = UILabel()tLabel.text =“早上好” tLabel.font = UIFont(名称:“ Futura”,大小:30)tLabel.textColor = UIColor.white.withAlphaComponent(0.6)tLabel.frame = bluredEffectView。 contentView.boundsblurredEffectView.contentView.addSubview(tlabel) 添加活力和标签 让vibrancyEffect = UIVibrancyEffect(blurEffect:blurEffect)让vibrancyView = UIVisualEffectView(effect:vibrancyEffect)vibrancyView.frame = bluredEffectView.contentView.boundsvibrancyView.contentView.addSubview(tLabel)tLabel.frame = vibrancyView.contentView.contentView.contentView.contentView.contentView.contentView.contentView。 view.addSubview(blurredEffectView) 参考文献 RayWanderlich的UIVisualEffectView教程 使用UIVisualEffectView 关于模糊和鲜艳度的StackOverflow问题 OmniDev网站的模糊和鲜艳度指南 用Swift编写有关模糊和活力的文章

为模型创建一个抽象层

您是否在iOS开发中见过模型的不同层? 我从来没有。 例如,当使用Core Data时,我们通常直接在视图中操作NSManagedObject 。 那不理想。 因此,我一次研究了如何为模型创建抽象层。 为什么要使用其他型号? 我正在使用Core Data将数据存储在我们的应用程序中记住。 要创建核心数据模型,我需要在NSManagedObject构造函数中注入NSManagedObjectContext对象。 问题是我不想在应用程序中到处传递上下文对象。 我希望将其隔离在模型层中。 我想在业务层中操作简单的 POSO (普通的旧Swift对象)。 为此,我需要一种将NSManagedObject对象转换为业务对象,反之亦然的方法。 另外,我的数据库对象不应该知道我的业务对象。 这样,我可以轻松地用另一个数据库提供程序替换Core Data,而不会影响其余的代码库。 这个想法的灵感来自清洁架构。 业务和模型层 在我们的应用程序中,请记住,我只有一个表来存储用户最后一次执行某项操作的时间。 很简单 我在业务层中创建了一个Event类。 这是我将在视图中操作的对象。 对于模型层,我创建了一个EventManagedObject类,该类继承自NSManagedObject 。 从一种模式到另一种 为了双向转换对象,我创建了一个由Event类实现的ObjectConvertible协议。 该identifier用于获取相应的NSManagedObject (如果存在)。 然后,我创建了ManagedObjectConvertible协议。 因为我不想在实现该协议的每个NSManagedObject子类中重写相同的代码,所以我写了一个协议扩展来完成大部分工作。 这就是魔术发生的地方。 该协议由EventManagedObject类实现。 由于协议扩展,我只剩下两种方法可以实现。 这些是将业务对象的数据传输到数据库对象的数据,反之亦然的方法。 CRUD操作 现在,无需直接操作NSManagedObject对象,即可在Event对象上执行操作非常容易。 商店 在本文开头,我说过我不想在整个代码中都传递NSManagedObjectContext对象。 为了隔离上下文,我创建了一个EventStore类,该类在NSManagedObjectContext对象上保留了一个引用。 然后,可以在视图控制器或视图模型中使用商店。 业务层使用商店对业务对象执行操作。 它不知道对象的存储位置,它可能在Core Data,Realm甚至文件中。 这是我的抽象层。 缺点 尽管此方法在处理模型对象时提供了一定的便利,但它也有一些缺点。 最大的问题是我无法使用Core Data的内置延迟加载系统或NSFetchedResultsController 。 如果要使用它,则必须创建自己的分页系统。 此解决方案中也未实现处理关系 […]

2016年最新的应用程序开发工具– Netforce信息技术–中

2016年最新的应用开发工具 如果您认为自己有技巧,并且随时了解最新消息,那么您可能正在阅读TechCrunch,Wired,Engadget和Forbes等门户网站。 您还必须密切注意每月出现的最新技术。 智能手机正在变得越来越大,越来越快,越来越薄,越来越轻。 随着我们日复一日的发展,我们也有大量经验丰富的应用程序开发人员,他们正在尝试以更快的方式交付应用程序。 对于应用程序开发 ,下一个至关重要的事情是它应该是跨平台的,这有助于从不同的位置和设备类型获取更多的用户。 最好的部分是,它下面的一些工具可以使您的用户满意。 Xamarian: 微软拥有的软件Xamarian在应用开发行业中非常重要。 拥有C#代码库,用户可以轻松地为Android,iOS和Windows开发应用程序。 Xamarian中最好的功能是它允许在多个平台上共享。 它还具有云服务,允许用户测试各种设备。 定价:每月25美元-158美元 Xojo: Xojo是另一个出色的平台,专注于Mac OS X,Microsoft Windows,x86 Linux,iOS以及Web和Raspberry Pi。 该平台还提供了clous服务,可轻松,安全且免费地进行应用程序维护和网络应用程序托管。 定价:99美元-每年1,999美元 科尼: Kony是另一个出色的移动应用程序开发平台,可帮助构建用于移动设备,平板电脑,台式机和信息亭的应用程序。 它是最流行的应用程序之一,可帮助为消费者和企业创建应用程序。 定价:15美元-每月29美元的用户 雅普: Yapp允许为他们的活动,聚会或团体创建个性化的移动应用。 Yapp是创建和立即发布移动应用程序事件的最简单,最经济的方式。 通过Yapp吸引并享受您的联系。 定价:399美元-1599美元/应用 BiznessApps: BiznessApp被认为是最经济实惠,最简单的平台,它允许小型企业创建移动应用程序。 它是一个应用程序平台,允许在iPhone,iPad,Android和HTML5上创建应用程序。 它允许小型企业甚至不知道编程语言就可以在线创建,编辑和管理移动应用程序和移动网站。 定价:$ 29-$ 59 /月 现在,是什么阻碍了您创建自己的移动应用程序? 了解了这些简单且用户友好的平台后,就没有理由开发自己的应用程序了。 有几种工具可以轻松地帮助您的企业进入Appstore。您所需要的只是口袋里的钱。 最初来自:https://netforcesales.com/netforce/blog/latest-app-development-tools-in-2016/

自行车之路:我在App Store中的第一个应用程序

大约七个月后,Cycles取得了令人难以置信的成功: 在顶级生产力应用程序中,周期已达到第3位。 循环已被许多站点(例如Mashable和 AppAdvice) 使用和审查 。 周期已从App Store下载32,000多次,并且仍在增长。 是的,没错,我每天都在不断地研究自行车。 虽然我确实认为该应用程序具有巨大的初始启动能力,但始终存在改进的空间。 得出我最后的建议: 您的应用程序永远不会感到完成,那就可以了! 您为此花费了很多时间和精力,因为您对此充满热情。 我想花时间说谢谢您阅读本文,希望我以一种或多种方式为您提供帮助。 我很乐于回馈社区,因此,如果您有任何疑问,疑虑,反馈,或者只是想说声嘿,请随时通过社交媒体(下面链接)与我联系。 我也喜欢Twitch上的流媒体! 我已经开始在Cycles和其他副项目上流式传输更新进度。 请随时出来打个招呼或询问任何开发问题。 看我流!

使用BrightFutures,Alamofire和Operations排队上传多张图像

在开发我们的iOS应用程序“ Lines”时,我遇到的最大问题之一是创建可靠的图像上传队列。 该应用程序支持离线使用,因此,如果用户保存图像,则照片的本地标识符存储在CoreData中。 连接设备后,将立即获取并上传所有图像。 为了创建有效的上传队列,我必须使用以下框架: Alamofire用于http网络。 为了避免在获取多个图像时出现内存泄漏,我使用了OperationQueue来限制要处理的并发图像的数量。 而且BrightFutures将保证整个过程的顺利进行。