内容简介
本书完全用苹果公司的Swift编程语言进行了重写,读者在创建iOS应用时遇到的许多烦人问题,都可以通过本书介绍的方法得到解决。
本书使用了iOS 8的SDK,读者会在书中找到数百个全新的、改进过的知识点,包括使用健康应用数据和HomeKit配件、增强的动画和绘图、存储和保护数据、收发通知、管理文件和文件夹,等等。每节的示例代码都在Github上,读者可以立即使用
作者简介
Vandad Nahavandipoor,资深iOS和OS X工程师,现就职于一个范围覆盖29个国家、拥有超过7000名员工的国际传媒公司。此前他曾在英国劳埃德银行工作,为数百万英国用户提供iOS应用程序。
精彩书评
“从使用iOS的新特性进行编码到处理复杂的需求,本书总是带给我所需要的资源和优秀、清晰、有实践性的示例。现在,我开始使用Swift,本书成为我的*佳参考,没有它我会迷失。”
——Joao Duarte iOS高级软件工程师
目录
前言 1
第1章 基础知识 9
1.0 介绍 9
1.1 为视图添加模糊效果 17
1.2 使用popover展示临时信息 20
1.3 使用UIImageView显示图片 24
1.4 使用UILabel显示静态文本 28
1.5 使用UIButton向UI中添加按钮 34
1.6 显示警告视图或者操作列表 38
1.7 使用UISwitch创建、使用、自定义开关 43
1.8 使用UIPickerView选取值 47
1.9 使用UIDatePicker选择日期或时间 51
1.10 使用UISlider实现区间滑块 55
1.11 使用UISegmentedControl实现分组的紧凑选项 59
1.12 使用UIActivityViewController显示分享选项 62
1.13 使用UIActivityViewController展示自定义分享选项 67
1.14 在导航栏上显示图片 72
1.15 使用UIBarButtonItem向导航栏添加按钮 73
1.16 使用UITextField接受用户文本输入 78
1.17 使用UITextView显示多行文本 85
1.18 使用UIScrollView创建可滚动的内容 89
1.19 使用WebKit载入网页 92
1.20 使用UIWebView载入网页 95
1.21 使用UIProgressView显示进度 98
1.22 创建配置文件 100
第2章 扩展 107
2.0 介绍 107
2.1 为照片应用添加新的照片编辑能力 110
2.2 向iOS提供自定义分享扩展 117
2.3 构建自定义键盘 126
2.4 通过操作扩展,在应用内部提供服务 132
2.5 向通知中心添加小工具 139
第3章 使用HealthKit管理健康数据 149
3.0 介绍 149
3.1 设置应用以使用HealthKit 149
3.2 获取和修改用户体重信息 152
3.3 访问和修改用户身高信息 158
3.4 获取用户特征 165
3.5 观察用户健康信息变化 169
3.6 读写用户燃烧的总卡路里值 174
3.7 单位转换 186
第4章 使用HomeKit管理家用电器 189
4.0 介绍 189
4.1 模拟HomeKit配件 191
4.2 在HomeKit中管理用户住宅 197
4.3 向用户的住宅添加房间 204
4.4 在用户住宅中指定区域 208
4.5 发现和管理支持HomeKit的配件 213
4.6 与HomeKit配件进行交互 218
4.7 对HomeKit配件进行分组 225
第5章 创建有动态交互性的用户界面 228
5.0 介绍 228
5.1 向UI组件添加重力效果 229
5.2 在UI组件之间检测并响应碰撞 231
5.3 使用推动(push)实现UI组件动画 237
5.4 对动力项目进行关联 241
5.5 向UI组件添加“跳动”效果 245
5.6 为动力特效设定特征 248
第6章 表格视图和集合视图 252
6.0 介绍 252
6.1 填充表格视图数据 253
6.2 为表格视图的单元格添加滑动删除功能 257
6.3 在表格视图中创建页眉和页脚 258
6.4 在表格视图中显示刷新控件 265
6.5 为集合视图提供基本内容 268
6.6 使用.xib 文件填充集合视图的自定义单元格 271
6.7 处理集合视图中的事件 278
6.8 为集合视图提供页眉和页脚 281
6.9 为集合视图添加自定义交互 285
第7章 并发和多任务 289
7.0 介绍 289
7.1 执行UI相关任务 292
7.2 执行非UI相关任务 294
7.3 在特定延时之后执行任务 301
7.4 对某个任务仅仅执行一次 303
7.5 将任务进行分组 305
7.6 使用操作(NSOperation)创建简单并发 307
7.7 在操作间创建依赖关系 312
7.8 触发周期性任务 314
7.9 在后台执行长时间运行的任务 317
7.10 为应用添加后台抓取功能 320
7.11 在后台中播放音频 328
7.12 在后台处理位置变化 331
7.13 在后台处理网络连接 333
第8章 安全 336
第9章 Core Location、iBeacon和地图 370
第10章 手势识别 403
第11章 网络与分享 420
第12章 多媒体 451
第13章 通讯录 474
第14章 文件与文件夹管理 500
第15章 摄像头和照片库 521
第16章 通知 556
第17章 Core Data 594
第18章 日期、日历和事件 628
第19章 图形和动画 657
第20章 Core Motion 708
第21章 Cloud 724
前言/序言
译者序
移动应用开发作为当今最热门的应用开发方向,已经受到全世界开发者的极大关注。一方面,在主流的移动平台iOS中,Swift语言作为这一领域的新贵,无疑会在未来几年赚足眼球。对于原有的iOS开发人员,有喜也有悲。欢喜的是,开发人员终于有了一门更加优秀、更加现代化、更加高性能的编程语言。将Swift作为武器,可以高效地开发出高质量的移动应用。悲伤的是,如果开发人员现在还不开始学习Swift,恐怕用不了多久就会被Swift带来的技术革新无情淘汰。另一方面,iOS本身也在快速地进行技术演进。不同以往,iOS 8引入和开放了许多别出心裁的新技术,如Extensions、HealthKit、HomeKit、TouchID,等等。如果开发人员能够充分利用这些新技术,就可以显著改善应用带给用户的使用体验,进而在移动应用时代取得制高点。在这个时候,我深深地体会到拥有一本优秀教材的重要性。
第一次拿到本书的原版作品时,既兴奋又倍感压力。一方面,本书既介绍了iOS,又介绍了如何用Swift进行实战,与当今的市场需求非常契合。另一方面,随着深入阅读,我深深地被原作者的睿智和才华所打动。本书的内容完整详实,书中例子尽可能追求简单,并切中要害。既可以作为教材供在校师生使用,也可以作为工具书,供一线工程师备查。如何将这样一部优秀的作品尽可能快并且尽可能高质量地呈现给国内的读者,对我们来说是一个前所未有的巨大挑战。
作为美团移动团队的成员,我们都是奋战在一线的iOS开发工程师,但是翻译图书对我们来说仍然是个巨大的挑战。首先是时间,我们需要利用业余时间和尽可能多的碎片时间进行本书的翻译工作,深夜还经常看到小伙伴们仍然在奋笔疾书。不仅如此,我还有些许忧虑,担心自己把握不好原著恰到好处的笔锋,不能有效地将这样一部优秀的作品呈现在读者面前。因此,我们对这次翻译非常用心,与几位合作者一起查阅了大量相关资料,力求做到专业词汇准确权威,将原书的精华呈现给每一位读者。
现在,我怀着期盼和忐忑的心情,将这本译著呈现给大家,渴望得到您的认可,更渴望与您成为朋友,如果您有任何问题和建议,请与我联系(liangshixing@gmail.com),让我们一起探讨,共同进步!
感谢机械工业出版社华章公司的陈佳媛老师对我们的信任与支持。感谢(美团)酒店旅游事业群负责人陈亮建立了这支充满技术热情的移动团队。感谢另外两位主要译者——我的多年好友陈作君以及团队主管赵萌——几个月以来的共同努力。感谢北京航空航天大学的宋友老师和杨思宇同学,他们为本书的定稿和审读提出了大量有建设性的宝贵意见,并做出了许多有创新性的指导工作。感谢团队其他小伙伴,郝田田、王禹华、吴卓和张杰,对本书翻译审读工作的鼎力相助。最后,还要特别感谢家人的理解与包容。
梁士兴
2016年6月于北京
《Swift进阶之道:深度解析iOS架构与性能优化》 一、 内容概述 本书并非一本面向初学者的Swift入门教程,也非罗列UIKit控件或Swift语言特性的百科全书。相反,《Swift进阶之道》将聚焦于iOS应用开发的深层技术与实践,旨在为那些已掌握Swift基础语法、熟悉UIKit并拥有一定iOS开发经验的开发者提供一个更广阔的视野和更精深的技能提升路径。本书将深入剖析iOS应用架构设计的核心原则,揭示影响应用性能的关键因素,并提供一系列实用的优化策略和高级技巧,帮助开发者构建出更具可维护性、可扩展性、稳定性和卓越用户体验的iOS应用程序。 我们不涉及Swift语言的基本语法、基础数据类型、控制流、函数、类、结构体、枚举等这些初学者需要掌握的内容。同样,对于UIKit中常用控件(如`UILabel`、`UIButton`、`UITableView`)的基本使用方法,以及如何在Interface Builder中进行UI布局等基础操作,本书也概不赘述。本书的目标读者应已熟练掌握这些内容,并希望在这些基础上更上一层楼。 二、 核心章节详解 第一部分:现代iOS应用架构设计 本部分将摒弃过时或低效的开发模式,着重讲解当前业界主流且行之有效的iOS应用架构。我们不只是介绍MVVM、MVC、VIPER等模式的定义,更会深入探讨它们在实际项目中的应用场景、优缺点对比,以及如何根据项目规模和团队特点进行灵活选择和组合。 深入理解设计模式在iOS开发中的演进与实战: MVC 的局限性与演进: 探讨经典MVC模式在大型项目中的挑战,如Controller的职责臃肿、视图与Model的耦合问题。分析如何通过引入Presenter、ViewModel等概念来改进MVC,使其更适应复杂应用的需求。 MVVM 模式的落地实践: 详细讲解MVVM模式的核心思想,即View通过Data Binding与ViewModel进行交互,ViewModel负责处理业务逻辑和数据。重点在于展示如何优雅地实现Data Binding,以及ViewModel如何有效地管理View的状态和业务逻辑。我们将通过实际案例,例如一个复杂表单的填写与验证,来展示MVVM的优势。 VIPER 模式的解耦之道: 深入解析VIPER(View, Interactor, Presenter, Entity, Router)模式,强调其极致的解耦和职责划分。剖析VIPER中各组件的职责范围,以及它们之间如何通过Protocol进行通信。我们将展示如何使用VIPER来构建一个高内聚、低耦合的模块,从而极大地提升代码的可测试性和可维护性。 Coordinator 模式在导航管理中的应用: 针对iOS应用中复杂的导航逻辑,我们将详细介绍Coordinator模式。它如何将导航控制从ViewController中解耦出来,使得ViewController更加专注于UI展示,而导航逻辑则由Coordinator统一管理。通过实例,展示如何使用Coordinator来处理模态跳转、Navigation Controller的push/pop以及跨模块的导航。 Clean Architecture 在iOS中的适配与实践: 探讨如何将Uncle Bob提出的Clean Architecture理念应用于iOS开发。分析其分层思想,如Domain Layer、Application Layer、Presentation Layer、Frameworks Layer,并展示如何在Swift项目中实践这些分层,以构建可独立测试、不受外部框架影响的业务核心。 组件化与模块化开发策略: 为何选择组件化: 深入分析组件化开发的必要性,包括提升开发效率、降低耦合度、促进代码复用、便于团队协作以及实现按需加载等。 组件划分的原则与实践: 讨论如何合理地划分组件,确保每个组件职责清晰、独立性强。讲解组件间的依赖管理,以及如何避免循环依赖。 CocoaPods、Carthage 和 Swift Package Manager 的高级用法: 不只是简单的集成,我们将深入讲解这三种主流依赖管理工具的配置、版本控制、私有库管理、二进制库打包等高级特性,以及它们在组件化开发中的最佳实践。 动态加载与热更新的探索(可选): 简要探讨动态加载代码(如通过dlopen)和实现应用热更新(非App Store官方支持)的可能性与挑战,重点在于其技术原理和潜在风险。 第二部分:iOS应用性能深度优化 性能是衡量一个应用优秀与否的关键指标。本部分将带领读者深入探究影响iOS应用性能的各个方面,并提供一系列行之有效的优化手段。 内存管理与优化: ARC 的工作原理与潜在陷阱: 深入剖析Automatic Reference Counting (ARC) 的工作机制,包括强引用、弱引用、无主引用。重点讲解循环引用的产生原因、检测方法(如Instruments中的Allocations工具),以及如何使用`[weak self]`或`[unowned self]`来打破循环引用。 内存泄漏的识别与定位: 学习使用Instruments中的Allocations、Leaks等工具,详细分析内存分配和释放的生命周期,精准定位内存泄漏点。 内存抖动 (Memory Jitter) 的分析与规避: 探讨内存抖动对应用响应速度和稳定性的影响,讲解如何通过优化数据结构、减少不必要的对象创建、批量处理等方式来缓解内存抖动。 图像和资源的高效加载与释放: 讲解如何使用`SDWebImage`、`Kingfisher`等第三方库进行高效的图片异步加载、缓存管理和内存优化。讨论如何管理大型图像资源,避免一次性加载导致内存过载。 CPU与卡顿优化: 主线程的阻塞与卡顿分析: 深入分析主线程阻塞的常见原因,如耗时I/O操作、复杂的UI绘制、过多的网络请求等。 Instruments 的 Time Profiler 工具详解: 学习如何利用Time Profiler工具,精确定位CPU占用过高的函数和代码段,分析函数调用栈,找出性能瓶颈。 并发与多线程编程实战: GCD (Grand Central Dispatch) 的高级应用: 讲解Dispatch Queue的类型、GCD的同步与异步执行、Dispatch Group、Dispatch Semaphore等,以及如何在实际场景中高效地使用GCD来执行后台任务。 OperationQueue 的使用与管理: 介绍`NSOperationQueue`,并与GCD进行对比,探讨其在任务依赖、取消、暂停等方面的优势,以及如何构建复杂的多线程任务流。 Swift Concurrency (async/await) 的引入与实践: 详细讲解Swift 5.5引入的async/await语法糖,如何通过`async`和`await`关键字简化异步编程,避免回调地狱,以及Task、TaskGroup等新特性在并发编程中的应用。 UI渲染性能优化: 视图层级优化: 讲解如何扁平化视图层级,避免过深的嵌套,减少不必要的`addSubview`操作。 离屏渲染 (Offscreen Rendering) 的避免与分析: 识别导致离屏渲染的常见UI元素(如圆角、阴影、蒙版),并提供规避或优化方案。 Auto Layout 的性能考量: 分析`Auto Layout`在复杂视图中的性能开销,介绍`willMove(toSuperview:)`、`layoutSubviews()`等方法的使用时机,以及如何通过硬编码布局来提升性能(在特定场景下)。 `CALayer` 的优化技巧: 讲解`CALayer`的属性对性能的影响,如`contents`、`shadowPath`、`shouldRasterize`等,并提供优化建议。 网络通信优化: HTTP/2 和 WebSockets 的应用: 介绍HTTP/2的头部压缩、多路复用等特性,以及WebSocket在实时通信中的优势。 网络请求的封装与优化: 讲解如何封装一个高效的网络请求层,包括请求参数的校验、超时设置、重试机制、缓存策略等。 数据传输格式的选择与压缩: 对比JSON、Protocol Buffers等数据格式的优劣,以及数据压缩(如Gzip)在减少传输量、提升传输速度方面的作用。 断点续传与图片上传优化: 探讨如何实现大文件的断点续传,以及优化图片上传的策略,如分块上传、压缩上传。 第三部分:高级主题与最佳实践 本部分将触及一些更为高级和前沿的iOS开发技术,并总结一系列贯穿始终的最佳实践。 Reactive Programming (响应式编程): RxSwift/Combine 框架解析: 深入讲解RxSwift和Apple官方的Combine框架,理解Observable、Observer、Subject、Operator等核心概念。 响应式编程在UI交互、数据流管理中的应用: 通过实际案例,展示如何使用响应式编程来简化复杂的UI事件处理、异步操作的组合以及状态的管理。 响应式编程的陷阱与调试技巧: 分析响应式编程可能带来的内存泄漏(如订阅未取消)、调试困难等问题,并提供相应的解决方案。 Swift语言的高级特性与技巧: 泛型(Generics)的深入应用: 讲解如何利用泛型编写更通用、可复用的代码,包括关联类型(Associated Types)、泛型约束、泛型函数和泛型类型。 协议(Protocols)的强大之处: 探索协议的各种高级用法,如协议扩展(Protocol Extensions)与默认实现、协议作为类型、协议的组合(Protocol Composition)等。 属性包装器 (Property Wrappers) 的实战: 讲解属性包装器的概念,以及如何通过 `@State`、`@ObservedObject`(在SwiftUI中)等属性包装器来简化状态管理和数据绑定。 Swift 函数式编程思想: 介绍函数式编程的基本概念,如纯函数、不可变性、高阶函数,并展示如何在Swift中实践这些思想,以提升代码的清晰度和可测试性。 Swift Compiler 的行为与优化(可选): 简要探讨Swift编译器在代码优化方面的策略,以及开发者可以通过哪些方式来辅助编译器进行更有效的优化(如避免不必要的类型转换)。 持续集成与持续部署 (CI/CD) 的实践: CI/CD 的理念与优势: 讲解CI/CD如何自动化构建、测试和部署流程,提高开发效率和软件质量。 Fastlane 的集成与使用: 详细介绍Fastlane工具链,包括`scan`(自动化测试)、`gym`(自动化打包)、`deliver`(自动化发布到App Store)等,以及如何配置和使用。 Jenkins/GitLab CI/GitHub Actions 等CI/CD平台在iOS项目中的应用: 介绍如何搭建和配置CI/CD服务器,实现代码提交后的自动化构建、测试和分发。 代码质量与可维护性: 单元测试 (Unit Testing) 与集成测试 (Integration Testing) 的策略: 讲解如何编写高质量的单元测试和集成测试,覆盖核心业务逻辑和关键接口。 Mocking 与 Stubbing 技术: 介绍如何使用Mocking和Stubbing技术来隔离被测代码,简化测试环境的搭建。 代码审查 (Code Review) 的重要性与方法: 强调代码审查在发现潜在问题、分享知识、统一编码风格方面的作用,并提供有效的代码审查技巧。 Kitura/Vapor (Server-side Swift) 简介(可选): 简要介绍Swift在后端开发领域的应用,为读者提供更广阔的技术视野。 三、 目标读者 本书的目标读者为具有一定Swift语言基础和iOS开发经验的开发者,包括但不限于: 已经独立完成过1-2个iOS应用项目的初中级开发者。 希望深入理解iOS应用架构、提升代码质量和性能的开发者。 对响应式编程、Swift语言高级特性等前沿技术感兴趣的开发者。 希望掌握自动化构建、测试、部署等CI/CD流程的开发者。 参与团队项目,需要提升团队协作效率和代码可维护性的开发者。 四、 本书特色 聚焦深度与广度: 既有对经典架构模式的深度剖析,又不乏对前沿技术(如Swift Concurrency)的详尽介绍。 实战导向: 每一章节都将通过丰富的代码示例和实际应用场景来讲解技术要点,理论与实践紧密结合。 问题解决型: 针对iOS开发中常见的痛点问题,如性能瓶颈、内存泄漏、卡顿等,提供切实可行的解决方案。 面向未来: 引入Swift语言的最新特性和现代iOS开发理念,帮助读者跟上技术发展的步伐。 非入门导向: 明确不包含Swift基础语法和UIKit基础控件的讲解,确保内容的高效性和针对性。 《Swift进阶之道:深度解析iOS架构与性能优化》 将是您在iOS开发之路上迈向精通的得力助手,助您打造出更出色、更具竞争力的iOS应用。