Tag: 移动应用开发

设计模式—创新模式— Swift中的工厂模式

作为一名崭露头角的计算机科学家,您无疑已经听说过课堂和学习途径中的设计模式。 设计模式是蓝图,概述了创建可重用的面向对象代码,解决常见软件问题的最佳实践。 为了避免给您带来长期的历史教训,我将描述设计模式的起源可以追溯到1970年代,但是随着1994年发布并由Erich Gamma撰写的《设计模式:可重用的面向对象软件的元素》的发布而获得了广泛的接受。 ,理查德·赫尔姆(Richard Helm),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗利斯赛德(John Vlissides),统称为四人帮 (GoF)。 由于对23种经典软件设计模式进行了描述,因此该书大获成功。 设计模式对于帮助您将复杂的系统分解为通常适合于GoF描述的一种设计模式的组件非常有用。 因为我知道作为开发人员,我们喜欢学习,有时需要快速参考才能更好地完成工作,所以我要花时间写一系列文章,这是第一篇,以展示如何使用每种GoF设计模式在Swift中。 通常将设计模式分为几类相关的类别:创建模式,结构模式和行为模式。 在本文的其余部分,我们将重点介绍“ 创造”模式,并介绍我们的第一个模式:“ 工厂”模式。 创作模式:工厂模式 创建模式都是关于消除创建对象所涉及的复杂性的方法。 工厂模式是一种封装创建对象的实现细节的方法,该对象遵循通用的基类或接口。 工厂模式允许接收创建对象的客户端通过公共接口使用对象返回,而无需关心实际创建的具体对象的类型。 工厂模式将创建对象的实现细节与允许用户通用使用该对象的公共接口分开。 让我们考虑一个使这个想法更具体的例子。 想象一下,您经营一家猎头公司,其所有线索均来自各个工作委员会。 对于每个工作委员会,您都收集联系人详细信息并针对潜在的“目标”进行简历。 我的意思是求职者。 获得联系信息后,您可以对其进行分类,并向每个联系人发送样板电子邮件,告知潜在客户与他们的潜在匹配。 您想自动化该过程,因为您每周都要连接数百个潜在客户。 从本质上讲,您只是“以美元计价”,因此您可以处理的潜在客户越多,将潜在客户放置到头寸中的机会就越大,获得报酬的可能性就越大。 我们可以并且将使用工厂模式来解决此问题,以处理电子邮件模板的创建。 我将使用Swift Playground展示一种可以使用工厂模式实现目标的方式。 您可以在这里找到我用于此帖子的操场文件。 为简化起见,我们假设每个联系人将具有个人详细信息以及他们所寻找的角色类型。 首先,我们将创建用于将定制的电子邮件发送给潜在客户的接口(或更确切地说是协议),其中包含有关他们正在寻找的工作类型的信息。 而已! 我们的工厂示例已完成。 现在,我们可以根据他们寻求的工作类型向他们的联系人发送自定义的电子邮件。 只要我们的需求发生变化,我们就可以扩展我们的示例,并且只要我们的界面不变,就不必更改客户端使用的代码。 这意味着我们可以添加新的作业和求职者对象,以将自定义的电子邮件发送给新的联系人类型,而无需更改使用JobContactProtocol的客户端。 我们还可以更改用于创建模板的逻辑,因为这仅包含实现更改。 包起来 工厂模式使我们可以通过允许客户仅依靠公共接口与对象进行交互来隐藏创建对象的实现细节。 这使我们可以消除创建具有类似行为需求的对象所涉及的不必要的复杂性。 工厂模式还促进了分离和抽象,这两者都导致了易于维护的可重用代码。 您可以在此处找到本文的游乐场文件。 简要地说,我还写了一篇文章,说明为什么创建本地应用程序可能是大多数移动开发工作中最好的方法。 阅读并参与讨论! 您的混合应用程序将杀死您 如果您的公司仅开发混合应用程序,那么最终您将蒙受损失。 这只是时间问题。 混合手机… medium.com 如前所述,我将完成一系列有关设计模式的文章。 您可以在下面的文章链接中阅读有关装饰器模式的下一篇文章。 Swift中的设计模式—结构模式—装饰器模式 […]

React Native中的网络状态

对于我正在开发的应用程序,我需要知道用户何时可以上网。 我立即阅读了文档,并很快找到了解决方案。 React Native的API具有NetInfo ,可为您提供网络状态。 NetInfo.isConnected.fetch()。then((isConnected)=> { console.log(’网络状态:’+(isConnected?’online’:’offline’)); }); 但是,这不适用于iOS(始终返回离线状态)。 经过一些研究,我找到了解决此错误的方法。 NetInfo.isConnected.addEventListener(’change’,(isConnected)=> { console.log(’网络状态:’+(isConnected?’online’:’offline’)); }) 这可以解决问题,但是我在控制台上收到了弃用警告,因此我决定将侦听器更改为“ connectionChange” NetInfo.isConnected.addEventListener(’connectionChange’,(isConnected)=> { console.log(’网络状态:’+(isConnected?’online’:’offline’)); }) 这清除了警告,我得到了正确的结果。 React Native弃用addEventListener(更新于2018年10月2日) 相反,我们将拥有appstate 。 学分: – 来自Noun Project的projecthayat的网络图标

Onet-我很高兴成为获胜团队的一员

当然,我已经(或者说是我所参与的团队)提供了许多出色的产品,但是这一产品与众不同。 更具挑战性。 我们想要创建一些特别的东西,真正满足波兰内容消费者的需求,并为更多应用程序的发展做准备。 成功的衡量标准 发布后,我问自己一个问题:我们成功了吗? 当然,该应用程序很棒。 我们学到了很多东西,尤其是关于Swift的知识,以及Xcode对它的支持程度。 而且还涉及到我们自己,以及与如此多的团队合作可能带来的挑战。 我们开始了公司的伟大事业。 我们表现​​出了极大的合作精神,专业知识以及开发人员相互学习和快速学习的谦虚态度。 是的,我们成功了。 我们为自己感到骄傲。 经过适当的庆祝和回顾性会议之后,我们为未来得出了一些重要的结论: 重构。 学习。 实验。 要谦虚。 团队合作是一切。 要求您的组织帮助您删除阻碍项目进度的事情。 几个月后,发生了一件我没想到的事情:Onet应用程序被提名为INMA全球移动最佳使用奖。 竞争似乎非常稳固。 我们赢了! 我不需要奖项就可以使我的工作有意义,但是,嘿,它们是赞赏的很好的象征,尤其是在媒体行业。 不仅对开发人员而言,对所有相关团队:产品,市场营销,社论,UX,业务,甚至还有更多。 不要提及我们执行董事会提供的支持。 团队合作是一切。 有什么更好的? 2017年INMA全球大奖并不是授予Onet应用的首个享有盛誉的奖项。 2017年3月,它在波兰最大的移动和新技术会议期间举行的“移动趋势奖”竞赛中被评为最佳移动应用程序。 2017年4月,Grupa Onet-RAS Polska获得了广告代理商协会颁发的创新媒体类奖项。 — RAS新闻稿,2017年5月24日 如果你说波兰语 如果您确实会说波兰语,或者只是想看看这个应用程序真的很好,请帮助自己。 如果您更喜欢Android手机,则可以从iOS的AppStore或Google Play下载它。 来吧,试试。 并在Twitter上关注我。 我的推文可以是🇵🇱或🇬🇧。

保护您在Bitrise上的秘密

保持您的秘密env vars对于所有永恒的 事物 以及属于某些应用程序的文件受到保护,以防止从 Bitrise 下载 。 从现在开始,属于您的应用程序的秘密环境变量不会默认显示,只会显示它们的列表和键(它们的名称),直到您将其设置为其他值为止。 我们还为您应用的“秘密”和“代码签名”标签添加了一项新功能:名为“受保护”的切换按钮。 这样,您就可以使您的秘密无法泄露,并且代码签名证书也无法下载。 您应将此功能用于要保密的秘密。 😎这可能是您不希望其他团队成员看到的密码,即使他们有权访问“秘密”选项卡也是如此。 或者,CTO可以设置一个API密钥并锁定它,以便开发人员无法看到或编辑它,但是构建仍可以使用它。 您可以在“秘密”标签下将新的秘密添加到您的应用中。 保存它们并刷新页面后,将出现星号而不是值。 (直到现在,这些值始终始终在此处打印。)这些值仅在单击眼睛时才会发送到前端,如果将其设置为保护状态,则仅会发送到构建计算机。 秘密密钥(及其值)不能更改,只能删除。 我们添加了一个交叉的眼睛图标,它将显示秘密并显示其价值。 下拉菜单(…)下提供了另一个新功能:您可以Make it protected 。 如果将环境变量设置为受保护,则将无法再看到该值,实际上,没有人可以再看到它,删除该值是唯一的选择。 如果单击该按钮,则会出现一个弹出窗口,警告您该操作是不可逆的。 请注意,您必须保存页面才能使环境变量受保护。 受保护的环境变量用锁指示。 “代码签名”选项卡上提供了类似的选项。 对于此处上传的所有文件,您会在下拉菜单(…)下找到“ Make protected ”: 然后出现警告,从您单击按钮的那一刻起这是不可逆的,不需要保存。 使文件受保护意味着您不能下载它,而只能删除它。 和 快乐保密! 🤐 最初发布在 Bitrise博客上 。

快速提醒Swift中的SOLID原则

如果您开始从屋顶盖房子会怎样? 墙壁易碎,倾斜角度,基础不稳定。 这样的房子寿命不长。 该应用程序具有相同的趋势,并取决于开发人员的资格。 在我们的领域中,砖是一种编程原理,对系统有不同的影响。 我认为SOLID是基本级别。 本文的目的是在Swift中提供快速指南或知识更新。 让我们用好与坏的情况来解释该缩写: 1. 单一责任 -每个对象应仅对一种责任作出响应。 换句话说,概念模块/类/结构必须响应一个动作。 单一责任-流程不畅 单一责任-流动性好 在这里,我们仅处理OrderType数据,并且可以在没有任何其他条件的情况下对其进行更改。 2. 开闭式 -实体必须开放以进行扩展,但必须封闭以进行修改。 打开关闭 –   流量不好 在我职业生涯的初期,我将更改内部功能,并且可能在数据库处理以及将现有数据相互之间导出时遇到问题。 开闭式-流动性好 更好的方法是在OrderStorage下创建子类并重写方法或准备协议,然后在OrderStorage实现正确的数据处理。 换句话说,我们无需内部修改即可扩展存储功能。 3. Liskov替换 -任何对象都可以由其子对象替换,而无需更改应用程序设置。 简单地说,如果我们将基类更改为其子应用程序,则该子应用程序将保持稳定,并且新问题不会对其他部分产生影响。 Liskov替代-流动不畅 在那里,我们违反了LS原理。 我们通过添加以下条件来更改保存功能: order.products必须具有计数验证。 基本RealmOrderStorage不会这样。 有两种解决方案: 向基类添加新参数(也更改协议) 更改NewOrderStorage类的保存接口。 Liskov替代-流动性好 在这里,我们不违反基类接口的契约,并且可以在任何地方使用新的子类代替它。 Swift的一项强大功能是面向协议的程序设计,我们可以在不进行子类化的情况下进行工作,但可以通过合同支持设计。 4. 接口隔离 -许多专用接口比一个更好。 它们既大又通用。 它有助于在使用的项目中划分功能的不同部分,并且不会在那里实现不必要的方法。 转到我们的示例: 接口隔离-流量不良 在这里,我们有几种与产品相关的其他方法。 那些没有折扣或尺寸设置的产品该怎么办? 我们可以陷入陷阱。 接口隔离-良好的流动 在这里,我们可以使用基本接口ProductType进行操作,并根据需要设计其他实例。 5. 依赖倒置 […]

iOS 10的应用程序组和iMessage扩展– Tack Mobile –中

Messages应用程序的可能性几乎是无穷无尽的,我很高兴看到iOS 10的发布在接下来的几个月中提出了其他独立或捆绑的创造性应用程序。对于我一直在从事的项目在过去的6-7个月中,我们希望通过Messages扩展程序使事情变得简单。 没有新功能,只有现有应用程序的简单功能扩展到了Messages,可以与当前没有该应用程序的人共享。 对于没有订阅功能的付费应用程序,新用户的招聘对于赚钱至关重要,这是创建Messages扩展的主要目标。 本质上,我们希望为用户提供一种更轻松的共享方式,从而通过消息向非用户推广。 第一步是创建一种在现有包含应用程序和Messages应用程序之间共享数据的方法。 本文底部已链接了有关创建App组以通过NSUserDefaults和Core Data共享数据的出色教程,我在创建Messages应用程序时引用了这些教程。 这篇文章是关于使用应用程序组通过NSFileManager共享iMessage扩展的数据。 我们已经在使用NSFileManager将要共享的数据写入磁盘。 本质上,我们遵循将数据托管在服务器上的通用模式,该服务器可根据需要提取并在本地写入/删除/读取。 由于我们已经使用NSFileManager写入文档目录,因此我使用NSFileManager与我们的消息应用程序共享数据。 就我的目的而言,Core Data可能会过大。 第一步是创建iMessage扩展。 从现有容器应用程序中,选择文件->新建->目标。 这将弹出此窗口: 选择“ iMessage扩展”,然后选择一个名称。 您可以稍后更改显示名称,并且显示名称可以与您的容器应用程序相同,这是我们选择执行的操作,因为扩展名旨在驱动用户购买容器应用程序。 要开始共享数据,您需要在“目标”功能中打开应用程序组。 这应将com.apple.security.application-groups添加到YourProject.entitlements文件,并在project.pbxproj文件中启用com.apple.ApplicationGroups.iOS。 需要明确的是,您并没有更改这些文件,当您在“目标”->“功能”中打开“应用程序组”时,它应该只显示在源代码控件中。 在新启用的“应用程序组”部分中,单击加号图标,Xcode将弹出一个视图,显示“添加新容器”。 这必须是唯一的,因此我遵循推荐的group.com.YourCompanyName.YourProjectName.container命名约定。 除不创建新容器外,还请按照消息目标中的这些相同步骤进行操作,只需选择刚刚创建的容器即可。 它是两个应用程序之间的共享容器。 确保两个目标都选中了您创建的容器,并且选中了“步骤:”下面的三个标记。 现在,您已经在两个目标中都启用了应用组,就可以开始编码了。 我做的第一件事是创建用于访问共享容器的辅助方法,因为它是我用于创建共享目录,写入数据和删除数据的路径。 您将要使用您在“项目设置”中“应用程序组”下创建的确切字符串。 我将其设置为常量,并使用NSFileManager方法containerURLForSecurityApplicationGroupIdentifier:创建了一个返回容器路径的方法,并传入了App Group常量。 在消息扩展之前,我们使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)将数据写入NSDocumentDirectory; 然后选择返回的第一个路径。 我更新了所有我们使用共享应用程序组容器的地方。 基本上,在使用此标准NSDocumentDirectory的任何地方,都需要对其进行更新以使用容器路径。 主要是在这里NSFileManager写入数据,获取数据和删除数据。 我们还有一个可用的磁盘空间检查,在这里我们检查attributeOfFileSystemForPath:并检查NSFileSystemFreeSize对象以查看剩余的磁盘空间,并且我还更新了此路径以检查容器路径而不是NSDocumentDirectory路径。 仔细检查文件管理器的工作并确保全面更新非常重要,因为您可以想象如果更新以将数据写入新容器但仍从NSDocumentDirectory等删除数据时可能会遇到的错误。 ,在初始化下载管理器时,我检查了共享路径中的目录是否存在,如果不存在,则使用createDirectoryAtPath:withIntermediateDirectories:attributes:error创建了该目录,然后再次传递了共享容器路径。 您需要执行此步骤,因为NSDocumentDirectory已经存在,但是需要创建容器目录。 既然您已使容器应用程序从共享应用程序组中写入,读取和删除数据,那么您也应该可以在iMessage扩展中自由使用它了! 当然,您的扩展程序需要数据的用途可能千差万别,但对我来说,仅对viewWillAppear进行一次检查/更新以查看文件管理器中的数据就足够了。 自从我在Swift中编写扩展名以来,我就使用了FileManager.default,并且再次使用了相同的containerURLForSecurityApplicationGroupIdentifier方法,该方法在Swift中被命名为forSecurityApplicationGroupIdentifier。 同样,您需要在“应用程序组”部分中传递确切的字符串。 然后,我过滤了结果以仅查找带有m4a文件扩展名的项目,并将这些文件保存在用于填充CollectionView的array属性中。 根据您要写入文件管理器的数据类型,这可能会变得很复杂。 但是对于我的使用,仅从写入共享应用程序组的文件和文件名中,我就能获得编写简单但有意义的扩展名所需的信息。 要考虑的一个潜在问题是您的用户在现有版本上更新到新的应用程序版本。 该应用程序的较旧版本将把数据写入NSDocumentDirectory,并且在尝试在新的应用程序组容器中查找数据时将失败。 为了获得无缝的体验,并且不让用户再次下载他们已经拥有的项目,您需要将数据从NSDocumentDirectory迁移到新的应用程序组容器。 在初始化下载管理器时,我在m4a文件格式的documents目录中添加了对项目的检查,并将其复制到共享应用程序组中,然后从NSDocumentDirectory中删除。 链接到有关使用应用程序组将NSUserDefaults共享到扩展的教程,该扩展对我有所帮助:http://www.atomicbird.com/blog/sharing-with-app-extensions

为IOS实现本机模块:React-Native

React native是一个功能强大的工具,因为它可以让我们使用本地代码(iOS中为Swift / Obj-C,Android中为Java / Kotlin)并桥接它们以访问我们的react-native JavaScript文件中的本地方法。 当您构建反应本机尚不支持的内容,或者您​​不想使用JavaScript重写某些旧的本机代码时,此功能真的非常有用。 我遇到过这样一种情况,我想为WebView清除所有cookie,但是在react-native中没有任何方法可以实现这一点。 ios Native Module中的示例都在Objective-C中,我想使用Swift来实现。 首先,在YourReactNativeProject / ios / YourReactNativeProject.xcodeproj或YourReactNativeProject / ios / YourReactNativeProject.xcworkspace下打开用于React-native的ios项目,如果您之前安装过Pod。 首先创建一个新的swift文件,并将其命名为项目目录下的CookieManager。 创建Swift文件时,系统会提示您创建桥接头。 在桥接标题内添加导入语句 #import“ RCTBridgeModule.h” 在您的CookieManager.swift文件中 进口基金会 @objc(CookieManager) 类CookieManager:NSObject { @objc func clearCookies()->无效{ //删除所有缓存 URLCache.shared.removeAllCachedResponses() //删除任何关联的cookie 如果让cookie = HTTPCookieStorage.shared.cookies { 用于Cookie中的Cookie { HTTPCookieStorage.shared.deleteCookie(cookie) } } } } 不幸的是,我们必须提供一个Objective-C文件,以便将Swift暴露给React Native Objective-C框架。 创建一个新的Objective-C文件,并将其命名为CookieManagerBridge 在CookieManagerBridge.m文件中,您可以公开CookieManager类和clearCookies方法 #import #import“ […]

如何在科威特进行iPhone应用程序开发

开始改进应用程序 : 伴随的进步将使您从最早的起点开始在科威特的iPhone App Development Company。 到现在为止,您几乎可以掌握一些应用程序改进信息,您可以跳到娱乐开发的开始,或者访问有关在线学习Swift的最佳方法的文章以及Swift的完整手册。 使用Apple Developer Connection进行注册: 您要做的主要事情是为Apple Developer Connection创建一条直线,并捕捉Member Center和Register。 登记为Apple工程师将使您能够获得更多支持,并使您能够向Apple注册iOS小工具,以便它们可以运行您的测试应用程序。 您可以使用自己的特定Apple ID登录(如果您是单独的工程师,则必须指定),也可以仅为设计者帐户创建Apple ID(建议您为组织创建时使用)。 您无需支付Apple费用即可注册成为工程师。 您可以加入并访问iOS当前零售形式的所有设计器设备。 尽管您应该与苹果公司共同参与(每年69英镑),而您需要在科威特提供iPhone App Development的机会很少,但是开发和测试应用程序的基本要求是很好的。 进行申请或转移之前,请先进行安排: 在您投入任何应用程序改进之前,安排应用程序至关重要。 尽管没有为应用程序安排安排的固定方法,但是您(以及包括其他个人在内)应明确说明以下几点: 目的: 该应用程序最终打算做什么? 将其保持在尽可能基本的程度,Camera应用程序可以拍摄照片,授权基本更改并共享它们。 音乐应用程序可播放iTunes Match(或通过iTunes调整)中的音乐。 记录一个描述应用程序功能的单独句子。 范围: 考虑到科威特iPhone应用程序开发将包含的每个要素。 进行时,请注意高光爬行(过多的新想法)。 在开始之前,请先选择要包含的元素和要清除的元素。 主题和技巧: 应用程序的主题和技术将是什么样的? 它是欢快的,邻近的应用程序,还是鲜明而有效的业务工具? 解决您的广告程序,并确保应用程序样式预先与您的系统协调。 勾画出界面: 您必须绘制每个展示柜,并指导每个渔获的协作。 积累资源: Apple提供了大量的库存捕获和符号(您应该利用它们),但是您将需要徽标,插图以及可能的声音资源。 考虑您需要的进步: 您可以简单地在Xcode和App Store上获得帮助吗? 另一方面,科威特的iPhone App Developers是否需要服务器和其他改进? 您必须首先彻底考虑这一点。 以下是一些您需要安排申请的重要档案: ·Mozilla:规划您的应用程序 ·计划移动应用程序项目的最有效方法 ·代码完整:软件构建实用手册 […]

当我不知道Salesforce时,如何构建连接到Salesforce的iOS应用?

每隔一段时间我就会感到沮丧。 我仍然想念Parse。 它使构建移动后端变得如此容易,而且我敢说它很有趣。 是的,是的,我明白了。 昆顿,过一辈子。 继续。 像许多伟大的技术一样,不幸的是Parse不得不消亡。 不是Facebook杀死了它。 解析从未将后端连接到公司。 正是这种联系使公司能够与他们的移动应用程序客户建立关系。 没有此连接,移动应用程序就像玩俄罗斯轮盘赌。 一会儿一切都好,然后ba! 最终,这个对业务至关重要的应用最终以致命的一击沉入了应用商店DEAD中。 作为我在Salesforce工作的一部分,我与许多企业讨论了如何构建移动应用程序,从而避免了断开连接的应用程序的命运。 到目前为止,大多数人都知道我们称为App Cloud的平台。 他们可能为员工构建了自定义应用程序,但是在构建本机应用程序时,他们没有内部技能。 现实情况是,除非该公司是旧金山湾区的一家科技公司,否则他们可能没有一支消费移动应用程序专家团队。 他们将这类工作外包。 Salesforce到底是什么? 我是本地人,主要关注Apple生态系统平台:iOS,MacOS,TVOS和WatchOS。 我们使用诸如Xcode,Cocoapods之类的工具,并且喜欢Swift(虽然泰勒·斯威夫特确实写了一首吸引人的歌曲,但他并不喜欢泰勒·斯威夫特的综艺)。 将客户线索添加到Salesforce 抓住Leads-SDK cocoapod,在情节提要中添加一个按钮,将其类型更改为LeadsButton,然后询问客户其Salesforce组织ID(不用担心,他们会知道您在说什么。) 豆荚“ leads-sdk” 然后捕获客户信息: var d:Dictionary = [String:String]() //填充标准字段 d [Leads.StandardFields.FIRST_NAME] =“奎顿” d [Leads.StandardFields.LAST_NAME] =“墙” d [Leads.StandardFields.EMAIL] =“ quinton@here.com” d [Leads.StandardFields.COMPANY] =“ Salesforce” d [Leads.StandardFields.CITY] =“旧金山” d [Leads.StandardFields.STATE] =“ CA” myLeadButton.formFields […]

在小型企业中使用跨平台工具进行移动开发的好处

节省金钱,时间和理智。 Welcome App是iOS和Android上可用的应用程序,用于将新移民或新移民与当地人联系起来。 它于2015年底首次作为网络应用发布,并于2016年初在App Store和Google Play上可用。大多数用户位于瑞典,而一小部分位于挪威。 Welcome的目的是减少新移民融入社会所需的精力,以便他们更快地实现社会和经济融合。 我们的信念是,融入社会的人们也很容易融入经济,这就是我们的战略着重弥合移民与当地人之间的社会鸿沟的原因。 应用程序 Welcome应用程序经历了两个主要版本-第一个版本是使用Ionic构建的,而当前版本是使用React Native的。 但是,这篇文章不是Ionic和React Native之间的技术比较,而是简要提及了在小型初创企业中在移动应用程序开发中使用跨平台开发工具所带来的好处。 应用类型 让我们快速退一步来解释开发前景以及它最近的发展情况。 众所周知,当今最大的两个移动平台是iOS和Android。 为了编写用于这些平台的应用程序,您可以使用其本国语言编写它们,例如iOS的Swift和Android的Java,或将常规网页包装在所谓的Web视图中。 使用其他工具,网络视图可以控制电话摄像头等本机功能。 由于它们既不是纯粹的本机应用程序,也不是为手机制作的常规网页,因此被称为混合应用程序。 因此,总而言之,应用程序可以是网页,本机页面或两者的混合。 回到上一节,Ionic是用于创建跨平台混合应用程序的工具,而React Native是用于创建跨平台本地应用程序的工具。 好处 干 不要重复自己。 对所有知识拥有单一权限是程序员的核心原则之一。 编写跨平台代码的好处之一是,业务逻辑需要在一个地方而不是两个地方进行表达,更新和测试。 更少的代码通常意味着更少的错误。 您甚至可能会争辩说,最好的代码根本就是没有代码。 这意味着更少的时间来实施,维护和调试。 上下文切换 获取和维护特定语言和平台的深入知识需要时间和奉献精神。 此外,在多种语言和平台之间进行切换(例如iOS上的Swift和Android上的Java)可能会很有趣且令人耳目一新,但是对于我们大多数人而言,这当然并非易事。 在平台之间进行重复代码和上下文切换需要花费宝贵的时间,而这些时间可以花在原型设计新功能,测试或改善部署管道上。 功能奇偶校验 对于这种缺乏时间和精力的常见解决方案是雇用或培养专门针对特定平台的人员。 这样做的负面结果是,您最终可能会获得具有不同功能集的应用程序,甚至可能对同一功能使用不同的行为。 成本 而且也不便宜。 在我担任Spotify的工程经理的一部分时间里,招募人才是一项有一定界限的工作,而且没有任何预算限制。 人们说,头数基本上是免费的。 如果我们发现有人认为可以加强我们的团队,那么我们可以自由聘请。 尽管当时这对Spotify来说是正确的策略,但是对于一家初创企业来说,几乎不可能让他们的直属经理表现得像他们的预算无限一样。 相反,预算很可能很紧张,并且使开发人员能够跨平台工作可以潜在地节省很多钱。 要点 像Ionic和React Native这样的工具肯定不是灵丹妙药,但是它们帮助我们在不影响质量或功能的前提下,快速在移动应用程序上进行原型设计,同时又不冒最终在客户中出现不同行为或功能集的风险。 始终坚持非常严格的财政要求。 我们正在寻找更多有才华,谦虚和包容的开发人员,他们希望与我们一起实现我们的愿景。 如果您有兴趣,请联系!