2020年 FastPay iOS客户端开发总结记录

iOS成长之路

共 15762字,需浏览 32分钟

 ·

2021-01-28 08:14

【这一年的项目开发总结记录】

一个新的伙伴加我微信说看到我的iOS分析收获很大。这促使我想再写一篇关于自己2019年10月到2021年1月在公司iOS项目开发工作真实记录。

本来没有写的计划,但是刚好我最近一个月努力改造发布了全新架构的2.0.0版本,以及把新的需求开发差不多了。我的iOS客户端开发的进阶和突破的目标已经实现,我在iOS客户端技术开发道路上的遗憾和不满足都已经解决了。为此我在这里记录我这一年为这个目标所做的努力和结果,我的全部目标全部精力为的都是把该项目做到极致,把我会的技术使用到极致,把遇到的每一个问题彻底弄明白,把每一个技术挖掘到根上。

我们公司的产品可以在appstore下载:https://apps.apple.com/cn/app/fastpay-for-payment/id1492659998

介绍一下我们的产品和业务:我们公司的产品名字叫做FastPay,竞争品是EMQ SEND。我们的目标客户的是在台湾的菲律宾佣人,他们在菲律宾赚的钱,需要寄给家人,那么需要把台币转到菲律宾银行。那么他们在我们客户端通过手机注册,填写自己的证件资料,经过审核通过之后,他们就可以输入菲律宾银行的账户,转钱出去。另外他们还可以在这里进行线上消费,比如电话缴费,水电费缴纳,银行还款。

我们的Team:iOS客户端就是我,android开发另外一个同事,H5另外一个同事,后端开发两个同事。涉及银行间转账和汇款的系统是台湾的技术同事,他们已经有一个结算的平台,做了很久。我们的现在业务也是基于他们的系统实现的扩展。

那么iOS客户端就是本人,从2019年10月从零到一的过程一行行代码写到现在,一个个组件封装到现在的过程。

FastPay iOS客户端使用的技术和语言:纯swift 项目+有些业务和页面html实现

支持的版本:1.0.0-1.4.0 版本支持到iOS9  1.6.0-之后 支持到iOS10 1.9.0之后支持到iOS11

发过程发现github上的大部分开源库已经从iOS10开始,选择iOS9起步有点为难自己。后面依赖的库以及xcode12太多warning,让我选择iOS11是最低版本,这样做iPhoneX刘海适配也是最方便的。我观察了用户的数据,iOS10的操作系统可以忽略。

客户端的功能模块:发生短信,类似支付宝支付面板,分享Facebook,google,line,vibe等社交,接入三方的人脸识别SDK,消息推送,相机扫描二维码,条形码,获取通讯录,上传图片,相册读写图片,相机自定义界面裁剪指定区域,同H5的数据方法互相调用,生成分享图片保存相册,apple facebook等三方登录,强制版本升级弹框,页面可配置广告弹窗,输入框输入规则限制+工具栏,地址位置获取,网络检测,异常界面和错误提示,rash日志收集,coredata数据管理,RSA+AES混合自定义通信加密,支持多语言,网络请求及model解析,object-c桥接

项目Pod:我把版本号隐藏了

platform :ios, '11.0'
use_frameworks!
 
target 'FastPayiOS' do
  pod 'HandyJSON''X.X.X'
  pod 'Connectivity''X.X.X'
  pod 'RxSwift''X.X.X'
  pod 'RxCocoa''X.X.X'
  pod 'ESPullToRefresh''X.X.X'
  pod 'Alamofire''X.X.X'
  pod 'SnapKit''X.X.X'
  pod 'Kingfisher''X.X.X'
  pod 'Atributika''X.X.X'
  pod 'FSPagerView''X.X.X'
  pod 'Parchment''X.X.X'
  pod 'CryptoSwift''X.X.X'
  pod 'WKWebViewJavascriptBridge''X.X.X'
  pod 'DeviceKit''X.X.X'
  pod 'SwiftyRSA''X.X.X'
  pod 'SwiftRichString''X.X.X'
  pod 'SwiftDate''X.X.X'
  pod 'KeychainAccess''X.X.X'
  pod 'EFQRCode''~> X.X.X'
  pod 'Firebase/Analytics'
  pod 'Firebase/DynamicLinks'
  
  # facebook
  pod 'FBSDKCoreKit/Swift'
  pod 'FBSDKLoginKit/Swift'
  pod 'FBSDKShareKit/Swift'
  # google
  pod 'GoogleSignIn'
  # GeTui
  pod 'GTSDK'
  
  target 'FastPayiOSTests'do
    inherit! :search_paths
    # Pods for testing
    pod 'Quick''~> X.X.X'
    pod 'Nimble''~> X.X.X'
    pod 'Cuckoo''~> X.X.X'
    pod 'RxBlocking''X.X.X'
    pod 'RxTest''X.X.X'
  end
  
  target 'MGLDataKit'do
    inherit! :search_paths
    # Pods for DataKit
    pod 'SwiftyRSA''X.X.X'
    pod 'RxSwift''X.X.X'
    pod 'RxCocoa''X.X.X'
  end
  
end
 
target 'NotificationService'do
    pod 'GTExtensionSDK'
end

以上就是我一年时间做的事情,结果可以下载app看一下效果,分享了pod基本知道我项目是怎么写的,采用了什么要的技术和方案。

那么在以这些pod为基础+swift我是怎么让自己吃透得到觉悟的呢?在开发过程中有几个场景和环境让我一步步打通了自己的知识体系。

在开始介绍我这12个月如果一步步把项目做到上线,突破了自己的职业和技术限制。我先介绍一下自己的背景,以及来到这个家公司时机。这是我的14年初自学iOS开发的第一个app也是目前我自己唯一发布的app https://apps.apple.com/cn/app/id1392332216
在2015年6月18日我通过了阿里巴巴城市事业部的面试层级P5开发工程师,和我一同入职的刚好是我本科同届的研究生层级也一样。在900天之后,我离开了西溪园区。离开后,我同龄的同事大部分了已经升级P6,p6升级P7。期间,有两个特别优秀的同龄iOS同事,去了苏州微软,一个钟颖 自己做了非常多优秀的app获得过苹果年度优秀开发者。部门变动,同事流动,没有从他们的身上或者代码中学到更多的东西,我还是充满了疑惑。但是我看到了集团的力量,看到了公司的沉淀和积累,百川的各个BU的技术总结,各个部分的底层库封装。看到了很多黑科技,比如hotpatch,热更新,windwine H5容器,离线包。此时我们还是使用object-c做为主要开发语言,swift还在从1到3的迭代中。和优秀,聪明的人在一起才会影响你,才会受到不一样的思维和思考。我不聪明,也不够优秀,比如中南民族大学只是一所靠谱的二本高校,我大学期间考了三次四级才过。但是我是一个努力的人,在大学我才接触计算机,学习了网络工程专业。但是我没有想过成为一名程序员,也不知道如何才能成为一名出色的程序员。毕业后,我已经决定不会去考公务员,既然认证学习了四年计算机知识,学习了计算机专业,那么从事计算机的工作没有问题。之后思考的问题就是如何成为一名出色的程序员,我认为踏实的做项目,不断提升自己是非常充实的选择,是一条正确的道路。但是让我不愉快的是一直没有突破自己在开发技术的能了,期间换了很多公司很多技术类型。直到2014年开始接触移动设备,觉得搞明白移动端是怎么做数据请求,怎么设备通信。

那么我以上解释的是什么问题呢?解释的是我为什么不开心的问题,我离开阿里是感觉自己还是很被动,所谓被动就是不给力,通俗就是菜。但是我是个努力的人,那两年给的年终奖给力。。。。

我一直思考,如果如何精通iOS的技术,把SDK吃透,如果随心所欲的开发各种界面,各种效果。离开阿里巴巴之后,那时28岁我觉得给自己时间消化一下见过的那么多技术和方案。同时这一年我明白了一件事情,学好英语非常重要,如果是我把学习技术的方法放到了学习英语,从头开始学习英语一切的知识。这就是大概我后面一直学习英语的事情。花费三个月自己学习英语和休息,巧合看到一所刚刚建立的私立双语学校招聘技术支持。这是学校在余杭镇,余杭人大附中一年学费18万,是我永远没有机会踏入门的学校。但是他们要求英语水平可以,技术靠谱的人来做学校教务系统维护。私立学校,刚通电拉机房,一切刚刚开始,所以招聘还是看技术为主,给力我机会。为进去之后和同事们一起装系统,装软件,我负责数据库的备份,排课程,各种数据导出。度过了一年忙碌时间,让我在这个双语学校认识很多朋友,老师一半是外教,一半是出国留学回来的老师,我遇到了印度的图书管理员,遇到了很多英国名校老师。我看了不一样的教育系统,不一样的教育体验。支持了学校运行两个学期,我们从零到一完成了任务。但是学校没有教务处,排课各种数据的任务都是只有我这个最懂的人来搞,加上系统买的国外,这样的我没有办法彻底解决烦恼。如果是国内厂家,我直接自己去厂家,但是国外都是走流程,钱到位服务到位。在我们网络部最轻松的日子,我离开了。去学校工资减少了一半,但是我不在乎这些,我认为做有意义的事情让我更值得,去学校就是为了英语。还在想,不做作程序员自己能干什么呢。现在想想,年轻肯干,踏实认真靠谱,老板都会给你机会。

29岁的时候离开学校,我心里还是有一件事情没有解决,那就是怎么精通iOS开发,怎么成为出色的程序员。16个月没有写代码,2019年5月我买了很多数据,我把Java9从头看完,我把tomcat看完,把nginx源码看完,把swift自学完。在家自己吭了十多本后端书籍,思考前后端的数据通信和技术实现。此时,swift5已经发布,github开源库都已经有了swift版本,我知道必须精通swift了。在2019年10月我面试到了这家离住的地方最近的公司,走路十分钟。刚装修刚成立,目标是做东南亚市场的移动支付APP。面试过程中,我解释了自己已经立志学好英语,而公司老板在2012年正好参与发了English-bell线上日本,台湾,中国的一对一英语教学服务。公司正好为他们提供技术支持,公司因此为每个同事提供每个月8节免费课程的福利。

海外市场,还有英语学习,我觉得我可以在这里踏实的做事情,而且正是我心里的目标。为此我在English-bell累计学习了430天,充值2.8万,让我进入了英语学习的新阶段。你问我为什么不去新东方,为什么不选择ABC英语,一个是穷,一个是我觉得国内的英语培训机构要么是骗子,要么目的性太强。而English-bell一堂课程25分钟才54块钱,我不喜欢喝星巴克,但是这价位我真觉得捡了便宜似的。

2019年19月,我决心重头学习iOS开发,而且决心解决遇到的每一个问题,精通遇到每一个技术难点。我要做的事情就是精通iOS开发,在这个技术上做到随心所欲,不在不给力,不在不自信,不在逃避,不在凭空的思考为什么做不到优秀,一个干,把东西干出来再争论。

公司刚成立,原形需求都在整理,因为这是老板脑子里的项目,所以需求规划会很乱。我和Andriod同事前一个月的主要时间就是底层脚手架的搭建,公共模块的编写。

我有很多项目的代码,之前公司我都有,但是都是object-c,我现在要用swift,因此我首先在github找必要的开源库,比如图片下载缓存,比如网络请求,比如masory这样库。这部分库,我很快的找到了,那么现在就要开始搭建网络,这是当务之急,简单的写法我知道很多种,但是我需要封装的优雅MMVM模式+MVM模式。我知道reactcoca是必须要精通的框架,那么对应的swift版本就是rxswift。

对我帮助非常大就是泊学网站,https://boxueio.com/   刚好我2019年10月12日知道了这个网站,它的课程正是我要的东西,swift的全套教程,我买了终身会员,我一般封装底层脚手架,一遍学习作者的教程,里面项目刚好是rxswift+swift来实现,我完成了156视频的学习。在边参考作者项目,边深入学习swift语言特性,我开始了FastPay的项目开发。同时我在github上寻找Rxswift+swift的项目,我找到了和我想法非常合适的项目,rxswift+swift+Alamofire

结果是我们2019年10月开始到2020年7月发布上线了1.0.0版本,这对一个版本花费了9个月时间。

下面把FastPay项目底层开发封装思考和选择分享给大家:

第一个场景:网络层该怎么写,数据model该怎序列化。这是我到达公司第一个要干的事情。技术实现就是:

//https://github.com/hadanischal
//https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
   //创建share session:
 static let sharedSessionManager: Alamofire.Session = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 60
        return Alamofire.Session(configuration:configuration)
   }()
 
funcrequest(with resource: MGLResource) -> Observable<MGLResult> {
           return Observable<MGLResult>.create {observer in
          MGLService.sharedSessionManager.request(resource.url, method: .post,parameters: parameters, encoding: JSONEncoding.default, headers: headers)
               .validate()
              .responseData(completionHandler: { response in
                   switchresponse.result {
                   case.success(let value):
                        observer.on(.next(_result))
                      observer.on(.completed)
                   case.failure(_):
                       observer.on(.error(error))
                   }
               })
           return Disposables.create()
       }
   }
}
 
protocolMGLAddressHandlerProtocol {
   
   func cityInfoList(cityId: Int?) -> Observable<MGLResult>
 
}
 
classMGLAddressHandler: MGLAddressHandlerProtocol {
   
   private let service: MGLServiceProtocol
   private let disposeBag = DisposeBag()
   private let cityInfoListPath = "/api/v/xx"    
   init(withService service: MGLServiceProtocol = MGLService()) {
       self.service = service
   }
   
   func cityInfoList(cityId: Int?) -> Observable<MGLResult> {
               let resource =MGLResource(path: cityInfoListPath, parameters: commonParameters)
       return service.request(with: resource).map { data ->MGLResult in
           return data
       }.asObservable()
   }
 
protocolMGLUserViewModelProtocol {
   
   var userInfoResult: Observable<MGLResult> { get }
   var manualErrorResult: Observable<Error> { get }
   
   func userInfo(userId: String)
}
 
classMGLUserViewModel: MGLUserViewModelProtocol {
   
   private let userHandler: MGLUserHandlerProtocol
   
   var userInfoResult: Observable<MGLResult>
 
privatelet userInfoResultSubject = PublishSubject<MGLResult>()
 
   init(withSms userHandler: MGLUserHandlerProtocol = MGLUserHandler()) {
       self.userHandler = userHandler
       userInfoResult = userInfoResultSubject.asObserver()
inviteResultSubject.asObserver()
   }
   
   func userInfo(userId: String) {
       userHandler
           .userInfo(userId: userId)
           .retry(3)
           .subscribe(onNext: { [weak self] result in
              self?.userInfoResultSubject.onNext(result)
           }, onError: { [weak self] error in
              self?.errorResultSubject.onNext(error)
           }).disposed(by: disposeBag)
   }
}
 
       viewModel
           .otherMerchantResult
           .observe(on: MainScheduler.instance)
           .subscribe(onNext: { [weak self] result in
              self?.handelOtherMerchantResult(result: result)
           }).disposed(by: disposeBag)
 
    func handelOtherMerchantResult(result:MGLResult) {
        methodListModel =MGLPaymentKitListModel.deserialize(from: result.data asDictionary)

我吸取了作者的方法,很好的做到了各个业务的分隔,解决公共参数的封装,解决了全局网络的拦截和加解密处理。

第二个场景:安全是第一位,我们选择rsa+AES的模式,同时我们加上了我们自己实现的加密算法。我们以前没有深入学习加密,我就把rsa,AES各种加密实现和细节全部的看完。我把自己使用的加密库底层源码全部看了,研究了openssl相关知识。现在我对底层数据结构,数组,data,二进制,base64,uinicode,unit8,unit16 为什么他们存在理解的非常清楚。我封装了iOS客户端的加密代码,之后我和同java后端调试,发现他就是无法解析我的数据,最后发现是java unit8在内存表示范围和ios不一致。现在遇到各种问题,我已经非常耐心,我会找到一点点线索,然后深入分析,深入研究,排查问题。我已经把工作当成自己的日常陪练,不是任务不是活,他们是教练,是我的朋友。

第三个场景:git的使用,以前只会简单git add,现在不能这样简单水平。我买了精通git 2这本书,从头看完了git全部技术实现和命令。我佩服他们有这样的设计,现在我只要不会,直接翻开这本书就能解决我全部问题。什么rebase,tag 高级用法我也是随便玩,反正原理我已经清楚,我自己写demo自己观察自己测试各种操作,git已经玩的没有问题。

第四个场景:推送证书设置,iOS开发离不开配置各种证书。我认真看各种证书的意义和用处,看各种之前没有使用到的申请选项,比如associated wifi等等。最后我结合个推,测试p8证书,p12证书。证书已经玩透了

第五个场景:在上半年,相册,相机,扫描我都是使用github上的库,后面发现他们还在支持iOS9 和ioS10,因此带来太多的warning,扫描的SDK界面也不能自定义,他们的代码有很多冗余。因此我下定决心把相册,相机,二维码扫描,项目里面全部自己封装。最后我已经把相册,相机,二维码,条形码扫描玩的非常好,拍照,闪光,相机视频流我已经可以很好控制。我参考他们的实现,把全部代码自己写一遍,现在我不稀罕任何相机,相册封装,因为我已经可以自己写出非常好的控件。这个过程中我粗心写出了一个bug,就是有低端机器闪光灯不一样的aviable,我设置了闪光灯auto,界面他们在电量不足的情况下crash了。后面我加上了auto的状态检测

第六个场景:键盘,密码输入框,短信输入框 短信输入,密码输入之前没有时间使用了github上的,后面发现实在忍受不了那个代码质量。我全部自己封装,做到了自适应,长度自己设置,字体,光标全部自己控制。

第七个场景:键盘顶部功能调,日期选择,单项选择 是blur做为背景颜色,和系统的颜色非常相近。我使用inputView把日期选择放大了键盘自定义view,实现了非常好的交互。

第八个场景: 启动加载页面 Launch 过了半年,我发现我们app启动必须获取后台开关配置,所以必须加载他们成功才能做后续的事情。于是这启发了我,app的启动之后,必须经过一个launch页面,在这里检测版本更新,检测必须要的接口请求,初始化全家配置,检测权限和网络。我设置了如果网络超时3秒展示loaidng,如果3内成功那么就没有任何感知。这改变我设计app的思路,给我来我很好的启发

第九个场景:iOS的动画开发 这是逃不了的,必须会native的动画实现。我买了一本iOS动画化的书,写的很薄也很简单,但是给我的感觉就是很有用,因为作者没有将原理,而是把动画归类了。现在写动画,我已经随便写。加上贝斯曲线,我已经可以玩各种动画,写各种mask,各种弧度的效果。

第十个场景:rxswift的学习 我的项目就是依赖rxswift,我非常喜欢它的简洁,我学习了它的思想和想法。在项目开发中我非常乐意使用它,之后我会更输入的学习rxswfit的用法,有了它我对数字,字符串各种reduce,各种match,filter如鱼得水。另外它的计时器,它的combine,依赖关系管理,rxcocoa提高的快捷方法,也是非常好用

第十一个场景:iOS界面开发 我就是这样搞定iOS界面布局开发,于是我开始翻阅各种资料,看看官方有没有解决这个问题。最后我从iOS6开始找到了consrtaint,再到iOS9的 anchor再到snapkit再到uistackivew。我买了autolauyout布局那本书,虽然我现在不会那样繁琐的去写约束,但是后面全部的发展都是再次基础上。现在结合uisatckview+anchor + usicrollview我可以不依赖任何三方的苦实现自适应布局。iOS的适配和布局开发对于我来说已经随心所欲,结合safearea,safeguide,lauoframe我已经可以快速写界面,非常轻松的活。

第十二个场景:同Html的互通 有些页面使用Html写非常快,有些业务使用html是必须的,所以我才用了最简单的WKWebViewJavascriptBridge 写了很多方法给H5使用。

第十三个场景:又一次发布了一个版本,出现了诡异的问题,线上包一定会出现,而我的xcode执行代码就不会出现。最后排出就是我的xcode是debug模式,而现实是release模式,因此某些依赖在不同的模式下面会不一样,这让我大吃一惊,因为我半年都没有注意到这个。这让我对xcode的各种shell和pod的配置有了新的认识,不熟悉的东西,不能避而不见,凡是你项目里面有的东西,你一定要清清楚楚,也许不是你的,但是他们的存在一定有理由。

第十四个场景:coredata 在2.0.0之前,我的版本数据存储都是使用default+ 本地文件archviev实现,这样弄的项目 里面变量使用非常混乱。signout需要清空各种key,为什么不使用数据库呢。还不是一开始不知道要做成什么样子,要那些数据。等项目上线之后,我知道FastPay那些东西是必须要的,我创建了device表,user表,register表。我之前对coredata,sqlite没有在项目使用,但是我知道我一样吃透他们。我买了能找到了coredata的书籍,第一遍看天书,不知道说什么。我看demo,自己测试,跑起来。最后一点点在项目中使用起来,开始是用来记录crash日志,后面我把全部的数据都适用coredata来管理。最后在2.0.0版本我迁移成功。现在我想说,之前看的天书,现在都明白了,这让我觉得以后任何项目都要使用数据来管理,coreata就是ios平台,快平台就是sqlite。

第十五个场景:权限管理 在开始,我就是把各种权限封装好,相册,相机,地理位置,短信,wifi,之后直接拿来使用,先检测,在请求。

第十六个场景:读取通讯录 我们有一个输入联系人的输入框,可以边输入边匹配讯录手机号。我之前大意了,一次性读取用户手机通讯录,以为用户手机号码不过几百个。想不到在老板手机上直接翻车,他的手机联系人有两千条,内存占用过度,直接crash。后面我做了优化。

第十七个场景:弹出框,加载失败页面 我参考了present模式封装了弹出框,也在widnow上面addSubview实现,还写了BasicViewcontroller给全部chid实现弹出框实现错误页面和refresn加载界面。

第十八个场景:websokect 什么是sokect那么什么是websokect,我研究相关东西,还买了TCP,HTTP的书籍,准备认真研究相关底层实现,理解HTPPS的加密实现规则,看sokect协议,在项目中使用websokect提高体验

第十九个场景:Firebase,keychian 我们项目是海外项目,这让我对多语言的支持有了新的认识和了解,不管做什么项目一定要考虑多语言的支持。另外为了满足国外需求,我们集成了很多国外SDK,在这个过程中我看了google,facebook他们的技术文档和细节,使用了他们的平台,得到了不一样的体验。现在已经自动使用google做为日常搜索引擎。keychian就是拿来做保存唯一UUID的东西。

第二十个场景:crash日子的收集 封装了crash日志收集,以前直接使用现成的,现在终于得有机会自己去实现和了解。

第二十一个场景:testflight 现在测试和给其他地区同时测试,离不开testflight,我也成了使用它的达人

第二十二个场景:正则表达式 用户资料填写很多输入规则,比如邮箱,姓名,这个使用正则表达式做最合理。为了精通正则表达式我购买了 精通正则表达式这本书,把正则知识点系统的学习。之后我研究了iOS上面的正则的是如何支持的,有哪些地方使用到了。现在可以愉快的使用正则解决各种问题,这个东西学好了真是受益,比如coredata的fitlter。

第二十三个场景:Flutter的两个月学习 在app发布了1.0.0版本之后,终于有时间喘口气,因为android和iOS两端的开发效率不高,精通一套跨段框架是必须的。我们觉得选择flutter做为目标,在这个gap时间段,我从头学习了flutter的demo和文档,从底层封装FastPay一样实现一个futter的项目。我学习了provider状态管理,精通了Flutter的界面和布局,实现了在flutter上的网络请求及加密封装。学习了google的materil文档,补充了很多移动端的设计理念。

第二十四个场景:加密算法的学习 购买了Https源码实现一本书,研究了开源的openssl裤,对加密进行了重点的了解和实践

第二十五个场景:了解iOS官方控件和一些交互效果的实现 Toast弹框和适配一直是通病,各中业务和公司都喜欢自己定义。为此我看了很多开源的代码,还去分析了iOS官方弹窗的实现和作法,希望借鉴他们的思路和效果。最后就是对present的使用非常熟悉,借助iOS转场动画可以自定义想要的界面和效果

第二十六个场景:开发者大会和产品发布会 我把苹果近十年的产品发布会视频看完,如果你想在这一行主动,那么就要时刻关注它的动态和发展。跟随苹果的步伐和趋势。爱一行,就爱它的全部,涉及的各个方面。

第二十七个场景:泊学网站,swiftio,喵神 我把喵神出版的书籍全部看完了,泊学上涉及的基础知识全部看完了,这些书籍和总结对我来说是学swift最好的资料和参考,有深度有启发

以上就是我这一年开发自己所做的事情,有的技术是因为业务需要让我有机会去深入,有些是因为遇到bug,让我深入去思考。所以在企业真是做项目得到的东西比新手自我去摸索效率高,等你有了一定经验之后,就可以自我驱动。

FastPay之所以做了9个月发布,因为前前后后没有确定好要做的东西,登录,首页各种页面基本上做了两次以上。最后终于确定了1.0.0版本要上的功能,依赖的第三方服务也调试完成。对于这样的折腾和不断修改界面,我基本上没有排斥,因为太久没有写项目,现在给我的任务都是练手。上线之后,我再之前写的代码,发现很多写的很不简洁,随着提升对架构和各种流程初始化也更有心得。

如果现在让给我去做一个iOS客户端,开发效率和时间已经比起去年减少一半,架构和各种设计的使用我也是充满心得。在2.0.0 版本我把本地数据存储全部转移到coredata管理之后,我知道iOS端开发我已经突破的了自己,我完成了自己设定的目标。

随着英语水平的提高,如今写代码看API注视和理解已经是另外一个感觉,好比你看文言文和看白话文一样理解清楚他们的含义一样。

那么接下来的计划和规则是什么?

我接下来的计划和规划是阅读我买的大量的计算机书籍,比如算法,软件开发设计模式,加密算法比特币的技术内涵,TCP,HTTP协议,一些经典的计算机程序工程书籍。

另外一个目标就是开发自己的APP,把现在的架构抽取出来,写一些工具app,旅游类型的APP。通过自己的项目进行不断练手,保持iOS开发的手感,在上面实现公司项目没有用到的技术,做新技术的测试。

另外一个目标就是学习Flutter开发,掌握一套跨平台的技术,解决业务开发慢,国内需求多变的实际情况。另外在dart上深入,使用它进行后端的开发,争取以后以Flutter + dart +web 一体的技术栈。

在我人生30岁的时候,我下定决心做两件事情,一个是学好英语,一个是精通iOS。这个和赚不赚钱没有关系,这和你在上面样的环境没有关系。2020的目的就是一个,从头开始专研iOS,做到优秀,做到极致,把不会的东西补上。面对疑惑,困难,面对看不懂的技术书籍,逃避没有用,啃下来是我的办法。

做技术开发和铁匠一样,和杀猪的一样,熟练之后就可以制造高质量的产品,可以庖丁解牛。我没有思考iOS有没有前途,移动开发领域是不是没落,是不是该换后端。这个问题等我精通玩透了它再说,我就是对自己一直没有精通iOS开发不开心而已。我要办的也就是这件事情,没有其他想法。技术很多东西都是互通的,我早就知道,也造就看到这样事情,诺基亚倒闭之后,很多同时都是之前做硬件的。这个东西老手都知道,每个技术和平台直接的差异是什么,核心价值是什么。

我只想把iOS开发变成生活的乐趣和兴趣,不想以后面对需求和要求当成任务。这是我对职业和自己做的事情的态度转变,因为这样才会让自己走的更远,让我们感受快乐。因为是计算机专业,加上当前信息化时代背景,我没有怀疑过自己的选择,当然大会的专业是随机分配给我的,我没有考虑过大学学什么专业,甚至大一想去法学专业,但是被辅导员一顿谈话打回来了。

我只是想认真的做一件事情,没有去培训,没有去拜师。很多公司给了我机会,在边工作的过程中,思考如果提高自己,不在成为摇摆没有目的,一直半桶水。

现在的我和之前我,最大的区别在于我终于下定决心完成一件事情,下定决心把一个样东西各个细节和方面做到最底层。高手,不会说该不该学这个东西,我只会说现在的项目涉及这个东西,那么我都要搞定它,吃透它。

最后,关于iOS进阶和提高的分享到此为止了。我只是下定决心精通iOS开发,下定决心学好英语。刚好加入了一家刚成立的公司,开发从无到有的新APP,还有一个英语培训平台。在这里的一年内,加班,周末,充电,买书籍看书,是日常了。我们没有放弃,在难我们都坚持到了APP需求确定,发布上线的7月份,有一些同事走了,但是大部分人坚持下来了。一月份老板直接给我们发来年终奖。不能说我们做的很好,或者带来来很好的收益,我们效率很高,只是我们这些坚持到底,我们战胜了恐惧和耐心。

我希望每个人选择自己的职业都是因为喜欢,我希望每个人对待自己的职业都是精益求精,我希望每个人不管你之前什么基础,当你决定一件事情,那么就彻彻底底的把它做到最出色的那一批人。青春,时间宝贵,跟风的进入某个行业,最后跟风的逃离,最后喋喋不休的抱怨。

技术这个行业不讲关系,不讲资历,混江湖靠的是本事,在协作的基础上一起努力完成一件事情。商业讲究时间和效率,所以会不断的淘汰,会不断的变化,不能跟随这个节奏,就会很被动。

如果你想分享iOS客户端技术架构,一起探讨技术的实现,可以加我微信,很乐意一起分享好的方案。我花了6年时间才到今天的技术和领悟,不算聪明,也不算混的好,选择其他技术和语言,同样的时间你可以成为高级开发工程师。

对于我自己而言,只是活的更明白,活的更淡定,我可以在工作中感受更多快乐,我有了自己的兴趣和爱好。

不管是劳力士还是12块钱的电子手表,时间都是24小时,是刷快手,还是看一本技术书籍,看一篇技术paper,选的权利都在自己的手上。

加油,战胜你自己!让我们感受生活的乐趣,感受自己的能量,让我们有自己的头脑。

哈哈,我在阿里的花名是:坚一 工号:100664   因为我去的时候级别不高,不敢取太霸气的名字,我给一号店来的android 高级开发同事取的花名:花佛    一直让我觉得很满意,他媳妇说他的名字解释就是 花和尚

公司的13寸,i5 四核2.4 16G内存 256硬盘,感觉不给力,尤其是硬盘更新xcode每次要删除很多东西,硬盘满了。我在纠结是咸鱼买一个15寸16G 512G 2.9 四核i7的9千二手机器,还是买最新的13寸 M1 16G 1T的新机器。最后选择还是买新的,因为电池,屏幕,键盘,都是有保障的,用个两年觉绝对没有问题,加上一个applecare更放心。

对于刚毕业入门iOS开发同学来说,或者没有经济压力和包袱的同学,学习iOS开发,直接 swift+swiftUI + switf combime就是最新的架构以及未来的架构,学好了可以领先3年。这对你们是礼物,没有包袱,直接最新技术玩。对找工作,那么object-c肯定是逃不掉,写项目一定是swift了,所以精通两个是必须的,没有学什么不学什么。

对于我,我本是已经精通object-c,swift  每种语言都已经是2年以上的开发使用时间,他们混着使用单独使用都是轻松搞定。历史原因,我还是pod依赖,不使用storyboard,全部UI直接使用代码写,国内大公司storyboard是不会用的,也不灵活。

我直接的规划是:我不会去精通swift UI了,关于swift combime,他本是是来源Rxswift ,我会去学习它,看看差异。然后精通Flutter。swift UI相比Flutter还是有点鸡肋。我使用原生写界面效率和各种玩法不比swift UI差,没有必要使用他了。



浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报