英文原文:Things I wish I had known before starting iOS development—Part 1

设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了。这个界面模仿了Evernote iOS app的风格。

我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用了page view controller和scroll view。在Stack Overflow和Google的帮助下,我用了2天把它完成了。当我把产品给一个同样搞iOS开发的朋友看时,他跟我说,如果我用了这个开源项目的话,一个小时就可以搞定一切。

过去这一年我经历了不少类似的事情,这些事情让我成长,让我能够成为一个更好的iOS开发工程师。我想跟大家分享一下我的经验,希望你们可以不再犯我这些错误,一路平坦走向成功。

重视基础

刚开始学iOS开发的时候,我直接去学习了斯坦福大学的这门课程,非常有用。然而,虽然我从课程中学到了很多,但它并没有教给我多少iOS开发语言的基础知识——当时的iOS开发语言主要是Objective-C。开始写自己的app以后,我发现自己在基础知识方面欠缺很多,这导致我老是弄出来一些bug。

如果你在面向对象编程的语言方面没啥经验的话,我建议你在投身进行iOS开发之前先读一本这方面的经典书籍。我最喜欢的两本是Big Nerd Ranch Guide for Objective-C和Swift的The Apple's Guide。

没错,Ray Wenderlich上的教程和Team Treehouse上的视频课程能教给你很多,但缺少基础知识的程序员就像无源之水、无本之木,总是长久不了的。

良师益友Github

我对这个iOS开源社区绝对是真爱。Github上面有无数的优质项目,如AFNetworking, Restkit、JSQMessages,甚是碉堡。你必须学会在这个社区里乘前人栽树之凉。

遇到问题时,先别一根筋急着苦思冥想或创建自己的库,不如先去GitHub或Google找一下有没有相似问题的解决方法。很有可能某个开发者已经写好了一个符合你需求的开源项目。

通过Facebook Groups或Slack chat来开始社区之旅吧!他们很乐意回答你的一切问题。你可以浏览那些好的开源项目,看看大牛们是如何组织代码的,自己也学着点。

这里是GitHub上一些最优质的iOS资源。

vsouza/awesome-ios:awesome-ios——精选的优质iOS生态系统,包括Objective-C和Swift项目。

matteocrippa/awesome-swift:awesome-swift——收集了很多优质的swift资源。你也可以来贡献自己的力量!

cjwirth/awesome-ios-ui:awesome-ios-ui——优质iOS UI/UX库精选。

如果你想找一些iOS的最佳实践以供自己模仿学习,那请看下面这些。

futurice/ios-good-practices:ios-good-practices——为iOS开发者提供灵感,作者是Futurice的开发者们。

了解你的工具

多数iOS开发者将Xcode作为开发的首选工具。Xcode有很多强大的特性,如Storyboards、Auto Layout,如果学会用这些的话,相信你的开发效率肯定能上一个台阶。出于某些限制,很多开发者会尽力避免使用Storyboards,但我个人认为,Storyboards是快速布局的有力工具。

学习使用Xcode中的快捷键。虽然看上去使用快捷键没节省几秒钟,但“不积小流,无以成江海“,久而久之省下的时间就多了。以上这些都是我亲测有效的手段,它们在提高开发效率方面给了我很大帮助。

  1. 使用Cocoapods来进行依赖管理。你的团队会因此轻松很多。

  2. 在项目早期就学会使用持续整合(continuos integration),这样就可以避免未来可能出现的冗余工作。

  3. 使用Testflight来分发测试版本。在被苹果收购之后,Testflight变得更加简单易用了,每个人都可以通过它来使用iTunes账号进行测试版本的分发。

  4. 在app中整合Crashlytics,这样当app崩溃的时候你就可以获取Crash报告了。

  5. 如果你不想自己弄后端服务器的话,Parse为我们提供了很好的服务。

读一些优质博客和资讯

前文已经介绍了一些很棒的iOS开源社区。很多优质的博客是由经验丰富的iOS开发者撰写的,每周都会有一些精彩的内容呈现。我最喜欢的一些包括:

Cocoa with Love:在本博客中,我将专注于使用和管理用户界面中字符串的最佳实践。这是一个相当...

可能是最好的iOS博客。作者是Matt Galaghar。Matt做事情的方式是大师级的。

iOS Dev Weekly:订阅本博客,轻松获得每周最棒的iOS开发网页精选。由Dave Verwer精选并发布...

严格来说这不算个博客,但它每周都有超级超级棒的内容更新。作者是Dave Verwer。

NSHipster:Playgrounds并不是Swift语言本身的特性,它们其实是很棒的展示……

NSHipster对Objective-C和Cocoa进行拾遗的杂志。它由Mattt Thompson每周更新。

Ray wenderlich:高质量的编程教程:iOS、Android、Mac,还有更多!

Ray Wenderlich的博客(对初学者超有用)

Custom Controls for iOS and OS X - Cocoa Controls:暂无描述

Peter Steinberger:苹果在Xcode 6中增加了对NS_DESIGNATED_INITIALIZER 标志的支持,同时也将其添加到了各种各样的框架中……

Matt Gemmell:基于我的写作项目进行简要更新。它或许会引起一些人的兴趣……

Natasha The Robot:仅仅是又一个WordPress站点

在这些博客中挑选干货,认真阅读,相信你会变成一个更好的iOS开发者。

设计也能变轻松

很多开发者对于iOS的设计方面谈虎色变。我们总是对设计敬而远之,一股脑儿都扔给设计师去做。但其实,只要稍稍努力,你也可以学会设计自己的app。

现在,设计师和开发者之间的界限日益模糊,因为好多成功的iOS独立开发者包揽了所有app设计、开发和营销工作。我将在下一部分谈到营销方面的事。如果你想设计自己的iOS app的话,不妨学一下Sketch这个工具。Sketch专为应用设计和网页设计而生,简单易上手。

Bohemian Coding - Sketch 3Sketch是简单易用的轻量级软件,它强大、灵活而快速。最后……

你可以在网上找到大量的Sketch资源和插件,它们能让你有趣而简单地工作。一旦完成了设计工作,你可以立刻用这个神器将它们整合在一起。

Free mobile & web prototyping for designers - Marvel将草图和设计转化为可交互的Web、iPhone、iPad、Android和Apple Watch原型和模板……

Debugging

毋庸置疑,你在开发应用的过程中一定会遇到很多错误和异常。比如,你会遇到NSInvalidArgumentException,遇到NSInternalInconsistencyException,还会遇到“0xfaded322”这种错误代码。有时候你可以在Stack Overflow或Quora上找到答案,但大部分时候你得自力更生。

Xcode具有断点、视图调试和日志的功能,是debug的不二之选。但毕竟孤掌难鸣,你仍需为它找些得力的帮手。

1.Pony Debugger

square/PonyDebugger:PonyDebugger - 使用Chrome Developer Tools,为你的native iOS应用进行远程网络和数据调试。

square开发了这个强大的开源工具。它是一个远程调试工具,类似于客户端库和网关服务器的结合体。它在web浏览器上使用Chrome Developer Tools,对应用的网络流量和数据存储进行调试。作为一个强大的网络调试器,PonyDebugger允许用户实时查看应用的网络请求。它还有另一个酷酷的功能,就是可以远程调试iOS应用的核心数据栈。

2.Cocoa Lumberjack

CocoaLumberjack:CocoaLumberjack - 快速、简单,强大、灵活。它就是CocoaLumberjack, 一款好用的Mac和iOS日志框架。

CocoaLumberjack,它快速、简单,强大、灵活,是一款好用的Mac和iOS日志框架。如果你想找一款强大的日志工具,希望它具有自定义格式化这样的炫酷功能,那CocoaLumberjack就是你的菜。

3.Reveal App

Reveal:Reveal - iOS应用的runtime视图调试。

虽然视图调试已经被引入iOS,但Reveal无疑在调试的细节方面更加强大。它是收费应用,但绝对物有所值。它有一些非常好用的功能,如Auto Layout Inspection。

4.OHHTTPStubs

AliSoftware/OHHTTPStubs:OHHTTPStubs - 轻松stub你的网络请求。以虚拟网络数据测试你的应用,可自定义响应时间……

OHHTTPStubs库可以轻松stub你的网络请求。它可以帮助你:

  • 使用伪造的网络数据(stubbed from file)测试你的应用,并模拟慢速网络以检查应用在网络不良情况下的表现。

  • 从设备中获得伪造的网络数据,用于写单元测试

数据存储

可能大多数应用都需要将各种任务的数据存储在本地。数据存储是一个复杂的话题。它有很多选择,每个选择都对应一种情况。但我很喜欢Stack Overflow上的一种法则,用它来选择数据存储方式就很不错。

  • 若数据完全匹配内存且相对非结构化,则使用plist

  • 若数据完全匹配内存且具有树状结构,则使用XML

  • 若数据与内存不匹配且具有图形结构,同时应用不需要额外的查询能力,则使用Core Data

  • 如果数据与内存不匹配且具有复杂结构,或应用需要关系数据库提供的强查询能力,则使用sqlite

  • 如果数据必须保密(例如密码),则使用keychain。

下面列了一些数据存储方面的库,或许对大家有帮助。

FMDB

ccgus/fmdb:fmdb - 围绕SQLite建立的Cocoa / Objective-C的wrapper

如果你在项目中使用SQLite,此wrapper库会使你的工作变简单。

SSFKeychain

soffes/sskeychain:sskeychain - 简单的Objective-C wrapper,Mac和iOS上的keychain可以使用

要在应用中存储敏感数据,你必须时刻使用keychain。这个库可以简化使用keychain数据存储的过程。

Magical Record

MagicalRecord - 轻松管理Core Data

Core data非常难于管理。而这个库可以让你舒爽地管理Core Data。

网络

要想让应用更有趣,你免不了要接入一些API。虽然iOS在对网络的支持方面表现良好,譬如它拥有NSURLSession、NSURLConnection和NSJSONSerialization,但我还是推荐你使用下面的库。

AFNetworking

AFNetworking:AFNetworking - 令人拍案叫绝的iOS和OS X网络框架。

我认为这是有史以来最好的iOS库之一,它的功能何止炫酷二字。但这些功能中最重要的或许是开发者社区,他们每天都在使用这个库,并为AFNetworking做出贡献。一些iPhone、iPad和Mac上最火的应用都是由AFNetworking提供的支持。

Restkit

RestKit/RestKit:RestKit是在iOS和OS X上使用和构建RESTful web资源的框架。

Restkit具有精心设计的API,访问和构建RESTful资源的过程如沐春风。如果你用core data进行数据存储、用rest service进行数据读取,那你的最佳选择就是它——与Core Data完美集成的Restkit。

Alamofire

Alamofire/Alamofire:Alamofire - Swift下精致的HTTP Networking。

哟哟切克闹,Swift粉们不要闹,煎饼果子来一套。下面就是为你们准备的东西了。Alamofire是一个精致的网络库,它具有一些Swift专享的强大功能。

你也可以在这里找到很多其他的库。

vsouza/awesome-ios

awesome-ios——精选的优质iOS生态系统,包括Objective-C和Swift项目。

依赖管理

我在前面的文章中提到过依赖管理,但重要的问题要说两遍!在这里我还要给它细细讲一发。在项目中,你主要有三种管理依赖的方式。

CocoaPods

CocoaPods.org:iOS和Mac项目的依赖管理器。

CocoaPods是Swift和Objective-C Cocoa项目的依赖管理器。它拥有将近一万个库,可以帮助你轻松扩大项目规模。要想管理Ruby Gems这种依赖,实践中最有效的方法就是它了。

谷歌开发者做了一个YouTube视频,解释了为什么要在你的项目中使用CocoaPods。小心笑尿。

点此观看视频:Route 85: An Introduction to CocoaPods

Github Submodules

你还可以使用git submodules,在项目中以sub repos形式管理依赖。子模块相对于Cocoapods的优势在于子模块也是sub-repos——这不仅是指git和git GUIs逐渐认可并更加支持它们,也意味着你的依赖可以将git repos和广阔的世界连接起来,而CocoaPods却不能。

但git submodules也有自己的问题:项目中没有那些你所依赖的代码的来源。它只是指向了子模块库。而大多数时间你根本不会去管这个库。

Carthage

Carthage/Carthage:Carthage - 简单、去中心化的Cocoa依赖管理器。

Carthage旨在为Cocoa应用提供最简单的框架添加方式。Carthage使用xcodebuild建立framework binaries,把整合工作留给了用户。CocoaPods的方法更简单易用,而Carthage的方法更灵活温和。

不幸的是,Carthage也有一个巨大缺陷——仅支持iOS 8及以上版本

测试

大多数人一提到应用测试就会呵欠连连。但如果没有测试的话,说不巧哪天你的应用就突然崩溃了。发布应用时,你一定得先进行深度测试,保证用户得到最佳体验。

这里有很多测试框架,它们可以简化测试工作。

XCTest

XCTest是一个单元测试框架,包含在Xcode中。它支持把单元测试作为项目编译过程的一部分。XCTest与XCode高度整合,因此提供了持续整合支持和覆盖率测试这样的功能。

KIF

kif-framework/KIF:KIF - Keep It Functional - iOS功能测试框架

KIF是Keep It Functional的缩写。它由Square开源,是一款iOS一体化测试框架。它利用其可访问性——即系统让访问不能显示的应用成为可能,轻松实现了iOS应用的自动化。

Kiwi

kiwi-bdd/Kiwi:Kiwi - BDD for iOS

Kiwi是iOS开发的Behavior Driven Development库。其目标是提供一个安装和使用都非常简单的BDD库。

Quick

Quick/Quick:Quick - Swift (以及Objective-C)的测试框架。

Quick是Swift和Objective-C的一款行为驱动的开发框架。它由RSpec、Specta和Ginkgo开发。与Quick并肩战斗的是Nimble——一款为测试服务的匹配框架。

学习iOS开发前要知道的事儿相关推荐

  1. 那些在学习iOS开发前就应该知道的事

    原文请看:http://www.cocoachina.com/ios/20150608/12052.html 那些在学习iOS开发前就应该知道的事 2015-06-08 09:14 编辑:suilin ...

  2. 那些在学习iOS开发前就应该知道的事(part 1)

    2019独角兽企业重金招聘Python工程师标准>>> 英文原文:Things I wish I had known before starting iOS development- ...

  3. 学习IOS开发第一天——必备工具书和开发工具

    前言:今天是准备系统学习IOS开发的第一天,特地记录一下,因为最近要忙的东西实在太多了,白天几乎没时间看,当然,我现在从事的是.net开发,也不会允许我去看,再者背两台电脑上班也忒累了,所以就只好利用 ...

  4. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  5. [翻译] 学习iOS开发的建议:如何从菜鸟到专家

    [文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑, ...

  6. 学习IOS 开发需要什么?

    学习IOS 开发需要什么? IOS是网络配置系统,是一个网际互联优化的复杂操作系统,他是一个硬件分离的软件体系机构,IOS提供的体系结构能使机构灵活地应用变化和经济有效地进行扩展以满足新的需求.在新的 ...

  7. 零基础如何学习 iOS 开发?

    我创建了一个 CS193P - SwiftUI 和 iOS 开发的学习群组,有兴趣可以加入,群内学习者以北美为主,因此聊天请使用英语,谢谢.加入 Slack 群组 正文: 建议从 SwiftUI 开始 ...

  8. 零基础学习 iOS 开发

    作者:匿名用户 链接:https://www.zhihu.com/question/22000647/answer/114700565 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  9. 随笔分类 - 零基础学习iOS开发

    随笔分类 - 零基础学习iOS开发 不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍 ...

最新文章

  1. SAP PM 初级系列7 - 定义工厂区域
  2. 网站颜色搭配的好网站。
  3. iOS 录音功能的实现
  4. labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现
  5. Spark报错: IOException: Bad connect ack with firstBadlink as xxx:500010
  6. 听力技巧-真题代练及填空题
  7. 审查元素找不到创建的元素_面试被问:Selenium元素定位不到问题,如何回答?...
  8. 2017.4.5 java中static关键字
  9. 已解决-Excel选择多个单元格,只有计数,没有合计和平均值
  10. 泛泰A870刷4.4专用英文版非触摸CWM Recovery 6.0.4.8(三版通刷)
  11. 【已解决】瞎设置代理服务器后IE浏览器上不了网
  12. 服务器的server2016系统怎么装,windowsserver2016安装桌面教程
  13. VIM 参 考 手 册
  14. 读《企业IT架构转型之道》
  15. 1230_SCons对于依赖的处理
  16. AutoSAR系列讲解(入门篇)5.1-方法论概述
  17. 关于一个读取xml文件的问题和解决
  18. C语言通讯录的制作【数据结构】【课程设计】
  19. python中rouge是什么程序_rouge与pyrouge使用事项
  20. 基于embedded.mobileprovision描述文件查看iOS苹果证书到期时间三种方案

热门文章

  1. 连续六天: 2020 Google 开发者大会官网集结!
  2. macos从10.12.6升级到10.15.7
  3. Hadoop集群搭建的总结
  4. android image 位移动画_「translateanimation」Android 补间动画之平移动画TranslateAnimation - seo实验室...
  5. 「 swift 」UIColor 加载十六进制颜色,标准写法带透明度
  6. WireShark实战笔记之DNS协议分析
  7. 医院营销策划应该如何进行情感诉求设计
  8. C/C++内存问题检查利器—Purify (四)
  9. 【DETR用于3D目标检测】DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries
  10. Java中Path环境变量的设置