ICD手机银行:发展历史

莫斯科信贷银行(ICD)信息技术局IT开发部远程服务渠道能力中心主管Oleg Ivanov

对于我们来说,移动应用程序的开发是从头开始的,因此在本文中,我们将从头开始:通过确定它是什么以及应该具有什么功能。 然后我们一路走来-从购买新的小工具到测试应用程序以启动它。 我们将用技术缩略语讲述我们应用程序开发的故事。 让我们描述一下我们遇到的问题。 不幸的是,在这篇评论文章中,我们将无法涵盖开发中使用的所有方法,原理和技术解决方案,但是我们将重点介绍最有趣的地方。

此外,将重点放在iOS的开发上。 在开始之前,让我们确定什么是移动银行。

移动银行是使用智能手机(iPhone等),平板电脑(iPad,三星Galaxy Tab等)上的银行应用程序管理银行帐户。 对于银行业务,需要通过SMS消息使用一次性代码进行两步确认。

移动银行的主要银行业务:

  • 银行产品的使用(帐户,卡,存款,贷款,服务包等)
  • 查看帐户余额
  • 陈述
  • 支付移动服务账单
  • 支付住房服务
  • 从卡到卡转移资金
  • 定期付款
  • 偿还贷款
  • 资金转入存款
  • 支付卡锁
  • 和其他。

移动银行应用程序是适用于小屏幕智能手机和移动设备上安装的操作系统(Apple的iOS,Google的Android)的互联网银行应用程序。 需要说明的是,运行Android操作系统的设备的型号范围非常广泛:三星,LG,小米,华为等,这使得Android应用程序的开发和支持更加复杂。

来源-MKBMobile 1.0


移动银行应用程序项目已从第三方公司转移到我们的团队,该项目是用目标C编写的。

这是项目在用户眼中的外观:





该项目已成为我们的能力的启动和考验。 我们的团队几乎没有iOS移动平台的开发经验,但是我们大胆地接手了该项目。

从哪里开始? 当我们考虑为iOS开发时,我们需要做的第一件事是:

1.需要iMac


苹果公司以其产品的高价而闻名。 但是节省并不值得-这就是您的发展速度!

适合我们的近似最佳配置:

  • 第七代Intel Core i5处理器,时钟速度为3.8 GHz(Turbo Boost最高可达4.2 GHz)
  • 32 GB DDR4 2400 MHz
  • 2 TB融合驱动器
  • 具有8GB VRAM的Radeon Pro 580 GPU

这种机器的大约成本为190,000卢布。

有一种看法-程序员需要iMac Pro。 是这样的:)但是价格却很便宜,如果您的公司准备购买它们,这将提高您的开发速度,当然也可以提高您的办公室的美观度。

2.需要iOS设备


“多少,哪一个?” -出现第一个问题。 这完全取决于您的应用程序。
如果您的应用程序仅支持iPhone,则至少有两种不同的尺寸:小尺寸(例如iPhone SE)和大尺寸(例如iPhone 8 Plus)。

如果您的应用程序还支持iPad,则需要一台iPad。

接下来是操作系统-版本。 如果您的应用程序支持最低版本(例如,从iOS 8.0开始),则需要在设备上存储每个iOS序列号,并记住在设备上“保留”(不更新)此版本并监视iOS新版本的出现,不要忘记为其选择一个集合。设备。

当然,您第一次可以使用Xcode模拟器,但是物理设备会施加自己的冲突,而这些冲突不会出现在模拟器上。

如果您不想拥有自己的设备场,则可以考虑提供此服务的公司的当事方:AWS设备场,Xamarin测试云等。

如前所述,iPhone和iPad都支持我们的应用程序。 在撰写本文时,我们自己的(!)服务器场大约包含30种不同类型和版本的操作系统的设备。

3.您需要确定iOS的开发方法(本机或替代)。


我们为iOS尝试了以下替代开发选项:

Phonegap /科尔多瓦

PhoneGap最初由Nitobi创建。 2011年,Adobe收购了Nitobi和PhoneGap品牌。 然后,Adobe将一个版本的PhoneGap(称为Cordova)转移到Apache基金会,剩下PhoneGap品牌和产品本身。 因此,Cordova可以看作是PhoneGap(以及其他一些混合框架)的引擎。 反过来,PhoneGap在Cordova的功能中添加了自己的其他功能。

PhoneGap在许多方面与Ionic非常相似。 它还使开发人员能够使用Web技术创建跨平台应用程序,并且它也是基于Apache Codova构建的。 但是,PhoneGap不受任何特定Javascript框架的束缚,因此开发人员在创建应用程序的方式和方式上有更多选择。

遗憾的是,PhoneGap使用WebView(在iOS上非常慢),因此,基于此框架构建的应用程序的速度并不总是那么好。

Xamarin

Xamarin系列产品Xamarin成立于2011年,在成立五年后被Microsoft收购。 如今,Xamarin产品提供了一种非常有趣的方法来开发市场上的跨平台移动应用程序:应用程序是用C#编写的,然后Xamarin将其编译为适用于iOS或Android的本机应用程序,而Xamarin使用Mono作为基础技术,而不是跨平台并且提供。 Xamarin开发人员说,生成的应用程序使用为其编译应用程序的本机平台API,因此生成的应用程序的行为与同一平台上任何其他应用程序的行为没有不同。 顺便说一下,可以使用Visual Studio进行开发(这并不奇怪)。

尽管事实上大多数项目代码都可以在每个受支持的移动平台上使用而无需更改,但是仍然需要针对iOS和Android的应用程序版本专门编写一些片段。

但是这种方法提供了所谓的“混合”应用。

其他选项的优点:

  • 跨平台(已经创建了一个应用程序,可以将其导出到任何操作系统);
  • 开发时间少于本地开发时间。

替代方案的缺点:

  • 比本地应用程序运行慢;
  • 无法完全访问设备的技术功能;
  • 通常不推荐使用现有的插件,因此有时您必须编写自己的插件;
  • 使用内置浏览器将用户界面可视化,与本机应用程序相比,这在获取反馈方面造成了困难;
  • 并非所有控件都已实现。

我们决定继续进行项目的“本地”开发。

苹果的原生方式

4.首先,我们需要一个用于开发和编写代码的工具-我们需要一个IDE Xcode


Xcode是由Apple开发的用于macOS,iOS,watchOS和tvOS平台的集成软件开发环境(IDE)。 第一个版本于2001年推出。 稳定版本通过Mac App Store免费分发。 注册的开发人员还可以通过Apple Developer网站访问Beta版本。

这就是在Xcode中创建和使用简单应用程序(如Single View App)的方式,如下所示:





有关Xcode的一些有趣的观点:

Xcode提供了一个非常方便的工具包,用于创建UI(用户界面)-Storyboard。





但是,iOS的大多数项目(应用程序)不是由一个开发人员提供的,而是由多个开发团队(开发团队)提供的,并且在使用分布式版本控制系统(SVN,Mercurial,GIT等)的所有应用程序屏幕上使用一个Storyboard时,开发合并成为真是地狱。

我们的团队同意一种方法: 一个Storyboard-一个ViewController
使用这种方法,由于通常一个开发人员实现一个功能,即该功能的所有屏幕,因此上述问题消失了。

为了减少使用Segue时情节提要中的负载,可以使用“重构至情节提要功能。 故事板的这种重构在父故事板中创建了一个链接,该链接导致一个新的单独的故事板,在其中实现了所需的ViewController。

还值得注意的是Xcode- Breakpoint的调试工具。
断点是一种调试工具,它使您可以暂停程序执行直到某个点。 这将使我们能够检查程序代码(此时查找变量的值,进行一些计算等)以找出错误发生的位置。



这个工具很聪明:我们有访问控制按钮(“跳过”,“进入”),用于操纵我们的代码。 我们还可以分析变量的值并使用控制台输出中的日志。
当按住Control键并单击指示器断点时,将显示命令菜单。 在这里,您可以设置触发断点,添加操作等的其他条件。
例如,我们为断点设置了一个触发条件:变量step将取值为4。在应用程序启动之后,仅当step变量取值为4且不早于此时,程序才会在此断点处停止执行。



我们可以添加其他表达式(属性甚至计算!)。

5.您需要确定编程语言Objective-C还是新的Swift


我们获得的项目是用Objective-C编写的,但是新的Swift编程语言已经出现。

这些编程语言是什么?

Objective-C是苹果公司使用的一种编译的,面向对象的编程语言,它是基于C语言和Smalltalk范例构建的。 特别是,对象模型以Smalltalk样式构建-即,消息被发送到对象。

Objective-C语言自1989年成立以来,在2006年进行了最后一次更新,更多
10年前 iOS的受欢迎程度一直在增长,这需要提高应用程序的质量。 要使用Objective-C,需要一个熟练的开发人员。

所有这些成为创建Swift编程语言的先决条件。

苹果从2010年开始开发Swift。 2014年6月2日,这种语言在Apple Worldwide Developer Conference(WWDC)上正式发布。 iBook Store上提供了500页的免费使用指南。

Swift 1.0于2014年9月9日与iOS的Xcode 6.0的Gold Master版本一起发布。
2015年6月8日,Apple发布了新版本的Swift 2.0,该版本具有改进的性能和新的错误处理API。 语言语法已得到改进,已经出现了一种检查目标操作系统Swift功能是否可用的功能。

2015年12月3日,Swift 3.0的测试版发布,支持OS X,iOS和Linux,并获得了开源Apache 2.0许可。

2017年9月19日,Swift 4.0发布。

2018年9月,随着新版本的iOS 12,新的稳定版Swift 4.2语言发布了,并且出现了Beta版本的Swift 5.0。 5.0版最终宣布了具有标准库(快速动态库),对正则表达式的支持以及用于异步/等待处理模式的并行数据处理的一流解决方案的ABI的稳定运行。

基于上述内容,我们决定仅在新形式中使用Swift,以支持旧形式,并逐步重写它们。

6.接下来,您需要了解项目的架构-我们决定将Apple的MVC架构保留下来


模型-视图-控制器(MVC)将三个角色之一分配给应用程序中的对象:模型,视图或控制器。 架构不仅定义了对象在应用程序中扮演的角色,还定义了对象之间的交互方式。 三种类型的对象中的每种都通过抽象边框彼此分开,并通过这些边框与其他类型的对象进行交互(https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html)。



但是,使用这种方法,我们遇到了以下问题,只有通过切换到MKBMobile 3.0中的新体系结构才能解决:

  • MVC并未就需要创建哪些实体和类以及没有创建哪些实体和类提供明确的说明。 模型的结构和架构,以及与控制器的交互,完全取决于开发人员的良心和想象力。
  • 对领域领域的了解不多。 即 当开发人员添加新功能时,不是创建新实体并重构现有体系结构,而是将新功能添加到ViewController。 这导致了以下问题:Massive View Controller-ViewController内部有很多代码。

7.最可喜的是iOS SDK(https://developer.apple.com/documentation/)


iOS SDK提供了大量的框架。

我们在银行应用程序中使用了以下具有特别热情的框架列表:

  • PushKit和UserNotifications用于处理推送通知;
  • PassKit与Apple Pay配合使用;
  • 用于与VoIP服务一起使用的CallKit(与WebRTC结合使用);
  • AVFoundation用于处理音频资源;
  • 联系人以访问用户联系人;
  • CommonCrypto用于使用加密功能。

因此,我们已经决定了必要的项目,我们有责任并为取得成就做好了准备...

一段时间以来,新功能(功能-新的转账,付款,银行产品(卡,贷款等))已很好地内置到应用程序中。

但随后,该应用程序变得繁琐且不便

因此,MKBMobile 2.0项目的出现带有一个大胆的界面想法-Trello Pages。

实际上,Trello Pages方法是将板子固定在屏幕顶部(在我们的版本中是顶部导航栏)。 该方法允许您在板(页面)之间进行快速导航。




这种方法的优点:

  • 可扩展性,无限空间向左/向右和向下;
  • 可分离性,每种功能类型都放在单独的页面上;
  • 适用于iPad和iPhone。

但是这个想法有一些缺点:

  • 顶部导航菜单项难以访问;
  • 传入的推送通知和SMS通知在使用顶部导航菜单时增加了其他困难;
  • 这种方法不符合Apple的人机界面指南。

因此,ICD移动银行的当前版本MKBMobile 3.0诞生了。

在此版本中,我们采用了Apple HIG(人机接口指南)下部TabBar中的经典导航模型。





转到此版本,使用Apple的经典MVC架构,我们获得了很多负面经验。

我们的团队不断壮大,我们需要一个较低的门槛让新员工进入该项目。
此外,还有一点没有让我们感到困扰:图形元素行为的单元测试,通过Xcode UI Test进行了测试,这是在仿真器(设备)上通过模拟用户操作启动应用程序的漫长过程。

所有这些要求导致使用了一种新的体系结构方法-VIPER。
经典VIPER模型:



但是,在研究了为iOS实施VIPER的多种方法之后,我们带着题头决定了Rambler&Co解决方案。

作为基础,我们从Rambler&Co.



VIPER帮助我们解决的主要任务是:

  • 具有或多或少明确定义的职责范围的大型类(Massive View Controller)的分区;
  • 将SOLID原则应用到其所有荣耀中;
  • 新员工进入项目的门槛低;
  • UI单元测试。

必须立即注意,VIPER绝不是一组严格的模板和规则。 而是,这是一系列建议,随后您可以构建灵活且可重用的移动应用程序体系结构。

我们的项目开始看起来像什么:



VIPER模块在我们实现中的结构:

1.最“主要”的是模块类,它了解每个人的所有知识,创建Interactor所需的服务对象,知道如何在视图,路由器,Presenter等之间连接所有部件。



它还通过输入和输出协议ModuleInput和ModuleOutput提供与其他VIPER模块的通信。

类似的输入和输出协议具有VIPER模块的所有部分(视图,路由器,演示者等)。

我们同意:如果不需要协议或VIPER模块的一部分,我们将不使用它们,也不为它们保留空类。

2.交互者(Interactor)-隐藏业务逻辑。

我们引入了附加的服务层。 服务-一个负责使用其特定数据类型的对象。 例如,帮助系统服务负责目录(协议文件,详细信息等)。

3.演示者-从View接收有关用户操作的信息,并将其转换为对Router,Interactor的请求,还从Interactor接收数据,准备它们并将View发送给显示。

4.路由器-负责模块之间的导航。

5.视图-负责在屏幕上显示数据并通知Presenter用户操作。 被动,它从不请求数据,仅从Presenter接收数据。

我们的模块可以是复合的。

也就是说,包括独立的VIPER模块。 例如,主产品页面由一组独立的部分组成:余额,模板小部件,不同类型的银行产品的各个部分以及汇率。

所有这些部分都是独立的,可以过自己的生活-它们在银行服务器中拥有自己的API,并且具有独立的数据模型。 为了在主页上显示它们,准备了容器(父视图),并在其中插入了这些小部件(视图)。





我们的iOS移动应用程序正在不断发展和壮大。 越来越多的客户使用它。




我们计划引入以下哪些工具:

  • SwiftLint,来自Realm开发人员的实用程序,用于自动验证Swift代码;
  • 基于Fastlane的完整CI;
  • 充分利用Xcode中的乐器(分配,泄漏,僵尸等)

按照我们的文章! 见,谢谢您的关注!

Source: https://habr.com/ru/post/zh-CN467057/


All Articles