第1章 欢迎来到iOS和Swift世界

开发者为苹果移动设备编写应用可以得到一笔不菲的收入。应用不仅可以改变人们的生活(如图1-1所示),还可以让你有机会结识志同道合的朋友。在学习语言、工具和流程的过程中,难免会遇到一些困难,克服这些困难不但可以让你了解崭新的iOS世界,还可以让你超越平凡,成就自我。

图像说明文字

现在请把我当作与你一同踏上iOS探索之旅的伙伴。我非常荣幸可以通过本书作为起点帮助你走进iOS开发的世界,为iPhone、iPod Touch或iPad开发应用。iOS是一个令人赞叹的平台,自从2007年面世以来发展势头不减。移动设备的快速增长意味着身处各地的人们都在使用着软件,可能是通过手机,也可能是通过穿戴设备,比如Apple Watch。对于刚入门的开发者来说,随着iOS 10、Xcode 8、Swift 3以及最新版本的iOS SDK(Software Development Kit,软件开发工具集)的发布,一切都变得更加令人兴奋,成为开发者也将更加轻松。

1.1 关于本书

本书是一本入门指导,可以帮助你开发出自己的iOS应用,旨在帮助你入门,理解iOS应用程序的运行和构建方式。

在学习的过程中,你将会创建一些简单的应用程序。每个应用程序都会涵盖某些iOS特性,并展示如何使用这些特性。如果你扎实地掌握了书中的基础知识,加上自己的创造力和恒心,再借助条理清晰的苹果公司官方文档来扩大知识面,就可以创建出专业的iPhone和iPad应用。

注意 在整本书中,我优先讲解iPhone和iPad应用开发,因为这两种设备是我们最常用到的。并非有意忽略iPod touch,这样做只是为了方便。

提示 作者为本书创办了一个论坛:http://forum.learncocoa.org。可以在这里遇到志趣相投的伙伴,相互答疑解惑。请务必来看看!

1.2 必备条件

开始编写iOS应用程序之前,你需要做一些准备工作。初学者需要一台基于Intel架构的Macintosh计算机,并安装有Yosemite(OS X 10.10)、El Capitan(OS X 10.11)和Sierra(macOS 10.12)或更高版本的操作系统。任何最近上市的基于Intel架构的Macintosh计算机(台式机或笔记本)均可。当然不只是硬件,软件方面也要做好准备。只要你拥有一个Apple ID,就可以学习如何开发iOS应用程序并获取所需的软件工具。如果你拥有一台iPhone、iPad或iPod,那么你十有八九已经拥有了一个Apple ID,假如你的确没有,可以访问网站https://appleid.apple.com/account来创建一个。用Apple ID再访问https://developer.apple.com/develop这个网址,就会看到与图1-2类似的页面了。

图像说明文字

点击上方的Downloads图标可以进入主要资源页面(见图1-3),其中有当前已发布的产品,有时还能看到当前的iOS测试版本。你可以在这里找到各类文档、视频、样例代码以及所有可以指导你进行iOS应用程序开发的相关资源。请滚动到页面底部并查看前往文档(Documentation)和视频(Videos)相关内容网页的链接。你还可以找到前往苹果开发者论坛的链接,在那里你可以参与所有iOS平台以及macOS、watchOS和tvOS等平台各类相关主题的讨论。注册成为苹果开发者就可以在论坛中畅所欲言。

注意 在2016年的WWDC(全球开发者大会)中,苹果公司将OS X的系统名称改成了之前曾采用的macOS,以符合四个主要操作系统中其他平台的命名风格。

iOS开发中最重要的工具是Xcode,它是苹果公司的IDE(Integrated Development Environment,集成开发环境)。Xcode提供了一些实用工具,用于创建和调试源代码,编译应用程序,以及对应用程序进行性能调优。

可以从图1-3所示的开发者Download页面的Xcode链接中下载当前的Xcode测试版本。如果想用最新的正式版,可以通过Mac的苹果图标菜单访问Mac App Store,从中下载Xcode。

图像说明文字

本书采用的SDK版本以及源代码示例

随着版本的不断更新,SDK和Xcode的下载方式也在发生变化。在最近几年内,苹果已经开始将当前较“稳定”版本的Xcode和iOS SDK放在Mac App Store中,同时在开发者网站上提供预览版供开发者下载。总之,如果想下载Xcode和iOS SDK的最新版本(即非测试版),应该使用Mac App Store。

本书面向当前最新版的Xcode和SDK。我们会在某些地方使用iOS 10中新引入的函数和方法,它们可能会与旧版SDK不兼容。

请务必从http://www.apress.com下载最新的源代码文档。每当有新版SDK发布时,我们会及时更新代码,你可以时常过来看看是否有变化。

1.2.1 选择开发者计划

免费下载的Xcode中包含一个模拟器,通过这个模拟器,就可以在Mac上创建并运行iPhone和iPad应用。这对于学习编写iOS程序极有帮助。不过,模拟器不支持那些需要依赖硬件的特性,比如加速计和摄像头。如果要测试使用了这些特性的应用程序,你需要iPhone、iPod touch或iPad。虽说iOS模拟器可以测试大部分的代码,但不代表所有的应用程序都可以。而且即便在模拟器上可以正常运行的应用,在决定发布出去之前仍然需要在真机上进行完整的测试。

以往版本的Xcode会要求你注册苹果开发者计划(需要付费)才可以在iPhone或其他真机上安装应用程序。但现在不这样了。从Xcode 7开始允许开发者在真机的硬件上测试应用程序,不需要购买苹果开发者计划的会员资格(然而稍微有一些限制,之后我们会再提到)。这意味着在你的iPhone或者iPad上不需要付费就可以运行这本书中大部分的实例项目。但免费下载的SDK不支持把应用程序放到App Store上出售。如果想获取这些功能,需要从以下两个付费的开发者计划中选择一个。

 标准版计划的价格为每年99美元。它提供了大量的开发工具和资源,以及技术支持,还可以通过苹果公司的App Store出售应用。你还可以为iOS、watchOS、tvOS和macOS开发并发布应用程序。

 企业版计划的价格为每年299美元。如果一些公司需要开发只在企业内部使用的iOS应用程序,可以选择这个计划。

想要了解关于这些计划的详细信息,可以访问http://developer.apple.com/programs/(见图1-4)。如果你是一位独立开发者,通常不必购买标准版计划的会员资格。只有以下几种情况例外:你运行的应用程序使用了例如iCloud这种需要付费会员资格的功能,或者你想要在苹果开发者论坛中发帖提问,又或者你打算在App Store上部署自己的应用程序。

图像说明文字

因为iOS支持的移动设备(比如iPhone)经常连接到其他公司的无线网络设施,所以苹果对iOS开发人员的限制比Mac开发人员严格得多(至少目前Mac开发人员完全不需要经过苹果的审查和批准就可以编写并发布程序)。虽然iPod touch和仅支持WiFi的iPad不使用其他公司的无线设施,但是它们也受到同样的限制。

苹果之所以添加这些限制,主要是为了尽量避免发布恶意程序和蹩脚程序,因为这类程序可能会在共享网络中降低性能。开发iOS应用似乎有很高的门槛,不过苹果已经为简化开发过程付出了巨大的努力。值得一提的是,99美元的价格比任何付费版本Visual Studio(微软公司的软件开发IDE)的价格低得多。

1.2.2 必备知识

我们假定本书的读者已经掌握了一些编程的常用知识,尤其是面向对象编程的内容(比如知道类、对象、循环、变量这些概念分别指什么)。不过你也许还不熟悉Swift编程语言。本书的附录会同时介绍Swift和Xcode中全新的Playground(游乐园)特性,便于让你更快地掌握这些知识。阅读完附录的内容后如果还想更多地了解Swift,最佳的方案就是直接浏览苹果公司的官方编程语言参考指南The Swift Programming Language,可以从iBooks商店或者iOS开发者站点下载到,网址是https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_ Programming_Language/index.html。

你还需要以用户的身份来熟悉iOS。为了编写应用程序,你应该知道iPhone、iPad和iPod touch的细微差别以及各自的特点。利用一些时间来熟悉iOS的界面,以及苹果公司的iPhone和iPad上应用程序的视觉效果和使用体验。

一开始接触各种术语可能会让你产生困惑,我在表1-1列出了各个集成开发环境、API以及你所开发的操作系统平台所采用的编程语言之间的关系。

图像说明文字

1.2.3 iOS应用程序的特点

如果从未使用Cocoa写过程序,你可能会发现Cocoa Touch(用于编写iOS应用程序的应用程序框架)比较新奇。它与其他常用应用程序框架(比如用于构建.NET或Java应用程序的框架)之间存在一些根本差异。起初你可能有点不得要领,不过不必担心,只要多加练习,很快就能够对Cocoa Touch运用自如了。

注意 本书将多次提到“框架”。这个术语的意义有些难以限定,根据上下文会有不同的用法。框架是一堆“工具”的集合,其中包括了单个或多个库、脚本、用户界面元素和其他工具的集合。框架的工具通常与一些特定功能有关,比如位置服务会用到的CoreLocation框架。

如果曾经使用Cocoa写过程序,你会发现iOS SDK中有许多熟悉的身影。有很多类都是从Mac OS X版本的Cocoa中原样移植过来的。即便是那些不同的类,也遵循相同的基本原则和相似的设计模式。但是,Cocoa和Cocoa Touch之间还是有一些不同的。

无论你的知识背景如何,都需要时刻牢记iOS开发与桌面应用程序开发之间的重要差异。接下来的几个小节将讨论这些差异。

1 . 通常情况下只能运行一个应用

在iOS中,一次只能有一个应用处于活动状态并显示在屏幕上。从iOS 4开始,用户按下Home键后,应用程序可以在后台继续运行,但这只限于少数情况,而且必须专门为此编写代码(第15章将告诉你如何做到)。从iOS 9开始,苹果公司加入了在同一屏幕上运行两个应用程序的功能,不过需要用户使用较新的iPad。苹果将这个特性称为多任务,第11章会介绍。

不处于活动状态或者在后台运行时,应用程序不会占用任何CPU资源,这会严重干扰其与开放式网络的连接。iOS允许后台处理,不过要使应用程序在此状况下良好运行则需要开发者自己的努力。

2 . 只能使用一个窗口

在台式机和笔记本的操作系统中,多个程序可以同时运行,每个程序还可以创建并控制多个窗口。然而,除非应用程序经过特别编码,并且连接另一个屏幕或者使用AirPlay镜像,否则iOS只允许应用程序操作一个窗口。应用程序与用户的所有交互都在这个窗口中完成,而这个窗口的大小就是iOS设备屏幕的固定大小,除非你启用了多任务功能,在这种情况下你的应用程序需要留出部分屏幕空间以运行其他应用程序。

3 . 为安全起见设置访问权限

通常,用户能够访问的内容,台式机和笔记本上的程序也可以访问。然而,iOS严格限制了应用程序的访问权限。

iOS的文件系统会为每个应用分配一块独立的区域,称为沙盒(sand box)。每个应用只能读写自己沙盒内的文件。沙盒就是应用程序用于存储文档、偏好设置等任何有效数据的地方。

应用程序还会受到其他方面的限制。比如不能通过iOS访问端口号较小的网络,也不能进行在台式机中需要根用户权限或管理员权限的操作。

4 . 有限的响应时间

由于使用方式特殊,iOS需要快速响应各种事件,你的应用程序也应如此。启动应用程序时,要立即打开它,载入偏好设置和数据,并把主视图显示到屏幕上。你的应用应该只有较短的延迟。

注意 我们提到的延迟指的并不是速度。速度和延迟通常可以互换,但意思并不完全等同。延迟指的是执行操作到发生结果之间的等待时间。用户按下Home按钮后,iOS就会返回主屏幕界面,你必须在应用程序退到后台之前尽快保存一切内容。如果没有在5秒之内保存必要的数据并放弃对系统资源的控制,无论是否已经保存好,应用程序进程都会被终止。然而如果你知道如何使用某个API,就可以在应用程序终止前请求多一些时间来完成必要的工作。因此通常情况下,想要快速结束也就意味着要舍弃不重要的信息。

5 . 有限的屏幕尺寸

iPhone的屏幕显示效果非常出色。刚进入市场时,iPhone是当时分辨率最高的手持电子设备。不过,iPhone的显示空间并不大,比现代计算机的屏幕空间要小很多。最初几代iPhone的屏幕分辨率只有320像素×480像素,从iPhone 4的Retina屏幕开始,分辨率增加到了640像素×960像素。目前最大iPhone(即iPhone 6 Plus)的屏幕分辨率达到了1080像素×1920像素。这听起来像是个很平常的数字,不过要记住如此高密度的像素点(苹果公司用术语Retina来表示)被塞入了非常小的单位中,这对于iPhone和iPad上各种应用程序以及交互体验有重大的影响。表1-2列出了在编写本书时iOS 10支持的所有设备的屏幕尺寸。

图像说明文字

硬件尺寸指的是屏幕的实际物理尺寸,以像素为单位。不过在编写软件时只需要注意软件尺寸一栏的数字。如你所见,软件尺寸大都是实际硬件尺寸的一半。这种情况是苹果公司引入第一代Retina设备后开始出现的,其横向与纵向的像素数量都是上一代的两倍。如果苹果公司不做任何处理的话,所有现有的应用程序在新的Retina屏幕上都会只占据一半的尺寸,无法正常使用。因此苹果公司选择将应用程序绘制的所有内容都在内部乘以2,这样不需要作任何代码改动就可以将其铺满新屏幕。所有使用Retina屏幕的设备都采用了内部乘以2的机制,但iPhone 6 Plus有些例外,这是因为它拥有更高精密度的屏幕,需要乘以3。通常来说,你无需担心应用程序实际放大的倍数,只需要根据软件屏幕尺寸进行开发,剩下的事情交给iOS来做就行了。

唯一不适用于这个规则的是位图。由于位图自身的尺寸是固定的,你无法让同一张图片在Retina屏幕和非Retina屏幕上拥有一样好的效果。如果尝试这样做,会看到iOS为Retina屏幕设备将图片放大,从而产生了模糊的感觉。你可以通过为每张图片补充2倍和3倍尺寸的副本来解决这个问题,iOS会根据应用程序运行的设备屏幕来选取合适的那张。

注意 如果仔细观察表1-2,会发现第四列的精密程度就是硬件尺寸除以软件尺寸的比例。比如,iPhone 6的硬件宽度是750像素,软件宽度是375像素,比例是2 : 1。细心一点的读者会发现iPhone 6/6s Plus有些特殊,其硬件宽度与软件宽度的比例是1080/414,也就是2.608 : 1,高度也同样如此。就硬件而言,iPhone 6/6s Plus实际上不是3倍的Retina屏幕,而就软件而言则是3倍大小。这意味着,应用程序使用的软件屏幕尺寸414像素× 736像素会按照规则,首先映射为1242像素×2208像素的实际屏幕尺寸,并最终缩小到适应1080像素×1920像素的实际硬件尺寸。好在你不需要做任何特殊处理,iOS会负责这些细节。

6 . 有限的系统资源

如果说一部至少拥有512MB内存和16GB存储空间的机器资源有限,在十几年前,很多资深程序员恐怕要发笑了,但如今事实确是如此。或许开发iOS应用程序并不像是在内存为48KB的机器上编写复杂的电子表格应用,但是由于iOS具备的图形特性和多种功能,很容易耗光内存。

目前市场上iOS设备的物理内存要么是512MB(iPhone 4s、iPad 2、一代iPad mini、最新的iPod touch),要么是1024MB(iPhone 5c、iPhone 5s、iPhone 6/6s、iPhone 6/6s Plus、iPad Air、iPad Air 2、iPad mini Retina),而且以后还会不断增加。很大一部分内存被用于屏幕缓冲区和其他一些系统进程。一般只有不到一半的内存留给应用程序使用(实际可用内存可能更少,尤其是因为其他应用可能在后台运行)。

虽然这些内存对于小型移动设备来说可能已经足够了,但谈到iOS的内存时,还要考虑另一个因素:现代的计算机操作系统(比如mac OS)会将未使用的内存块写到磁盘的交换文件(swap file)中。这样,当应用程序请求的内存超过计算机的实际可用内存时,它仍然可以正常运行。但是,iOS并不会将易失性内存(比如应用程序数据)写到交换文件中。因此,应用程序的可用内存大小受限于iOS设备中未使用的物理内存空间。

Cocoa Touch提供了一种内置机制,可以在内存不足时通知应用程序。出现这种情况时,应用程序必须释放不必要的内存空间,否则就可能被强制退出。

7 . 一些新功能

前面提到过,Cocoa Touch缺少Cocoa的一些特性,但iOS SDK中也有一些功能是Cocoa目前没有的,至少不是在每一部Mac上都可用。

 iOS SDK中的Core Location框架可以帮助应用程序确定iOS设备的当前地理坐标。

 大部分iOS设备都有内置的摄像头和照片库,SDK允许应用程序访问它们。

 iOS设备还有一个内置的运动传感器,用于检测设备的握持和移动方式。

8 . 与众不同的交互方法

iOS设备没有物理键盘和鼠标,这意味着iOS应用与用户的交互方式跟通用计算机完全不同。幸好,大部分交互都由iOS系统替你完成。例如,如果应用中用到了文本框,iOS系统就会在用户单击这个文本框时调出软键盘,不需要开发者为此额外编写代码。

注意 所有iOS的设备都支持通过蓝牙连接外置键盘,这提供了一种不错的键盘体验,并且节省了屏幕空间。不过现在依然无法连接鼠标。

1.3 本书内容

在第一次开始编写iOS(那时还叫iPhone OS)应用程序的时候,本书作者用的是这本书基于Objective-C语言的最早那一版。而现在我自认已经是一个非常优秀的应用开发者了,并通过我的作品获得了一些收入。因此我真心希望能让这本最新也是最棒的一版书帮助你获取不亚于作者的成就。以下是本书所涵盖的内容。

 第2章:讲述如何使用Xcode的UI开发者工具Interface Builder创建简单的界面,并在屏幕上显示文本。

 第3章:展示与用户的交互,构建一个简单的应用程序,用于在运行时根据用户按下的按钮动态更新显示的文本。

 第4章:以第3章为基础,介绍更多的标准iOS用户界面控件。此外,还将介绍如何使用警告视图和操作表单提醒用户作出决策,或者通知用户发生了一些异常事件。

 第5章:解释如何处理自动旋转和自动改变大小属性,以及使iOS应用程序同时支持纵向和横向运行的机制。

 第6章:分析更多高级用户界面,并讲述如何创建多视图应用程序。还会介绍如何在运行时改变展示给用户的视图,从而创造出更强大的应用。

 第7章:讨论如何实现分页栏和选取器等界面元素,它们是标准iOS用户界面的一部分。

 第8章:介绍表视图。表视图是向用户提供数据列表的主要方法,并且是基于分层导航的应用程序的基础。这一章还会介绍如何让用户搜索应用程序数据。

 第9章:说明如何实现层级列表这一标准的界面类型。层级列表是最常用的iOS应用程序界面之一,可以通过它查看更多详细的数据。

 第10章:展示集合视图的使用。从一开始,各种iOS应用程序就使用了表视图来展示动态、垂直滚动的组件列表。最近,苹果引入了UICollectionView类,用于实现集合视图。集合视图在展示动态、垂直滚动的组件列表方面功能更加强大。使用集合视图,开发者可以更灵活地处理视觉组件的布局。

 第11章:展示如何构建master-detail应用程序。它展示了一个列表(例如收件箱中的邮件),能让用户任意浏览某一项的详细信息。你将看到如何使用iOS控件来完成这一工作。这个功能原先是为iPad设计的,现在也可以用在iPhone上。

 第12章:展示如何实现应用程序设置。iOS中的这种机制允许用户设置应用程序级的偏好设置。

 第13章:介绍iOS中的数据管理,讨论如何创建对象来保存应用程序数据,以及如何将这些数据持久化到iOS文件系统中。这一章还会介绍使用Core Data的基础知识,使用Core Data可以很方便地保存和检索数据。不过要更深入地学习Core Data,建议参考Michael Privat和Robert Warner编写的Pro iOS Persistence Using Core Data。

 第14章:解释如何使用iCloud。iCloud是iOS 5引入的一项功能,可以将文档数据保存到iCloud中,这样就能在不同设备之间同步应用数据。

 第15章:iOS开发人员可以使用一个强大的库来简化多线程开发,名为Grand Central Dispatch(GCD)。这一章将介绍Grand Central Dispatch,并展示在特定情况下如何使用iOS的特性让应用程序在后台运行。

 第16章:人们都喜欢画画,这一章介绍自定义绘图。我们将为你讲解Core Graphics的绘图机制。

 第17章:在iOS 7中,苹果引入了一个叫作Sprite Kit的新框架,用来创建2D游戏。它包含物理引擎和动画系统,也可以用来创建OS X系统上的游戏。在第17章中,你将会看到如何使用Sprite Kit创建一个简单的游戏。

 第18章:iOS设备的多点触摸屏幕可以接受用户的各种手势输入。这一章讲述如何检测基本的手势,如双指捏合和单指滑动。

 第19章:iOS可以通过Core Location确定设备所处的纬度和经度。本章会编写一些使用Core Location的代码,用于计算设备所在位置,并且使用位置信息来实现我们让世界连通的理想。

 第20章:讨论如何与iOS的加速计和陀螺仪进行交互。通过它们可以确定设备的握持方式、运动速度,以及移动方向和设备所在位置。

 第21章:每台iOS设备都有自己的摄像头和照片库,获得用户允许之后,你的应用程序就可以访问摄像头和照片库。这一章介绍如何在自己的应用程序中使用它们。

 第22章:iOS设备现已遍及90多个国家。本章会介绍如何把应用的各个部分恰当地翻译为其他语言,从而有助于发掘应用的潜在用户。

 附录:最后讲解Swift编程语言,将介绍其当前状态,并涵盖了理解本书示例代码所需的所有特性。

1.3.1 新版增加内容

自本书第1版上市以来,iOS开发社区取得了巨大发展。苹果不断更新SDK,使其不断发展完善。iOS 10和Xcode 8都增加了许多新的功能。我竭尽全力更新了本书内容,涵盖了开始编写iOS应用程序时需要注意的新技术。

1.3.2 Swift和Xcode版本

虽然Swift面世已经超过两年,但它始终在不断变化,并将在一段时间内都是如此。值得注意的是,苹果公司保证,对于现在编写的应用程序,其通过编译后的二进制文件能够在将来版本的iOS上运行,但是没有保证其源代码依然能正常编译。因此,本书出版时的最新版Xcode上可以编译并正常运行的样例代码,也许无法在你读到此书时还能正常运行。Xcode 6.0发布时开始支持Swift第1版,Xcode 6.3开始支持Swift 1.2版本,Xcode 7则加入了对Swift 2的支持。本书中的代码是使用Swift 3编写的,并在测试版Xcode 8上进行过测试。

如果你发现同样的代码无法在当前使用的Xcode版本中编译,那么请浏览本书在Apress.com的页面(http://www.apress.com/cn/book/9781484222225#)并下载最新的源代码。如果仍然有问题,请在Apress.com提交勘误以提醒我注意 。

1.3.3 准备好了吗

iOS是一个不可思议的计算平台,是令人兴奋的新领域,让开发充满乐趣。和其他平台相比,编写iOS程序将成为一种全新的体验。所有看似熟悉的功能都具有其独特之处,但只要深入理解本书中的代码,就能把这些概念紧密联系起来,融会贯通。

应该谨记,完成本书中的所有练习并不能立即成为iOS开发专家。在进行下一个项目之前,请确保你已经完全理解了当前的内容。不要害怕修改代码,熟悉Cocoa Touch这种编程环境的最佳方法就是不断试验并观察结果。

如果你已经安装了iOS SDK,请继续阅读本书;如果还没有,请立即安装。明白了吗?好,那就开始动手吧!

目录

  • 致谢
  • 译者序
  • 第1章 欢迎来到iOS和Swift世界
  • 第2章 创建第一个App
  • 第3章 基本的用户交互
  • 第4章 更丰富的用户界面
  • 第5章 自动旋转
  • 第6章 创建多视图应用
  • 第7章 分页栏与选取器
  • 第8章 表视图简介
  • 第9章 表视图中的导航控制器
  • 第10章 集合视图
  • 第11章 iPad应用中的分割视图和浮动窗口
  • 第12章 应用设置和用户默认设置
  • 第13章 数据持久化基础知识
  • 第14章 文档和iCloud
  • 第15章 用Grand Central Dispatch进行多线程编程
  • 第16章 图形与绘制
  • 第17章 SpriteKit制作简单游戏
  • 第18章 轻点、触摸和手势
  • 第19章 确定位置
  • 第20章 设备方向与动作
  • 第21章 摄像头和照片图库
  • 第22章 本地化翻译应用