图书前言

序    言

从2008年iPhone SDK(现在叫iOS SDK)的第一个测试版发布之日起,我就一直从事有关iOS的开发工作。那时我主要关注有关Mac桌面程序的开发,没有过多考虑移动应用的开发。

如果你希望成为一个早期开发者,那你只能靠自己了。苹果公司一贯的做法就是文档非常少,并且由于访问SDK需要NDA——秘密解码环,因此最初你只能靠自己。你还不能在Google上或打开StackOverflow寻求到帮助,并且那时也一定没有任何介绍SDK的书籍。

从苹果发布最初的iPhone到现在已经走过漫漫8年时光(是的,真的只有8年)。iPhone SDK现在也被称为iOS SDK。有关iOS开发的书籍和博客,以及播客和研讨会层出不穷。从2009年起,WWDC大会变得更加难以参加,使得新老开发者在学习最新的平台技术时变得越发困难。尤其对于iOS开发者,要学的新东西真的太多了。

作为一名iOS开发者,我遇到的最大的难题就是设法驾驭苹果工具箱(kit)中所有的组件和框架。iOS HIG本能帮助到我们,不过它对于组件和框架的介绍还不够详细深入。现在我们确实能够通过Google或者结合StackOverflow找到资料,不过这些资料一般都仅解释了如何去做,很少探究为什么要那样做,通常也无法做到很详细地分析。

所以Kyle和Joe决定这样做——给出所有这些框架的详细介绍,让读者可以全面了解组成iOS SDK的核心框架。

很荣幸与Kyle和Joe相识多年。他们是我所见过的最聪明的开发者。这些年来他们都各自编写了大量优秀的应用,并通过分享他们的经验为iOS开发社区不断贡献自己的力量,不断在研讨会上发表出色演讲,出版有关iOS开发的书籍。如果你有任何关于iOS的问题,有机会得到Kyle和Joe的解答将会是一件很美妙的事情。

不过让他们如此优秀的原因还不仅是他们如百科全书一般的iOS开发知识,更在于他们愿意同遇到的每个人分享这些宝贵的知识。Kyle和Joe没有竞争对手,有的只是朋友。

Kyle和Joe对于iOS SDK的深入理解贯穿本书,这也是我喜欢本书的原因之一。本书对每个组件都进行了详细介绍,有些内容甚至在网上都很难找到。

我还非常喜欢本书的结构。读者不需要从头到尾阅读。相反,你可能因为需要了解如何实现集合视图而翻开本书,或者在想学习如何在后台线程上运行任务时打开本书。在你需要本书时只需打开它,找到解决办法,将其在自己的代码中实现,然后再把它放回书架上直到下次再遇到困难。这就是该书能够成为iOS开发者最重要的一本参考书籍的原因,不管你是初学者还是经验丰富的老手。你可能觉得自己精通Core Location和MapKit,不过我觉得你在本书中一定能找到以前没有接触过的知识。

Kyle和Joe为人非常谦虚,从不骄傲自大。他们从来不认为自己比其他开发者优秀。他们将这种精神一点点灌输到Mac和iOS开发者社区,使其成为一个开发者之间互助学习的大平台,对这个行业的发展帮助很大。这本著作也是他们无私分享多年经验和知识的另一个见证。

本书同Mark和LaMarche及Sadun的著作一样,将始终伴随在我手边。当我在2008年第一次开始做iOS开发时我多希望有这么一本书。现在终于如愿以偿,有了这本书就方便多了。

— Kirby Turner

White Peak Software公司首席程序员,Learning iPad Programming: A Hands-On Guide to Building iPad Apps, Second Edition(Addison-Wesley Professional)一书的作者,Cocoa开发者社区的管理者和研讨会的热衷者。

前    言

欢迎阅读《精通iOS框架(第2版)》!

对于现在的读者来说,几乎有上百种“iOS入门教程”可供选择,介绍特定专题的进阶教程也数不胜数,例如专门介绍Core Data知识或者专门介绍有关数据安全方面的教程。不过令人感到困惑的是还没有一种书能够作为初学者向更高级内容前进的桥梁。

撰写本书旨在向读者介绍中高级的开发知识,因为这些看起来零散的框架很多都无法单独出书。并不是这些框架不够吸引人,而是因为它们还不能算是一个很大的专题,不需要过多篇幅的介绍。从如何使用JSON到如何访问照片库,这些框架都是专业iOS开发者每天都会用到的,不过市面上少有书籍介绍它们。

此外,对很多进阶内容的讨论也要考虑到面对的读者可能是初学者。翻开一本500页的Core Data教程也是需要勇气的,不过还好本书第15章给出了一个简捷的Core Data入门教程。其他有关类似的入门教程还包括调试和工具、TextKit、HomeKit、HealthKit和CloudKit等章节。

对于Game Center排行榜和成就榜、AirPrint、音乐库、地址簿和Passbook的内容则给出详细全面的讲解。无论你是刚刚完成第一个iOS项目开发的初学者还是一名经验丰富的资深开发人员,都可以从本书中找到对你有帮助的内容。

书中所有章节的内容都根据iOS 8版本进行了更新。如果你遇到有关兼容性的问题请联系我们,我们会发布更新并进行修改。

如果你对本书的内容有任何建议,或者发现并修改了本书的一些错误,它们都对本书后续版本有很大的帮助,可以通过mastering.ios.frameworks@gmail.com联系我们。我们非常愿意听取任何能使本书变得更加完善的建议,并会不断致力于让本书更加完美。

需要具备的知识

本书尽力让所有的示例程序和知识讲解更加简单易懂,不过它毕竟还是一本针对中高级开发者的参考书。所以为了更好地使用这本书,你需要具备基本的iOS开发知识,以及Objective-C和C语言的知识,熟悉Xcode、Developer Portal、iTunes Connect和Instruments工具的使用。学习Objective-C和iOS的内容时可以参阅Stephen G. Kochan撰写的Programming in Objective-C一书和Maurice Sharp、Rod Strougo及Erica Sadun共同撰写的Learning iOS Development一书。

准备工作

虽然可以借助iOS模拟器开发并测试iOS应用,不过我们还是建议你至少拥有一款iOS设备用于测试:

● Apple iOS Developer Account:iOS开发工具Xcode和iOS SDK的最新版本可以从苹果公司网站上的Developer Portal进行下载(http://developer.apple.com/ios)。要在App Store上发布应用或者在一台个人设备上安装并测试应用,需要支付每年99美元的开发者账号费用。

● Macintosh Computer:要开发iOS程序并运行Xcode,你需要一台能够运行最新发布的OS X系统的Mac机器。

● Internet Connection:iOS开发中的很多功能都需要你的Mac机器和iOS设备保持网络连接。

本书结构

除了个别章节(Game Center和Core Data)之外,本书的每一章都是独立的。你可以按照顺序从头到尾阅读本书,也可以跳过一些你暂时不需要的专题而直接找到你需要的内容,我们撰写本书的目的就是使其成为一种能够解决大部分iOS开发任务的快捷参考书。

下面是各章简介:

第1章“UIKit Dynamics”:iOS 7增加了UI Kit Dynamics元素,可以让UIView添加模拟物理运动的动画效果。你会学到如何给对象添加标准的动态动画效果、设置物理属性等功能。从重力效果到元素属性设置,按照从易到难的顺序介绍7种效果的实现方法。

第2章“Core Location、MapKit和Geofencing框架”:iOS 6带来了全新的苹果地图和相关数据。该章会介绍如何通过使用Core Location来确定设备的位置,如何在应用中显示地图,以及如何在地图上使用自定义标注、覆盖和弹出气泡。还会介绍如何设置地理监控区域(地理围栏),当设备进入或离开一个区域时设备会有提醒。

第3章“排行榜”:Game Center排行榜提供了一种非常简单的方式让你的iOS游戏或应用增加社交元素。该章会带来一个名为Whack-a-Cac的iPad游戏,我们为其添加一个排行榜。用户将会学到实现Game Center排行榜的所有步骤,同时也会对如何实现带有自定义界面的排行榜有所了解。

第4章“成就系统”:该章继续使用前几章介绍的Whack-a-Cac游戏。你将学习到如何在这个iPad游戏中实现成就系统。从如何使用iTunes Connect到显示成就进度,该章为你提供了所有快速创建成就系统所需的信息。

第5章“Address Book框架初步”:很多项目现在都将地址簿整合到应用中,Address Book框架是iOS系统最老的几个框架之一。该章你会学到如何使用这个框架,学习如何使用用户选取器、如何访问源地址数据以及如何修改并保存该数据。

第6章“Music Libraries框架”:该章介绍如何在一个自定义应用中访问用户音乐库,包括如何查看具体音乐的信息数据以及如何从专辑中选择并播放一首乐曲。

第7章“实现HealthKit框架”:HealthKit用于实现在应用间共享健康相关信息的功能。该章介绍如何开始使用HealthKit,之后介绍如何访问HealthKit中的数据,以及如何读取和写入不同类型的健康相关数据。

第8章“实现HomeKit框架”:该章介绍如何开始使用HomeKit,它可以让iOS设备同智能家居设备进行通信。其中还对如何设置HomeKit进行了介绍,以及如何发现、开启设备和如何同这些设备进行互动,例如灯、锁或仓库大门的遥控器等。

第9章“JSON的使用和解析”:JSON的全称为JavaScript Object Notation,是一种能够在不同平台和架构间传输数据的轻量级数据传输协议。所以它成为iOS客户端和服务器间传输复杂数据时最常用的协议。该章会介绍如何从一个现有的对象创建JSON以及如何将JSON解析为iOS对象。

第10章“通知机制”:iOS支持两种类型的通知机制,分别是本地通知和远程通知。本地通知主要用于设备没有连接网络的情况;远程通知需要通过网络再经过苹果公司的Push Notification Service服务器推送通知到设备。该章会介绍两种通知机制的差异,并演示如何在一个应用中创建和使用这两种通知机制。

第11章“基于CloudKit的云存储”:CloudKit提供公共的和私人的数据存储模式。该章会介绍基础的CloudKit概念,并通过创建一个应用来演示如何使用CloudKit实现远程存储和同步个人及公共数据的功能。

第12章“extension”:extension机制提供了一种在应用沙盒之外访问应用功能的功能。该章介绍几种不同类型的extension,并演示如何创建一个Today extension和一个Apple Watch extension。

第13章“Handoff”:Handoff是iOS 8和Yosemite最新引进的一种应用延续机制,它可以让用户在不同设备间进行切换,而应用无缝地在设备间进行延续。该章会介绍基础的Handoff机制,并演示根据开发者定义的activity和基于文档的activity实现Handoff功能。

第14章“AirPrint”:AirPrint可以让用户通过无线方式在支持AirPrint的打印机上打印文档和图片,不过该框架属于iOS提供的众多框架中不太常用的。该章介绍如何在应用中快速有效地添加AirPrint打印功能。在该章的最后,你会学习到打印视图、图片、PDF文档甚至渲染HTML文件。

第15章“开始使用Core Data”:该章会介绍如何让应用使用Core Data、如何设置Core Data模型,以及如何在应用中实现最常用的Core Data工具。如果你没有时间钻研那本500页的Core Data参考书,那么该章再适合你不过了。

第16章“使用社交框架整合Twitter和Facebook”:整合社交元素是智能计算的未来,现在公认的做法是希望将所有应用都加入社交元素。该章会教你如何使用Social框架向应用中添加Facebook和Twitter功能。你会学到如何使用内置的整合功能创建新的Twitter和Facebook消息,还会学到如何从服务器获取反馈信息以及如何解析得到的数据。最后介绍如何使用该框架从自定义的用户界面上发送消息。完成该章的学习之后,你会对Social Framework有很深的理解,可以自如地在应用中添加Twitter和Facebook功能。

第17章“后台任务处理”:当应用离开前台运行时能够在后台继续完成某些任务是一个很重要的功能,这个功能在iOS 4版本中被加入进来,并随着时间的推移更加完善。该章会介绍当应用离开前台后是如何在后台运行的,以及如何执行iOS指定的一些特殊后台任务。

第18章“多线程开发的性能”:在主线程执行一些资源占用高的程序时可能会使系统变慢。该章会介绍一些由Grand Central Dispatch机制提供的方法,用于处理由于影响主线程性能表现的复杂并发问题。

第19章“使用Keychain和TouchID保护并访问数据”:保护用户数据的安全性是一件非常重要的事,但有时却被粗心的开发者忽略了。几年前甚至有一家大公司因为使用明文对用户信用卡信息和密码进行存储而被大家批评。该章首选会介绍使用Keychain来保护用户数据,然后将开发涉及的安全性问题作为整体进行详细讲解。通过该章的学习你可以在用户设备上使用Keychain对任何小规模数据类型进行保护,这样用户就可以放心地使用这些数据了。

第20章“处理图片和过滤器”:该章首先介绍一些基础的图片处理技术,之后介绍一些有关如何应用过滤器的高级Core Image技术。示例程序对所有Core Image提供的方法给出了演示,并创建过滤链来实现实时交互功能。

第21章“集合视图”:集合视图是iOS 6中引入的一个功能强大的API,可以让开发者更加灵活地处理可滑动界面的布局以及基于单元格的内容排版。除了新的布局功能之外,集合视图还提供了精彩的动画效果,在集合视图内容的淡入淡出及视图间的切换时都可以添加动画效果。

第22章“TextKit介绍”:iOS 7中引入了TextKit框架,它非常容易上手,是对Core Text非常重要的扩展。TextKit可以让开发者在应用中提供非常丰富且互动性很强的字体格式。虽然TextKit是一个比较大的话题,不过该章会介绍一些基础的知识并实现一些常见的功能,例如从环绕图片添加文字到内嵌自定义字体属性。完成该章的学习之后,其实是为后面更深入地学习TextKit打下非常坚实的基础。

第23章“手势识别”:该章会介绍如何在应用中使用手势识别。同直接处理和解析触碰数据不同的是,手势识别对象可以提供一个简单且干净的方法来识别一些常见的手势动作并给予反馈。此外,还可以自定义手势并使用手势识别对象对其进行识别。

第24章“访问照片库”:现在iPhone实际上已经成为最流行的照相机,看看Flickr上用户上传的大量图片就可以证明这一点。该章会介绍如何访问用户照片库,并在自定义应用中处理这些照片和视频。示例程序演示了如何创建一个和iOS 8版本的Photos.app类似概念的应用。

第25章“Passbook和PassKit”:iOS 6中苹果公司引入了Passbook,它是一个独立的应用,用于保存用户的各种“卡”,或者诸如飞机票、优惠券、会员卡和演唱会门票等凭证。该章会介绍如何设置通行证,以及如何创建并发布它们,还有如何在应用中同它们进行交互。

第26章“调试和工具”:程序开发最重要的一部分工作就是能够调试和优化软件。很少有书籍会介绍这方面的内容,即使是简单的介绍也很少见。本章为你讲解了在Xcode中如何调试程序以及使用工具分析程序的性能。首先我们讲述了计算机错误的历史,之后逐步介绍了有关一些常见错误的提示和识别方法。然后简单介绍了断点的使用和调试器命令,并使用Time Profiler和Leaks工具分别对程序代码和程序内存的使用情况进行了分析。学习完该章后,你将对如何在模拟器和真机设备上定位程序错误及调试iOS应用打下坚实基础。

示例程序

本书的每个章节都是独立的(除了个别章节),同时除了第26章“调试和工具”之外,所有的章节都具有自己的示例程序。第3章“排行榜”和第4章“成就系统”使用同一个示例项目,基于这个项目演示各自的功能。每章都会对示例程序进行简单的介绍,并逐步让读者理解示例程序中包含的一些复杂内容,而不是直接介绍本章的理论内容。

我们致力于让示例程序简单易懂,所以有些代码可能没有进行很好的优化,可能也不是解决特定问题的最优方法。所以在每章内容中我们都会指出一些在实际创建应用时哪些步骤是不合适的。示例程序不是独立的应用,它主要用于演示相应章节所介绍的功能。本书的示例程序被特意设计为通用程序,所以读者应该关注章节中介绍的主要内容而不是那些同相应章节无关的代码。为将一些非必要的组件从示例程序中删除,我们进行了大量的工作,同时将代码行尽可能压缩。

很多读者看到示例程序中的代码可能会觉得意外,因为没有使用Swift语言,而是用的Objective-C,本书就是这样设计的。因为所有的API都是用Objective-C写的,所以使用Objective-C可以更加容易地进行互动,而使用Swift还需要额外添加解释起来比较复杂的层。如果读者习惯使用Swift后,可以很容易地将概念移植到Swift中。示例程序前缀为“ICF”,大部分示例程序的名字都是章节标题名。

当学习Game Center章节时,bundle ID关联了我们个人苹果账号的真实应用,以确保例子能够继续运行。这个例子还可以让读者学习到当开发者对同一个示例程序进行互动时会生成多个用户数据。对于iCloud、推送通知和Passbook这3章,应用需要的设置都在相应的章节内容中进行了全面介绍,要在实际工作中使用这些程序,读者必须为自己的开发者账户创建一个新的App ID才可以。

获取示例程序

要随时获取最新版本的源代码,可以访问https://github.com/dfsw/icf网站下面的Mastering文件夹,也可以访问http://www.tupwk.com.cn/downpage。这些代码都是面向公众的且是开源的。源代码按照章节分成各自的压缩文件,包含Xcode项目,每个章节都只包含一个项目。我们鼓励读者提供有关源代码的反馈信息并提出建议,这样我们就可以让工作更加严谨,并在本书出版之后不断对其进行改进。

安装并使用GitHub

Git即版本控制系统,多年来深受开发者的喜爱。要使用GitHub上的代码,你首先需要在Mac上安装Git。在Xcode命令行工具安装包中包含一个命令行版本的Git,或者你还可以通过http://git-scm.com/downloads地址找到Git的安装文件。此外,Git还有许多前端GUI形式,甚至有一个就是用GitHub开发的,这样可以更好地帮助开发者了解Git,避免命令行晦涩难懂。如果你不想安装Git,GitHub也允许你以压缩格式下载源文件。

用户可以在https://github.com/signup/free上免费注册GitHub账户。Git安装好之后,在终端程序中输入命令行$git clone git@github.com: dfsw/icf.git就可以将一份源代码的拷贝下载到当前工作目录中。这一版书中用到的示例程序都在Mastering文件夹下。欢迎大家对示例代码提出修改建议。

联系作者

如果关于本书有任何意见或问题,可以通过mastering.ios.frameworks@gmail.com邮箱与我们联系,或者在Twitter上@kylerichter和@jwkeeley。

致谢

要感谢所有为了本书默默在幕后付出的人,如果没有他们就没有这本书,虽然封面上的作者只有两个人的名字,不过这本书是通过大家的帮助才顺利完成的。首先要感谢的是Trina MacDonald,如果不是她的领导才能和对我们的不断督促,我们可能永远无法完成本书的撰写。Pearson的编辑们也给了我们极大的帮助,正是他们的不断努力,从一点小的错误到技术问题都逐页进行勘察,使本书变得更加完美。NiklasSaers、Olivia Basegio、Justin Williams、Sheri Replin、Elaine Wiley、Cheri Clark、ChutiPrasertsith和 Gloria Shurick也为本书的完成做出了贡献。

还要感谢Langille Design 工作室的Jordan Langille,他为我们提供了第3章和第4章Whack-a-Cac游戏的设计方案。正是他的帮助让Game Center示例项目变得更加引人入胜。

不止我们自己为了撰写本书付出了大量的时间,家人和同事同样为此付出了许多时间。我们要感谢身边所有人的付出,让我们能有时间专注于本书的编写。

最后,还要非常感谢开发社区的朋友们。我们经常在开发者论坛上和博客里咨询大家问题,谢谢大家的提问和无私的反馈。如果不是iOS开发社区中大量参与者的努力,本书很可能就无法完成了。