设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的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 GroupsSlack chat来开始社区之旅吧!他们很乐意回答你的一切问题。你可以浏览那些好的开源项目,看看大牛们是如何组织代码的,自己也学着点。

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

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

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

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

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

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

了解你的工具

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

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

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

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

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

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

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

读一些优质博客和资讯

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

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

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

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

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

NSHipsterPlaygrounds并不是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原型和模板……

下一部分,我将谈一谈在开发自己的app时的必要方法,并且讲一些iOS应用的营销技巧。

在第一部分中,我讨论了学习iOS开发的一些基本问题。第二部分将更多地讨论一些实际问题,这些问题都是你在开发iOS应用时会遇到的。

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的一款行为驱动的开发框架。它由RSpecSpectaGinkgo开发。与Quick并肩战斗的是Nimble——一款为测试服务的匹配框架。

我尝试在本文中讲尽量多的技术问题。跳入iOS开发的大坑之后,你就能用得到上我说的这些东西了。关于iOS开发需要说的实在太多,所以在这儿我没有谈到营销之类的话题。如果你想看的话,那就等我的下一篇文章吧!

iOS开发学习概述及知识整理的更多相关文章

  1. ios开发 学习积累20161027~20161031

    前言 学习ios这几天来,总结下,函数的定义,调用.跟其他语言都有一定的区别: 几个特别重要的就是对象的迭代的使用和判断.取随机数.动画的实现及数组的深入研究等等 之前的总结地址 ios开发 学习积累 ...

  2. iOS开发学习路径的一些建议

    结合自己情况聊下iOS学习建议,这里不讲大道理,说说具体怎么做.欢迎大家拍砖. 1.第一点要求 ,能比较顺畅的阅读官方的文档 如果你连官方的文档读起来都非常困难,那你还谈什么提高和进阶,咱们学习iOS ...

  3. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  4. iOS开发学习 阶段过程简述

    下面就简单介绍一下我iOS开发的感受,也是学习iOS开发的一个体系架构. 1 iOS开发环境 1.1 开发环境 标准的配置是Mac OS X + Xcode. MacOSX的话首选用苹果电脑,macm ...

  5. iOS开发使用半透明模糊效果方法整理

    虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开 ...

  6. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  7. iOS开发学习路线图

    很多初学iOS开发的人会经常问:“我想学iOS应该从何入手呢?”.作为一个做了2年多各种iOS开发的程序员,只想写写自己的一些心得体会,好和体验与不好的体验.写的不好,请多包涵.希望能起到抛砖引玉的作 ...

  8. [转]iOS开发使用半透明模糊效果方法整理

    转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...

  9. ios开发 学习积累20161024~20161026

    打算转ios开发工程师的岗位 今天看了下视频,自己吭呲吭呲几下开始写UI 先把Xcode8 的界面总结下 navigator ['nævɪɡetɚ] 导航器.浏览器 symbol navigator  ...

随机推荐

  1. 准循环LDPC码用于公钥密码时的奇偶校验矩阵

    设H为奇偶校验矩阵,其行权重为d.Q为转置矩阵,其行权重为m.对于LDPC码,有d/n<< 1, m/n< 1. H´=H·QT是用于公钥密码的奇偶校验矩阵.它不是老密码G的奇偶校验 ...

  2. SQLite 事务

    SQLite数据库是支持事务的,事务的特性可以保证让一系列的操作要么全部完成要么一个都不会完成. 一.调用SQLDatabase的beginTransaction()开起一个事务,当事务处理完成,调用 ...

  3. HTML5部分新标签属性及DOM扩展元素

    HTML5定义了一系列新元素,如新语义标签.智能表单.多媒体标签等. 我们日常讨论的H5其实是一个泛称,它指的是由HTML5 + CSS3 + Javascript等技术组合而成的一个应用开发平台. ...

  4. git 使用 总结

    比较好的教程 http://backlogtool.com/git-guide/cn/intro/intro1_2.html 1.git流程图 2.git 新建仓库 git init git clon ...

  5. select distinct

    select distinct select distinct 用于返回表中唯一不同的值. 语法 select distinct 列名称 from 表名称 使用 distinct 关键字 Studen ...

  6. jQuery 日常工作集中问题

    1.siblings()方法:获得匹配元素中每个元素的同胞(除了自己外的其他同级元素) 导航栏选择效果 点击“华东地区”,其他同级元素灰色背景以及下拉菜单消失,当前元素有灰色背景以及下拉菜单.再次点击 ...

  7. 改善C#程序,提高程序运行效率的50种方法

    改善C#程序,提高程序运行效率的50种方法   转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...

  8. js文件如何最后加载

    总结一下,大概有三种方式 1.最简单粗暴的:将js文件放在最后写 2.window.onload当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而 ...

  9. 关于absolute 和 relative 定位的定义

    absolute的英文意思是绝对的意思,实际上是针对父级元素元素定位,如果父级元素没有position:relative|absolute,则追至再上一个父级元素,直至相对于文档的左上角定位,按照我们 ...

  10. Best Time to Buy and Sell Stock III [LeetCode]

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...