在过去七年时间里,我们的团队创建了无数iOS应用。在这个过程中我们不断改善我们的开发流程。把最佳实践应用到我们发布的新应用中。
我们已经准备好了两张核对清单。一个是关于如何开始一个iOS项目,一个是关于如何将应用提交到AppStore。
这些清单的流程使我们团队更高效,构建更好的解决方案,减少开发时间和提交到AppStore的风险。
我希望这些清单对你们同样有用。
####开始一个iOS项目
-
Repo/Github
1 在Github上创建一个仓库,把 iOS gitignore 文件添加进去。
2 严格按照git-flow workflow流程进行开发,master分支用于你的产品发布,dev分支用于保持最新的代码,feature分支用于当前工作进度。
-
Xcode
1 确保团队中的每个人使用同一个版本的Xcode。
2 在Xcode target的”Build Settings”里打开”Analyze during build”和 “Treat Warnings as Errors”选项。
3 关闭tabs并开启空格键: XCode > Preferences > Text Editing > Indentation > Prefer Indent using Spaces, Tab width 2, Indent width 2
-
Jenkins/OSX Server/TestFlight
设置 CI/CD(持续集成/持续部署) 确保每次推送到dev分支的所有测试用例都会执行一遍,同时会构建一个Ad Hoc版本并以邮件形式发送到团队的每个成员(邮件内容是commit的log信息)。如果构建或者测试失败,一封构建失败的邮件也会发给团队成员。在Originate,大部分iOS项目都使用OSX Server集成TestFlight功能。
-
编码风格/规范
1 遵循苹果官方的建议 iOS coding style guide
2 此外,遵循这里的建议:http://qualitycoding.org/preprocessor/
3 保持你的.h文件简洁。只暴露必要的接口给外界,把其他属性、方法、声明等放到.m文件
4 根据当前显示的页面给ViewController命名。(e.g. LoginViewController)
5 使用分组(Group)组织你的项目。好的分组应该是这样的:DataModels,Views,Controllers,App Delegate,Supporting Files,Tools等,混乱的项目结构是不能容忍的。
6 在提交pull request之前,首先过一遍effective code review。
-
框架
1 MVC(Model View Controller)有时候在iOS开发中会被戏称为Massive View Controller。对于初学者而言,把所有事情都交给massive controllers是一个很常见的错误。根据需求,我们应该把tableview相关的delegates/data sources从view controller中抽离成独立的类。把view(尤其是需要复用的)也抽离成单独的类。把controller中用到的工具性方法放到单独的helper类中去。此外,viewController不应该直接进行网路请求的操作,而应该交给Model或者Manager类去处理。
2 一些好的code/tutorials/patterns: Lighter View Controllers, Viper andBrowseOverflow (from the iOS TDD book).
-
Views/Nibs/Storyboards
1 确保在视图中使用constraints/autolayout来适配不同的屏幕。否则只能手动为每个view设置frame sizes/positions来确保不同屏幕都正常显示。PureLayout和FLKAutoLayout已经在我们的一些项目里使用了。
2 考虑要不要使用Nib文件。Originatge建议不要使用,但决定权应该交给Tech Lead。不建议使用Storyboard是因为对于多人开发很不友好,使Xcode变得迟缓,给写代码增加了不必要的复杂度。
3 如果需要的话,使用FrameAccessor来修改frame,这将很容易设置UIView的大小和起始坐标。
-
字体和颜色
对整个app进行字体和颜色标准化,这样就很容易维护和修改它们,并且可以使代码看起来更整洁。
-
文字显示
1 所有显示到界面的字符串都要放到一个本地化文件(localization file)中。
2 避免使用包含文本的image assets,使用UILabel替换之。
-
分析
http://replay.io/ 是我们在Originate使用的分析平台
-
崩溃报告
尽管苹果官方的iTunes Connect已经提供了相关功能,但是最好还是使用第三方的工具比如Crashlytics。它们很高效并且有一个更友好的界面。
-
如果需要,增加 AOP的支持(e.g. for logging)。
-
第三方代码依赖
Cocoapods是个不错的选择。
-
服务器通信
1 在应用的设置中增加toggle between server environments (e.g. QA, dev, staging, etc.)
2 如果需要,实现一个app更新通知系统,这样服务器可以通知app有一个新的可用版本,app可以给用户展示相关更新提醒。
3 在向服务器请求数据的时候,确保使用一个等待提示控件。我们在开发的时候用到了MRProgress。
4 在网络请求中应该使用AFNetworking或者RestKit(if Core Data is needed)。网络优化/配置请看这篇博客:AFNetworking cache
5 调试工程中,确保所有服务器信息都打印到控制台
注意:使用 DLog 来打印所有的请求和响应(in debug mode)
- #ifdef DEBUG
- #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
- #else
- #define DLog(...);
- #endif
-
完善细节
细节的调整对于app来说是至关重要的。比如增加一些用户特别期待的特性比如:下拉刷新,点击状态栏滑到开头,请求数据的时候显示等待提示框等使你的app更友好。你的设计团队和产品团队应该有一个很高的水准。iOS Human Interface Guidelines是一个不错的参考。
最后,在开始之前,确保创建必须的账号(e.g. iTunes Connect, Urban Airship, Analytics Accounts, etc.)
####提交app到AppStore
发布app到AppStore不容忽视。我们必须按照苹果官方的指南一步一步进行以确保你的app能够顺利发布到AppStore。我们需要花费4~8个小时来执行这些步骤。
当你的app已经准备好了,按照下面步骤:
-
Apple Guidelines
1 为了高标准,苹果官方在App Distribution Guide提出了与App testing, Ad Hoc distribution, and App Store release相关的方方面面的要求。我们应该仔细阅读。
2 当然,更重要的是这些文档我们应该熟记于心App Store Review Guidelines Common App Rejections
注意:我们发现开发者们经常忘记添加content flaging到那些创建用户生成数据的app中。苹果会拒绝这样的app,直到你把content flaging添加进去。
- Core Data
如果你的app中使用了CoreData,当你提交一个更新版本时,你必须确保写了一个迁移脚本来完成你的数据库升级。如果没有这样做,你的app在升级之后很可能会崩溃,用户只能删掉之后重新安装。请参考Core Data Model Versioning and Data Migration
- App评论窗口
当你想让你的应用程序被用户评论,UAAppReviewManager可以确保使你的app在合适的时间被用户评论。
- 发布方案
在Xcode的”Edit Scheme”选项,“Archive”应该设置成“Release”。这样可以隐藏log输出并关掉所有在开发阶段的测试用例
注意:由于编译器的优化设置,发布构建有时候与调试构建会有所不同。所以最好在发布到AppStore前几天就开始测试发布构建来捕获一些潜在的问题。
- 服务器
请将你的发布版本构建在生产服务器上
- 发布候选配置 Ad Hoc builds / App Store build
确保使用正确的Bundle Identifier, Apple ID, certificates (e.g. Push Certificates)等作为发布的候选配置和AppStore构建。
-
检查Release版的候选配置
1 确保你的app与正确的生产服务器进行通信。
2 确保所有的测试窗口是隐藏的
3 确保没有敏感数据打印到控制台
4 确保第三方分析工具比如Analytics工作在正确的生产账号上。
5 确保第三方服务比如Urban Airship工作在正确的生产账号上。
-
推送到主分支
1 在app的plist文件更新你的bundle version number。这个数字可以跟你在appStore里设置的版本号不一致,但最好还是设成一样的。
2 推送你的代码到主分支并打上tag。
-
在iTunes Connect上设置你的app
1 在iTunes Connect创建一个新的app,如果是升级的话,选“Add Version”
2 确保填满所有信息并上传所有必要的图片(或者视频)
注意:只有“Description” 和 “What’s New In This Version”可以修改一旦你的app审核通过。其他的选项比如图片是不能修改的。
- 提交
使用Xcode来构建你的最终版本就上传到iTunes Connect。