项目重构遇到的问题

在项目重构的时候难免会遇到问题。

加入了新公司,也是接手了一个14年的项目,项目大概6万行代码。然后准备做一些业务并且重构,做了一个需求以后开始重构,然后发现每走一步都是坑啊。上家公司也是14年的代码,那个时候是我们那个老大架构师也是刚去的带我们重构(顺便说一句上家公司代码大概20万行)现在自己准备着手的时候感觉我上一个老大真的好厉害额。5年工作经验额。我等菜鸟还要慢慢踩坑,慢慢修炼呐~

不得不说,这两个旧的项目有很多共同点呐,可能那个时候流行那么写,不过从上家公司走的时候那个代码都已经重构的很不错了额。关键是上家公司做iOS的人就接近10个了。实话说,我都觉得自己的用处不大了。然后现在就我和我老大两个做iOS的了。不管怎么说,加油💪把!努力提高自己才是关键。

旧项目的问题:

  1. 使用老式框架 ASI,并且没有做任何封装和抽取; 如果工程是ARC的 第三方文件编译选项加上-fno-objc-arc -O0
  2. 字典转模型用的是Jastor.
  3. 没有使用 Cocoa Pods,所有框架都是拖进去的。
  4. 所有的网络请求只用了两个方法,一个同步一个异步。
  5. 所有的VC都是用的代码写的,布局用的frame,这点还好一点,上家公司一大片storyboard,新加需求能把人逼疯的那种。
  6. 一个VC的数据模型在一个类中。
  7. 代码不规范,没有用固定的前缀,Deployment Target设置为6.0.当你把target设置为8.0的时候,警告暴增,很多的方法以及过期了。
  8. 目录结构:项目中目录结构还算清晰,文件中的目录都没有,一大片.h和.m文件。

有了上家公司的经验,我有个初步的计划和构想:

  1. 把第三方的库可以把一些替换成Pod管理。
  2. 对于网络层以前用的ASI,如果有新的需求就要用AFN,然后对于AFN进行一些封装,写的网络请求的方法要有successBlock和failureBlock。对于数据转模型用yymodel。
  3. 可以写if debug运行环境的配置代码,来切换测试,预发和正式环境。或者我发现用SwitchHost直接切换环境开发的人比较方便,对于测试的人,就得用Charles或者是fiddler的抓包工具设置代理连到自己的电脑来切换到不同的环境测试。
  4. 打包现在是用Xcode的手工打包可以引入Jenkins来实现自动化打包的模式。这就需要搭建Jenkins服务器和配置到gitlab上面。
  5. Jenkins也可以结合OCLint实现代码的review。
  6. 使用 fir 和 fastlane 实现 iOS 持续集成。实现iOS应用发布流程的自动化
  7. 对于推送可以使用极光推送还有一些统计崩溃率的第三方工具,还有设置埋点来统计APP的功能。
  8. 对于一些登录还有一些公共组件可以抽取成私有的Pod,然后打tag,以便可以共用。
  9. 对于业务方面就是要把数据和业务分离,对于重复出现的tableview可以写基类,然后再进行扩展。
  10. 对于页面的布局要用masonary框架。
  11. 对于一些第三方的框架和组件旧的逐步替换成新的第三方(一直有人维护和更新)的框架。
  12. 当然最最重要的就是把代码进行完善,然后实现业务需求的继续扩张。

当然,上面都是我暂时的目标和想法,还有待去实践和一步步的改造。需要足够的耐心和坚持。

在这期间遇到的一些问题:

错误1:clang error: Linker command failed with exit code 1

解决方法:.m文件被重复编译

好好检查代码,看是不是在.m文件中的引入写成了引入.m文件。
看看是不是有新添加的文件跟之前文件同名
2,错误信息中出现了某个类的名字,去原文件中看看#import了哪些第三方库,把这些库挨个注释排除,找到出错的那个库,然后按照官方提供的步骤重新添加一遍。

解决方法:使用Pod管理的时候

在把引入的第三方库改为Cocoapods管理的时候,遇到Linker command failed。
链接文件没有找到CocoaPods中的文件,

解决方法1:

找到 Build settings->Linking->Other Linker Flags
将此属性修改成-all_load 或者 -ObjC ,这个视情况而定。总之可以多试几次。

解决方法2:

  1. Go to project path and remove Pods folder and Podfile.lock file.
  2. Reinstall pods again using “pod install” command.
  3. Open xcworkspace and clean it before running.

解决方法3:

如果添加的是第三方静态库(.a文件)
这种情况就可能是这个静态库路径混乱导致的链接错误。解决方法:Build settings->Search Path->Library Search Paths 添加静态库的相应路径。

CocoaPods的相关问题

pod install 和 pod update 的区别:

使用 pod install,你只会安装 Podfile 中新改变的东西,并且会:优先遵循 Podfile 里指定的版本信息;其次遵循 Podfile.lock 里指定的版本信息来安装对应的依赖库。比如:下面在 Podfile 里没指定 iRate 的版本,但是 Podfile.lock 里指定了 iRate 的版本是 1.11.1,那么即使现在有最新的 1.11.4,最终也会安装 1.11.1。但是如果 Podfile 里指定了 iRate 版本是 1.11.3,那么则会安装 1.11.3,并更新 Podfile.lock 里的信息。

使用 pod update,你会根据 Podfile 的规则更新所有依赖库,不会理睬现有的 Podfile.lock,而是根据安装依赖库的情况生成新的 Podfile.lock 文件
关于 Podfile.lock 带来的痛

使用CocoaPods开发并打包静态库

用 CocoaPods 集成本地私有库

静态库.a打包成支持64位的

  1. 2015年2月1日不允许不支持arm64的应用的提交;
  2. iOS10发布后,如果你的应用中使用到了32位的类、库,没有相应支持64位机型的库,则首次启动后会弹窗式提示:“ xxx可能使iPhone变慢…”;
  3. iOS10.3公测版发布:封杀32位应用;
  4. 苹果系统(iOS7/iOS8-iOS9),32位的framework和64位的framework是共存的,所以如果所有的应用都是64位的话,系统就自动不加载32位的framework,这样可以少占用资源,另外对运行的速度是有好处的,也就是说,你会感觉手机运行的快了一点。应用在兼容64位系统后,内存的占用肯定会变多一点,不过性能也有相应的提升。

i386是针对intel通用微处理器32位处理器
x86_64是针对x86架构的64位处理器
模拟器32位处理器测试需要i386架构
模拟器64位处理器测试需要x86_64架构
真机32位处理器需要armv7,或者armv7s架构
真机64位处理器需要arm64架构。

iOS armv7, armv7s, arm64区别与应用32位、64位配置

制作方法:一般只要是模拟器一运行就会生成.a的静态库,然后cd到目录下输入lipo -info XXX.a就可以打印出支持的是x86_34,还是什么了,现在一般都要求32位和64位了,如果要是某些项目要在模拟器上运行还要支持i386,所以,可以进行.a静态包的合并。用命令输入lipo -create XX.a XXX.a -output XXXX.a 就可以生成了XXXX.a的静态包。然后导入工程并且在building setting中设置支持arm7,arm7s和arm64即可。

iOS静态库.a 和framework
iOS里的动态库和静态库
64-bit Tips

Xib问题

由于更新手机系统iOS11以及xcode9 beta,然后项目在xcode9运行出现一些错误:Compiling IB documents for earlier than iOS 7 is no longer supported.如截图

解决办法是:Builds for更改版本7之后,我更改成9.0

关于APP一启动就crash

由于更新手机系统iOS11以及xcode9 beta,然后项目在xcode9运行出现_runWithMainScene:transitionContext:completion错误。解决方法在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中的UIWindow必须设置它的rootViewController

文章目录
  1. 1. 错误1:clang error: Linker command failed with exit code 1
    1. 1.1. 解决方法:.m文件被重复编译
    2. 1.2. 解决方法:使用Pod管理的时候
      1. 1.2.1. 解决方法1:
      2. 1.2.2. 解决方法2:
      3. 1.2.3. 解决方法3:
  2. 2. CocoaPods的相关问题
    1. 2.0.1. pod install 和 pod update 的区别:
    2. 2.0.2. 使用CocoaPods开发并打包静态库
    3. 2.0.3. 用 CocoaPods 集成本地私有库
  • 3. 静态库.a打包成支持64位的
  • 4. Xib问题
  • 5. 关于APP一启动就crash
  • ,