Tag: iOS应用开发

连接点:BDD,TDD,用例,体系结构和模块化设计

这使我们回到上一集中提出的模块化体系结构: 在下一个情节中,我们将开始实现上述要求,因此,请立即订阅我们的YouTube频道,并每周获取免费的新情节 。 最初在 www.essentialdeveloper.com上 发布 。 我们一直在帮助敬业的开发人员从低薪工作转变为高级职位-有时只需几周! 为此,我们会不断进行和分享免费的市场研究,以了解如何提高同理心,正直和经济学的技巧。 如果您想从事自己的职业,请立即免费获取我们的最新研究成果。 如果您喜欢本文,请访问我们的网站https://essentialdeveloper.com,并获得更多类似的深度定制内容。 在以下位置关注我们:YouTube•Twitter•Facebook•GitHub

使用GraphQL为移动客户端创建统一接口

与Trulia的其他工程团队一样,iOS团队也了解与我们的整体架构相关的挑战。 我们处理了性能问题,发布延迟以及iOS功能与其他平台上的功能之间普遍缺乏对等的问题。 我们经常受到上游决策的负面影响,被迫提出变通办法和权宜之计,只会加重我们面临的许多挑战。 Trulia从单块架构过渡到微服务架构的决定为移动团队提供了一个机会,以永久解决我们的许多挑战,并通过实施GraphQL来偿还我们的一些技术债务。 技术债务:移动API 与整体交互所产生的问题可以追溯到我们的移动应用程序的创建。 这包括我们面临的最大挑战-我们在移动客户端上所需的数据通常分散在多种服务中,仅通过复杂的关系进行连接。 这种低效的配置产生了多个请求,返回了我们不需要的数据,并浪费了资源。 我们通过创建外观REST接口解决了该问题。 外墙处理了处理整体架构的各个部分以及将来自各种来源的数据序列化为一致结构的所有复杂问题,移动客户端可以轻松使用它们。 虽然这简化了我们与整体的交互,但也带来了其他挑战。 移动应用程序需要访问的任何新API也将需要由Facade实现,从而导致更长的总体开发时间。 上游API接口的更改也需要应用于外观,这需要双重维护。 负责各种API和外观的团队的路线图通常不一致,导致Web应用程序和移动应用程序之间存在差异 在考虑转向微服务架构时,我们想了解如何在满足每个客户需求的同时保留外观的优点。 解决方案:GraphQL 我们决定使用基于GraphQL的API创建一个统一的接口,该接口仅以一致的格式向各个客户端提供必要的数据。 单一界面的使用鼓励所有利益相关者参与并为总体架构和领域模型的设计做出贡献,从而确保满足每个团队的需求。 这种合作的例子发生在Trulia Neighborhoods的模式设计的早期。 我们意识到,各个客户端对图像压缩类型的偏好有所不同-iOS支持HEIF压缩,Android首选WebP,而移动Web则首选png。 GraphQL允许我们添加参数,以便每个客户端可以传递其首选的压缩格式以获取远程图像资源。 此外,在GraphQL下进行统一提供了将通常在每个客户端上实现的业务逻辑转移到GraphQL层中的解析器的机会。 当业务规则指示如何显示数据更改时,这消除了客户更新代码的要求。 积分 事实证明,使用Apollo提供的SDK和工具来创建和处理对GraphQL服务器的请求,实施GraphQL是一个简单的过程。 该工具集使我们能够使用GraphQL语法编写查询,并自动生成在每个唯一客户端中执行查询所必需的代码。 虽然我们通过单一查询语言进行统一,但iOS查询是在Swift中生成的,Android查询是在Java / Kotlin中生成的,而Web查询是在TypeScript中生成的。 安卓系统 public final class LocationQuery implements Query { private final LocationQuery.Variables variables; public LocationQuery(@Nonnull Input id) { … } @Override public LocationQuery.Data wrapData(LocationQuery.Data data) { […]

迁移Marvel的应用程序以查看代码!

如今,视图代码正成为iOS社区内部的新炒作。 这并不是什么新鲜事物,从许多方面来看,这种方法都是对iOS起源的回归,在iOS中,视图是用代码创建的。 如果您还记得Xcode的第一个版本没有接口构建器。 例如故事板诞生得更晚。 在与几个在应用程序中采用视图代码的开发人员交谈后,我对这个主题非常感兴趣,并声称有很多好处。 好处 更好的团队合作,避免使用故事板| xibs冲突。 更好的构建时间。 有了明确的建议,代码往往变得更加模块化,可重用。 更容易测试。 维护和发展代码库更为容易。 今天,我将迁移在一系列帖子中创建的Marvel应用程序( *您可以在此处查看该系列的第一篇文章)以查看代码。 与大家分享我在此过程中获得的经验,观点和教训。 您可以在此处使用查看代码检查项目存储库。 该方法 .. 迁移查看代码不是必须“全部”完成的事情,您可以首先开始迁移代码的一小部分。 我已经开始了迁移细胞的过程。 他们已经生活在故事板的分开的xib中。 因此,让我们进行比较。 使用XIB 第二 完成此步骤后,一切都应正常工作,我将在此处布置另一个控制器,以便我们检查差异。 不使用ViewCode 使用ViewCode 大家可以注意到,控制器的大小几乎相同,但是第二个版本的责任要比第一个少得多。 许多人被转移到更合适的地方。 更不用说了,不再有IBOutlet或IBActions,强制展开等。测试此新ViewController也是容易得多,因为我们不必从情节提要中将其引入。 所以.. 我非常喜欢这种经历。 我一定会探索视图代码并将其带入未来的项目中。 将来,我将发表另一篇有关测试+查看代码的文章,以及我们如何重构旧奇迹的应用程序测试以与我们的新设计一起使用。 也就是说,这是我查看代码的第一种方法。 还有更多的工作要做。 现在,我想听听您关于该主题的经历,痛点,其他设计,模式等的信息。 分享您的想法,作为回应。 我真的认为这可能是个很棒的讨论! 与往常一样,任何想法,疑问或反馈都值得欢迎。 =) 附:如果您喜欢这篇文章,请在Twitter上分享,或在中级推荐,或两者都=)。 这确实有助于我吸引更多人。 非常感谢 ..

获取,正则表达式和数据! 搜索公交专用道并获取公交车的位置–我的第一个Swift应用

您可以在这里找到我以前的文章的链接: 常量,服务管理器和API身份验证。 我的第一个Swift App medium.com 在上一篇文章中,我创建了一个名为“服务管理器”的类,并在其上添加了一些功能以使用API​​验证应用程序。 今天,我将在此处添加其他功能,以搜索公交专用道并获取所选车道的公交位置。 我将从那里添加一个名为makeHttpGetRequest的函数开始,这次回调将返回JSON和错误字符串。 * JSON类型是SwiftyJSON容器的一部分。 现在,使用searchForBus函数。 在测试此代码之前,只需要对一个问题进行排序。 在巴西葡萄牙语中,这些单词可以具有特殊字符,例如:Pompéia,Petrônio,Carrão; 由于搜索不支持这种字符,也不支持Itaim Bibi等组成的名称,因此,我将创建一个基本的regex函数来替换这些单词。 在此正则表达式上,我将传递用户键入的文本,如果出现这些特殊字符,则将替换它们,并且,该请求不支持空格,该方法在此方法中被+符号替换,因此,如果用户搜索Itaim Bibi ,则该请求看起来像Itaim + Bibi 。 此功能将提供给搜索项的最后一种处理是将单词返回为小写,因此最后它看起来像是itaim + bibi 。 最终请求网址应如下所示: http://api.olhovivo.sptrans.com.br/v0/Linha/Buscar?termosBusca=itaim+bibi 现在,是时候在AppDelegate上测试此代码了。 首先,我要对应用程序进行身份验证,然后调用该函数来搜索公交车,并传递“ Itaim Bibi”一词。 这是此请求结果中的一个对象。 大! 现在我有了代表公交专用道的对象。 现在,我将在服务管理器上创建一个函数,该函数将获取该通道上所有总线的位置,我将使用整数“ CodigoLinha”在请求返回时表示的通道代码。 我将接收到的整数转换为字符串,以使其成为我在此函数上创建的请求URL的一部分。 让我们在AppDelegate上对其进行测试。 这段代码看起来一点也不好 ,但是至少我能够测试所有请求并看到一切正常,得到了预期的结果,现在我可以删除这些代码行了。 这是结果。 再次有关于API的文档。 Áreade Desenvolvedores SPTrans – GTFS 作为需要信息的API的HTTP协议的使用,可以作为一种必要的信息。www.sptrans.com.br 不幸的是,在此特定结果上,文档没有说明这些值是什么。 让我们尝试猜测: “ hr”应该是搜索时间或上次更新时间。 “ vs”应该是公交车位置的数组 “ […]

突破reduce()

关于如何在需要时reduce() method earlier if you want退出reduce() method earlier if you want reduce()是Swift标准库中非常有用的方法。 它的工作方式类似于for in loop(实际上是一个in),但是它专门用于从集合中的元素中计算单个值。 仅有一个微妙的区别-我们不能这样做: 电脑和智能手机速度很快,但我们不希望它们浪费时间并且表现得像那只狗。 在我们的案例中,我们真正需要的是3次迭代… 在reduce方法的重载(如原始声明中那样)中,我们可以看到我们在重载中实现的nextPartialResult可以引发异常,所以为什么不利用它–在传递条件时引发异常,如此处理它不会逃避我们扩展的范围并返回结果。 为了实现它,我们需要一个符合Error类型,它将一个Result对象传递给catch闭包: 为了完成它,让我们有一个完整的实现,它使我们不仅可以基于部分结果,还可以基于集合的当前元素来做出“破坏它或做出它”的决定(尽管如果有的话)像element == someThing您应该在reduce之前使用prefix(while:) 。 这里是: 它还有另一个变体,如果您希望在给定条件为真的情况下减少收款,则应使用它: 它给出了不同的结果,因此,当您不想包括以上条件的元素时可以使用它(因为until变体才是这种情况): 就是这样了! 希望您喜欢我的第二篇文章。 随时尝试一下,您可以在这里找到示例游乐场。

iOS上的应用安装归因简介

推动移动应用增长的一种常见方法是进行广告活动,以将潜在客户引向Google Play / App Store。 为了衡量此类广告系列的成功与否,我们需要一种方法来找出哪些广告导致了哪些安装。 引荐跟踪就是将每次安装归因于特定的广告,广告系列和广告网络。 Android支持向Play商店URL添加特殊参数,以唯一标识转换的来源。 大多数分析平台都支持自动跟踪这些参数,因此非常简单。 在iOS上,事情变得更加复杂。 App Store将引荐来源网址数据隔离在App Analytics中,因此,获取我们可以实际访问的归因数据的唯一方法是使用第三方归因服务。 这些服务可以跨平台和广告网络交叉引用数据,从而可以跟踪安装之前的情况,并将引荐来源数据转发到我们选择的分析平台。 一些归因服务(例如AppsFlyer或Adjust)与最受欢迎的广告网络(例如Facebook或Google Ads)建立了合作关系。 在这种情况下,他们将直接从网络获取归因数据。 否则,我们将需要一种不同的方法: 这是一个两步过程,涉及到潜在客户点击广告时读取一些数据,然后在应用首次运行时将其与其他数据进行比较。 首先,归因服务采用广告的目标URL(App Store上的应用页面,或延迟的深层链接),并创建另一个包含引用数据的URL。我们必须在广告中使用此URL而不是原始URL。 当销售线索点击广告时,归因服务将读取数据,然后执行透明重定向到广告的原始目标。 用户首次安装并打开该应用程序后,服务SDK会“致电回家”,以使用户与之前记录的数据匹配。 匹配的数据可以发送回应用程序,也可以自动转发到支持的分析平台。 归因服务依赖多种技术进行匹配; 其中最主要的是IDFA匹配和指纹识别。 区别在于用于执行比较的身份数据的类型。 IDFA(或广告商IDentifier)是Apple提供的唯一标识符。 它是特定于设备的,并允许广告客户在应用程序和会话之间跟踪用户。 任何应用程序都可以读取它,从而有效地取代了iOS世界中的网络Cookie。 归因服务会将IDFA包含在特制的URL中(我们要跟踪的其他数据位,如广告系列和媒体),并在潜在客户点击广告时将其读回。 该应用程序首次运行后,其SDK将获取设备的IDFA,并将其发送回以进行比较。 这种方法涉及当潜在客户点击广告时收集一些设备详细信息,例如IP地址,屏幕尺寸和iOS版本。 当应用运行时,服务的SDK将重新捕获这些详细信息,并将其发送回以检查它们是否匹配。 这是一种概率方法,因此永远不会100%准确。 另外,它的准确性会迅速下降,直到用户首次运行该应用程序为止。 为了解决这个问题,归因服务定义了一个时间限制来跟踪转化(通常为24小时)。 具体细节取决于每个归因服务提供商,但主要内容仍然相同: 注册提供商 使用您的广告网络,广告系列详细信息和分析平台进行配置 注册应用程序捆绑包ID和其他详细信息 安装提供商的SDK 在AppDelegate中初始化并配置它 到目前为止,我们已经了解了引荐跟踪的含义,如何使用第三方归因服务以及它们如何工作的基础知识。 总而言之,如果广告网络与归因服务提供商建立了合作伙伴关系,那么您已经准备就绪。 如果不是,则需要使用特殊网址设置广告以对身份数据进行三角测量。 而且,如果提供商与您的分析平台集成,则可以自动转发引荐数据。 否则,这取决于您。 喜欢这篇文章吗? 关注我们,敬请期待。

选择合适的iPhone应用开发公司

iPhone和iPad的发布彻底改变了人们对手机应用程序和经商的认识。 我们的iPhone应用程序开发公司自2011年以来一直从事该行业,为个人和企业提供了150多种定制的iPhone和iPad应用程序。 我们会不断更新我们最新版本的iOS平台和开发工具的技能,从而使我们能够提供最先进的iPhone和iPad应用程序。 为什么使用一种用于iPhone App开发的技术 随着便携式电话的工作安排的发展,对通用应用程序的“单技术利用”正在逐步扩大,许多工作框架正在迅速发展,还有更多的工作尚待推进。 在这种快速的创新中,客户越来越多地利用通用应用程序,导致应用程序软件工程师工作的阶段数不断增加。 关于工作框架,有许多可移植的应用程序可用于特定的工作框架。 便携式应用程序具有特定的障碍,因为在少数应用程序中,特定于特定的工作系统,因此该应用程序不会支持其他工作框架。 iOS Mobile Apps Development Company ,仅支持I-电话或其他基于Apple的小工具iPad,i touch等。 专为iPhone手机定制的便携式组件具有仅支持iOS操作系统的特定元素,这些通用的应用程序设计师为选择的iOS施加了强加的商业模式排序思路。 Apple在其应用程序商店上有售,您可以从那里购买或免费下载支持iOS的应用程序。 长期以来,One Technologies是业务领域最佳的推动力组织之一,长期以来一直聘请值得信赖的应用工程师来构建您的通用应用程序,因此,我们精通的团队可以根据客户的要求在各个阶段进行拍摄。 我们保证以合理且最小的努力,通过有趣且创新的想法管理传达高质量的工作。

iPhone应用程序的6种设计趋势

随着iPhone设备使用者的兴起,我们看到许多企业家进入了应用市场。 但是,许多人没有注意iPhone应用程序开发过程的设计阶段,从而导致了设计不良的应用程序的开发。 考虑到用户界面设计的重要性,设计不良的应用程序自然会导致业务失败。 因此,作为企业家,无论您要创建哪种应用程序,都必须确保其用户界面设计看起来不错。 确保出色的UI设计的一种方法是灌输在很大程度上证明对其他移动应用程序成功的设计属性。 因此,让我们注意最热门的设计趋势,您一定应该指示iPhone应用程序开发人员将其包括在您的应用程序中。 以下是一些值得注意的设计趋势: 好玩 娱乐性正逐渐成为许多应用程序中非常受欢迎的特征。 趣味性不仅使用户交互更加人性化,而且更加有趣。 通过使用动画,声音和有趣的元素,可以在您的应用程序中包括这种质量的一些方法。 纹理作为应用程序背景 纹理越来越成为许多应用程序的流行背景选择。 木质纹理最受欢迎。 但是必须注意,对于应用程序的文本和图标,只能选择与所选纹理形成鲜明对比的颜色。 文字介面 仅显示文本信息的应用程序是另一个有趣的趋势,这种趋势最近已经出现。 但是,重要的是通过使文本变大并使界面高度简约来使其易于阅读。 对于纯基于信息的应用程序(例如天气应用程序)使用此类界面是理想的选择。 大胆和原色的使用 深蓝色和灰色应用程序的时代已经一去不复返了。 使用粗体和原色(例如红色和黄色)可有效激发用户的积极参与。 阴影的使用 阴影可以有效地用于在菜单和按钮中创建深度外观,呈现引人注目的整体外观。 Thin Sans Serif字体 稀薄的san​​s serif字体最近成为移动应用程序世界中的一种主要趋势字体。 字体呈现出优雅,整洁的外观,是当今应用程序的非常理想的特性。 移动应用程序的设计界面可以使您的应用程序成功或失败。 确保移动应用程序的用户界面中包含一些最时尚的设计属性,可以在很大程度上确保其成功。 幸运的是,著名的iPhone应用程序开发公司可以轻松地将上述设计趋势整合到您的iPhone应用程序中。

迅速反应本机-第3周:变得舒适

上周我提到了Storybook,不得不说我很高兴遇到了这个工具。 我发现使用屏幕或组件的功能非常好,我不必从应用程序的主屏幕转到控制该屏幕的任何屏幕即可测试该屏幕。 现在我有了这个设置,我很高兴,但是这花了我太多时间才能开始运行。 其他迅速的开发人员会告诉我这是游乐场的用途。 没错,我只是从来没有上过游乐场,所以我的想法是让我的屏幕和控件在所有不同的状态下显示正在运行的目录。 现在,尽管此工具很棒,但我仍然遇到问题,需要花费更长的时间,我认为他们应该这样做。 我仍然无法正确显示iPhoneX布局。 获得一个复选框以呈现我想要的方式需要我创建自己的组件,因此需要更多时间。 使导航正常工作也很痛苦。 我首先尝试使用推荐的Navigator框架,只是转到WIX提供的React Native Navigation。 那也花了我一段时间。 所以现在我必须在3个不同的地方查看文档(React native,React Native Element和React Native Navigation)。 是的,我可以在浏览器中查看所有内容。 但这绝对不是Xcode的良好体验,因为Xcode的经验是从Apple查看集成在我的代码或浏览器中的Apple文档中的99%。 而且,这三个地方的文档具有不同程度的完整性和准确性。 因此,您了解情况了,我希望事情进展得更快。 我知道这对我来说是一项新技术,因此花了一些时间来学习它。 但是鉴于我已经知道nodejs堆栈,所以我不禁要告诉我,对于没有JavaScript经验的人来说,这将是艰难的攀登。 上一集: Swift to React Native —第2周:将此绑定 这周是我感到进步的第一周。 感觉很棒,但是那是…… medium.com 您要创建一个移动应用程序吗? 您是否正在组建团队来首次构建移动应用程序,并为所有复杂性感到不知所措? 然后随时与我们联系,我可以为您提供帮助。 查看我的网站以获取更多信息。 在React Native中管理样式 React Native是一个框架,它允许熟悉JavaScript的全栈开发人员编写功能丰富的… medium.com React Native Navigation –适用于iOS和Android的真正本机导航 反应本机导航–适用于iOS和Android的真正本机导航 React Native Navigation –适用于iOS和Androidwix.github.io的真正本机导航 shanalikhan /代码设置同步 code-settings-sync […]

使用WebKit在iOS上进行JavaScript操作

作为iOS开发人员,有时我们希望将Web内容包含在iOS应用程序中。 我们可能希望从与本机应用程序版本配对的网站上加载内容,或者我们可能希望让用户打开链接而不必打开其他浏览器。 在iOS 8之前,我们必须使用UIWebView,它笨拙,内存泄漏且难以调试。 但是,在iOS 8之后,苹果弃用了针对WKWebView的UIWebView,并引入了现代WebKit API。 新框架极大地提高了将Web内容添加到iOS应用程序的性能和灵活性,从而为开发人员提供了更多控制权和更多功能。 它还极大地改善了与JavaScript的本地通信。 在本文中,我将向您展示如何将脚本注入网页并接收数据以执行诸如更改网页背景或直接从JavaScript调用本机函数之类的示例。 WKWebView在WWDC 2014上首次发布,是改变游戏规则的工具,用于在iOS应用中呈现Web内容。 它利用核心动画和硬件加速功能,使网页可以60fps的速度滚动。 苹果开发人员淘汰了旧的JavaScript引擎,并用Nitro取代了它,后者是Safari的基础。 它还包含与Safari中相同的内置手势,可用于前后缩放和导航。 创建起来也超级容易! 让我们从一个简单的WKWebView外观的简单示例开始。 开始所需要做的就是创建WKWebView对象,添加约束并传入URLRequest来加载网页: 请注意,您只能加载默认情况下安全的URL(即,仅HTTPS连接)。 您可以将“ App Transport Security设置”键添加到Info.plist中,以出于开发目的而覆盖此设置。 然后,在“应用程序传输安全设置”下,添加项“允许任意加载”并将其值设置为“是”: 这将绕过HTTPS要求,因此您可以使用localhost或HTTP连接进行测试。 但是请记住,这仅用于开发而非生产。 您应始终遵守Apple的安全标准,以通过行业标准协议安全地加载Web内容。 因此,我们仅使用了几行代码就将Web内容加载到了我们的应用程序中。 如果我们想修改应用程序中的网页怎么办? 我们可以像以前一样实例化WKWebView对象,但是这次传入类型为WKWebViewConfiguration的新配置对象: 使用配置初始化WKWebView 在这里,初始化Web视图时可以修改很多属性。 例如,您可以控制页面是否以增量方式呈现,播放之前哪些媒体类型需要触摸手势,HTML5视频是否可以画中画显示或如何与加载的脚本进行通信。 WKWebViewConfiguration具有一个名为userContentController的属性,该属性使您可以传递WKUserContentController对象。 该对象使用addUserScript(_ :)注入JavaScript,并通过add(_:name :)侦听消息处理程序。 如果您是网络开发人员,则类似于Chrome扩展程序之类的浏览器插件对加载的网络内容的处理方式。 WKUserScript对象添加到userContentController后,允许开发人员使用JavaScript并将其注入到网页中。 这是添加脚本以从上方更改Google网页背景颜色的简单示例: 创建用户脚本以更改背景色 init方法采用三个参数: source :传入JavaScript的字符串表示形式作为源。 injectionTime :指定JavaScript是在文档开始还是在文档末尾加载。 如果传入WKUserInjectionTime.atDocumentStart,则脚本将在创建文档元素之后但在解析任何文档之前立即运行。 如果传入WKUserInjectionTime.atDocumentEnd,则脚本将在文档解析完成之后但在加载任何子资源(例如图像)之前运行。 这与触发DOMContentLoaded事件时相对应。 forMainFrameOnly :指定脚本是在所有框架中运行还是仅在主框架中运行。 对于您的源代码,您可以简单地传递一个字符串,或者,如果脚本更复杂,则可以从Xcode的本地文件中加载它。 为此,请将您的JavaScript文件添加到Xcode,获取文件的路径,然后使用文件内容初始化字符串: 从本地文件加载JavaScript 这是在启动时向网络视图添加基本用户脚本的简要概述。 […]