iOS编程实战

更多详情

内容简介: 《iOS编程实战》是最受开发者喜爱的iOS 进阶图书。它包含大量代码示例,主线是围绕如何设计、编写和维护优秀的iOS 应用。开发者可从本书学到大量关于设计模式、编写可重用代码以及语法与新框架的知识。
相对上一版,新版进行了大幅修订,新增6 章阐述iOS 7 新特性,并对大部分内容进行了更新,涵盖了iOS 7 大部分新增特性,包括新的后台操作(第11 章)、Core Bluetooth(第13 章)、UIKit 动力学(第19章)以及TextKit(第21 章)。我们提供了如何处理新的扁平化UI 的指南(第2 章),还新增了一章开发者不太常见但相当实用的“小技巧”(第3 章)。
《iOS编程实战》适合iOS 移动开发人员。
《iOS编程实战》深入介绍iOS 7新特性和新功能,涵盖iOS 7大部分新增特性,包括新的后台操作、Core Bluetooth、UIKit动力学以及TextKit。另外还介绍了如何处理新的扁平化UI,并新增了一章你可能不知道的“小技巧”。如果读者熟练掌握C和C++,读完本书即可创建性能优异的iPhone、iPad和iPod touch应用。
《iOS编程实战》主要内容包括:
iOS 7新特性和新功能概览;
深入解析多任务、多平台、安全服务、应用内购买、自动布局等高级主题;
全面介绍REST、高级GCD、本地化和国际化、Core Bluetooth;
细致讲解UIKit动力学、自定义过渡及其他内容。
《iOS编程实战》助你充分利用iOS 7新特性,挑战编程极限,打造非凡应用。

目录: 《iOS编程实战》
第一部分 全新功能
第1章 全新的系统  2
1.1  新的UI  2
1.2  UIKit Dynamics和Motion Effects  3
1.3  自定义过渡效果  4
1.4  新的多任务模式  4
1.5  Text Kit  5
1.6  动态字体  5
1.7  MapKit集成  5
1.8  SpriteKit  5
1.9  LLVM 5  5
1.10  Xcode 5  7
1.10.1  nib文件格式的变化  7
1.10.2  源代码控制集成  7
1.10.3  自动配置  7
1.10.4  对调试导航面板的改进  8
1.10.5  文档浏览器  8
1.10.6  Asset Catalog  9
1.10.7  测试导航面板  9
1.10.8  持续集成  10
1.10.9  Auto Layout改进  10
1.10.10  iOS模拟器  10
1.11  其他  10
1.12  小结  11
1.13  扩展阅读  11
第2章 世界是平的:新的UI范式  12
2.1  清晰、依从和层次  12
2.2  动画、动画、动画  12
2.2.1  UIKit Dynamics  13
2.2.2  UIMotionEffect  13
2.3  着色  14
2.4  用半透明实现层次和上下文  14
2.5  动态字体  15
2.6  自定义过渡效果  16
2.7  把应用过渡(迁移)到iOS 7  17
2.7.1  UIKit变化  17
2.7.2  自定义设计  17
2.7.3  支持iOS 6  17
2.8  小结  20
2.9  扩展阅读  20
第二部分 充分利用日常工具
第3章 你可能不知道的  22
3.1  命名最佳实践  22
3.1.1  自动变量  22
3.1.2  方法  22
3.2  属性和实例变量最佳实践  23
3.3  分类  24
3.4  关联引用  26
3.5  弱引用容器  27
3.6  NSCache  28
3.7  NSURLComponents  28
3.8  CFStringTransform  29
3.9  instancetype  30
3.10  Base64和百分号编码  31
3.11  -[NSArray firstObject]  31
3.12  小结  31
3.13  扩展阅读  32
第4章 故事板及自定义切换效果  33
4.1  初识故事板  33
4.1.1  实例化故事板  34
4.1.2  加载故事板中的视图控制器  34
4.1.3  联线  34
4.1.4  使用故事板来实现表视图  36
4.2  自定义切换效果  37
4.2.1  优点  39
4.2.2  白璧微瑕——合并冲突  39
4.3  小结  39
4.4  扩展阅读  39
第5章 掌握集合视图  41
5.1  集合视图  41
5.1.1  类与协议  41
5.1.2  示例  42
5.2  用集合视图自定义布局实现高级定制  49
5.2.1  石工布局  50
5.2.2  封面浏览布局  55
5.3  小结  56
5.4  扩展阅读  56
第6章 使用自动布局  58
6.1  Xcode 4的自动布局  58
6.2  了解自动布局  59
6.3  Xcode 5中自动布局的新特性  59
6.3.1  在Xcode 5中使用自动布局  61
6.3.2  固有尺寸  62
6.3.3  固有尺寸和本地化  63
6.3.4  设计时和运行时布局  63
6.3.5  自动更新边框  64
6.3.6  顶部和底部布局引导  65
6.3.7  辅助编辑器中的布局预览  65
6.3.8  在设计时调试自动布局  65
6.3.9  在自动布局中使用滚动视图  66
6.3.10  使用自动布局和边框  66
6.3.11  可视格式化语言  66
6.3.12  可视格式化语言的缺点  67
6.3.13  调试布局错误  68
6.4  小结  69
6.5  扩展阅读  69
第7章 更完善的自定义绘图  71
7.1  iOS的不同绘图系统  71
7.2  UIKit和视图绘图周期  72
7.3  视图绘制与视图布局  73
7.4  自定义视图绘制  74
7.4.1  通过UIKit绘图  74
7.4.2  路径  75
7.4.3  理解坐标系  77
7.4.4  重新调整大小以及内容模式  79
7.4.5  变形  80
7.4.6  通过Core Graphics进行绘制  82
7.4.7  混用UIKit与Core Graphics  85
7.4.8  管理图形上下文  85
7.5  优化UIView绘制  87
7.5.1  避免绘图  87
7.5.2  缓存与后台绘制  88
7.5.3  自定义绘图与预渲染  88
7.5.4  像素对齐与模糊文本  89
7.5.5  透明、不透明与隐藏  90
7.6  小结  90
7.7  扩展阅读  91
第8章 Core Animation  92
8.1  视图动画  92
8.2  管理用户交互  94
8.3  图层绘制  94
8.3.1  直接设置内容  96
8.3.2  实现display方法  97
8.3.3  自定义绘图  97
8.3.4  在自己的上下文中绘图  99
8.4  移动对象  99
8.4.1  隐式动画  100
8.4.2  显式动画  101
8.4.3  模型与表示  101
8.4.4  关于定时  103
8.5  三维动画  105
8.6  美化图层  108
8.7  用动作实现自动动画  108
8.8  为自定义属性添加动画  110
8.9  Core Animation与线程  111
8.10  小结  111
8.11  扩展阅读  111
第9章 多任务  113
9.1  多任务和运行循环简介  113
9.2  以操作为中心的多任务开发  114
9.3  用GCD实现多任务  118
9.3.1  分派队列简介  119
9.3.2  用分派屏障创建同步点  120
9.3.3  分派组  121
9.4  小结  121
9.5  扩展阅读  121
第三部分 选择工具
第10章 创建(Core)Foundation框架  124
10.1  Core Foundation类型  124
10.2  命名和内存管理  125
10.3  分配器  126
10.4  内省  126
10.5  字符串和数据  127
10.5.1  常量字符串  127
10.5.2  创建字符串  128
10.5.3  转换为C字符串  129
10.5.4  其他字符串操作符  131
10.5.5  字符串的支持存储  131
10.5.6  CFData  132
10.6  容器类型  132
10.6.1  CFArray  133
10.6.2  CFDictionary  133
10.6.3  CFSet和CFBag  134
10.6.4  其他容器类型  134
10.6.5  回调函数  134
10.7  自由桥接  136
10.8  小结  139
10.9  扩展阅读  139
第11章 幕后制作:后台处理  140
11.1  后台运行最佳实践:能力越大责任越大  140
11.2  iOS 7中后台运行的重要变化  142
11.3  用NSURLSession访问网络  142
11.3.1  会话配置  143
11.3.2  任务  143
11.3.3  后台传输  144
11.4  周期性拉取和自适应多任务  146
11.5  后台唤醒  146
11.6  状态恢复系统  147
11.6.1  测试状态恢复系统  147
11.6.2  选择性加入  148
11.6.3  应用启动过程的变化  149
11.6.4  状态恢复标识符  149
11.6.5  状态编码器与状态解码器  149
11.6.6  表视图和集合视图  153
11.7  小结  154
11.8  扩展阅读  154
第12章 使用REST服务  156
12.1  REST简介  157
12.2  选择数据交换格式  157
12.2.1  在iOS中解析XML  157
12.2.2  在iOS中解析JSON  158
12.2.3  XML与JSON  159
12.2.4  模型版本化  160
12.3  假想的Web服务  160
12.4  重要提醒  161
12.5  RESTfulEngine架构(iHotelApp示例代码)  161
12.5.1  NSURLConnection与第三方框架  161
12.5.2  创建RESTfulEngine  162
12.5.3  使用访问令牌对API调用进行认证  165
12.5.4  在RESTfulEngine.m中覆盖相关方法以添加自定义认证头部  165
12.5.5  取消请求  166
12.5.6  请求响应  166
12.5.7  对JSON数据进行键值编码  167
12.5.8  列表页面的JSON对象与详细页面的JSON对象  169
12.5.9  嵌套JSON对象  169
12.5.10  少即是多  171
12.5.11  错误处理  171
12.5.12  本地化  173
12.5.13  使用分类处理其他格式  173
12.5.14  在iOS中提升性能的小技巧  174
12.6  缓存  174
12.7  需要离线支持的原因  174
12.8  缓存策略  175
12.8.1  存储缓存  175
12.8.2  缓存版本和失效  178
12.9  数据模型缓存  178
12.10  缓存版本控制  182
12.11  创建内存缓存  183
12.11.1  为AppCache设计内存缓存  184
12.11.2  处理内存警告  185
12.11.3  处理结束和进入后台通知  186
12.12  创建URL缓存  186
12.12.1  过期模型  187
12.12.2  验证模型  187
12.12.3  示例  187
12.12.4  用URL缓存来缓存图片  188
12.13  小结  188
12.14  扩展阅读  188
第13章 充分利用蓝牙设备  190
13.1  蓝牙历史  190
13.2  为什么选择低功耗蓝牙  191
13.3  蓝牙SDK  191
13.3.1  服务器  191
13.3.2  客户端  191
13.4  类和协议  191
13.5  使用蓝牙设备  192
13.5.1  通过扫描寻找服务  192
13.5.2  连接设备  194
13.5.3  直接获取外围设备  194
13.5.4  发现服务  194
13.5.5  发现特性  195
13.6  创建自己的外围设备  197
13.6.1  广播服务  197
13.6.2  常见场景  200
13.7  在后台运行  200
13.7.1  后台模式  200
13.7.2  电量考虑  200
13.7.3  状态保存和恢复  200
13.8  小结  201
13.9  扩展阅读  201
第14章 通过安全服务巩固系统安全  203
14.1  理解iOS沙盒  203
14.2  保证网络通信的安全  204
14.2.1  证书工作原理  205
14.2.2  检验证书的有效性  207
14.2.3  判断证书的可信度  210
14.3  使用文件保护  211
14.4  使用钥匙串  213
14.5  使用加密  216
14.5.1  AES概要  217
14.5.2  使用PBKDF2将密码转换成密钥  217
14.5.3  AES模式和填充  219
14.5.4  初始化向量  220
14.5.5  使用HMAC进行认证  221
14.5.6  错误的密码  222
14.5.7  组合使用加密和压缩  222
14.6  小结  222
14.7  扩展阅读  222
第15章 在多个苹果平台和设备及64位体系结构上运行应用  224
15.1  开发多平台应用  225
15.1.1  可配置的目标设置:Base SDK和Deployment Target  225
15.1.2  支持多个SDK时的注意事项:框架、类和方法  225
15.1.3  检查框架、类和方法的可用性  227
15.2  检测设备的功能  228
15.2.1  检测设备及判断功能  228
15.2.2  检测硬件和传感器  229
15.3  应用内发送Email和短信  233
15.4  支持新的4英寸设备族系  233
15.4.1  Cocoa自动布局  235
15.4.2  代码中固化屏幕尺寸  235
15.4.3  iPhone 5s和新的64位指令集  235
15.5  向iOS 7迁移  236
15.5.1  自动布局  236
15.5.2  支持iOS 6  236
15.5.3  应用图标  237
15.5.4  无边界按钮  237
15.5.5  着色  237
15.5.6  图片更新  237
15.6  向64位体系结构迁移  238
15.6.1  数据溢出  238
15.6.2  序列化数据  239
15.6.3  针对64位体系结构的条件编译  239
15.7  UIRequiredDeviceCapabilities  239
15.8  小结  240
15.9  扩展阅读  240
第16章 国际化和本地化  242
16.1  什么是本地化  242
16.2  本地化字符串  243
16.3  对未本地化的字符串进行审查  244
16.4  格式化数字和日期  245
16.5  nib文件和Base Internationalization  248
16.6  本地化复杂字符串  248
16.7  小结  250
16.8  扩展阅读  251
第17章 调试  252
17.1  LLDB  252
17.2  使用LLDB进行调试  252
17.2.1  dSYM文件  253
17.2.2  符号化  254
17.3  断点  255
17.4  观察点  258
17.5  LLDB控制台  259
17.6  NSZombieEnabled标志  262
17.7  不同的崩溃类型  263
17.7.1  EXC_BAD_ACCESS  263
17.7.2  SIGSEGV  263
17.7.3  SIGBUS  264
17.7.4  SIGTRAP  264
17.7.5  EXC_ARITHMETIC  264
17.7.6  SIGILL  264
17.7.7  SIGABRT  264
17.7.8  看门狗超时  265
17.7.9  自定义错误信号处理程序  265
17.8  断言  265
17.9  异常  267
17.10  收集崩溃报告  268
17.11  第三方崩溃报告服务  269
17.12  小结  270
17.13  扩展阅读  270
第18章 性能调优  272
18.1  性能思维模式  272
18.1.1  指导方针一:产品是为了取悦用户才存在的  272
18.1.2  指导方针二:设备是为了方便用户而存在的  272
18.1.3  指导方针三:做到极致  272
18.1.4  指导方针四:用户的感知才是实际的  273
18.1.5  指导方针五:关注能带来大收益的方面  273
18.2  欢迎走入Instruments的世界  273
18.3  查找内存问题  275
18.4  查找CPU问题  279
18.4.1  Accelerate框架  282
18.4.2  GLKit  283
18.4.3  编译器优化  283
18.4.4  链接器优化  284
18.5  绘图性能  284
18.6  优化磁盘访问和网络访问  286
18.7  小结  286
18.8  扩展阅读  286
第四部分 超越极限
第19章 近乎物理效果:UIKit动力学  290
19.1  动画类、行为和动力项  290
19.2  UIKit“物理”  291
19.3  内置行为  292
19.3.1  迅速移动  292
19.3.2  附着  292
19.3.3  推力  293
19.3.4  重力  294
19.3.5  碰撞  294
19.3.6  动力项  295
19.4  行为层次结构  295
19.5  自定义操作  295
19.6  实战:一个“撕开”视图  296
19.6.1  拖拽视图  296
19.6.2  撕开该视图  297
19.6.3  添加额外效果  300
19.7  多个动力学动画类  301
19.8  与UICollectionView交互  302
19.9  小结  305
19.10  扩展阅读  305
第20章 魔幻的自定义过渡  306
20.1  iOS 7中的自定义过渡  306
20.2  过渡协调器  307
20.3  集合视图和布局过渡  308
20.4  使用故事板和自定义联线的自定义视图控制器过渡  308
20.5  自定义视图控制器过渡:iOS 7风格  308
20.6  使用iOS 7 SDK的交互式自定义过渡  310
20.7  小结  312
20.8  扩展阅读  313
第21章 精妙的文本布局  314
21.1  理解富文本  314
21.1.1  字符与字形  314
21.1.2  理解字体  316
21.1.3  段落样式  316
21.2  属性化字符串  317
21.2.1  用字体描述符选择字体  318
21.2.2  设置段落样式  319
21.2.3  HTML  319
21.2.4  简化属性化字符串的使用  320
21.3  动态字体  321
21.4  Text Kit  322
21.4.1  Text Kit的组件  323
21.4.2  多容器布局  324
21.4.3  排除路径  325
21.4.4  继承文本容器  326
21.4.5  继承文本存储  327
21.4.6  继承布局管理器  331
21.4.7  针对字形的布局  334
21.5  Core Text  337
21.5.1  用CTFramesetter进行简单的布局  337
21.5.2  为非连续路径创建框架  338
21.5.3  排版器、文本行、连续文本和字形  340
21.6  小结  340
21.7  扩展阅读  341
第22章 Cocoa的大招:键值编码和观察  342
22.1  键值编码  342
22.1.1  用KVC赋值  344
22.1.2  用键路径遍历属性  345
22.1.3  KVC和容器类  345
22.1.4  KVC和字典  347
22.1.5  KVC和非对象  347
22.1.6  用KVC实现高阶消息传递  347
22.1.7  容器操作符  347
22.2  键值观察  348
22.2.1  KVO和容器类  350
22.2.2  KVO是如何实现的  351
22.3  KVO的权衡  351
22.4  小结  352
22.5  扩展阅读  353
第23章 超越队列:GCD高级功能  354
23.1  信号量  354
23.2  分派源  356
23.3  定时器源  358
23.4  单次分派  358
23.5  队列关联数据  359
23.6  分派数据和分派I/O  362
23.7  小结  367
23.8  扩展阅读  367
第24章 深度解析Objective-C  368
24.1  理解类和对象  368
24.2  使用方法和属性  370
24.3  使用方法签名和调用  372
24.4  消息传递如何工作  378
24.4.1  动态实现  378
24.4.2  快速转发  380
24.4.3  普通转发  383
24.4.4  转发失败  384
24.4.5  各种版本的objc_msgSend  384
24.5  方法混写  385
24.6  ISA混写  387
24.7  方法混写与ISA混写  388
24.8  小结  389
24.9  扩展阅读  389

前言: 从某种程度上说,iOS 7是从SDK随着iPhone OS 2发布到现在iOS发生过的最大的变化。人们在新闻和博客中讨论新的扁平化用户界面的各个方面,及其对应用开发者和用户的意义。可以说,从没有一次iOS的升级会使得这么多的开发者重新设计UI。
但是从另外的角度看,iOS 7几乎可以从iOS 6无缝升级。比起iOS 4在多任务上的变化,iOS 7只需要对应用做很小的改动,尤其是开发者使用标准UI或者完全自定义UI的情况。对于这两种极端情况,UI的变化要么是自动完成的,要么压根儿跟开发者没关系。
不过,对所有的开发者来说,iOS还是带来了变化。有很多管理后台操作的方法,但是后台运行的规则甚至比以前更严格了。UIKit动力学意味着更灵活的动画,不过实现起来不简单。TextKit为文本布局带来了令人难以置信的特性,也伴随着令人发疯的限制和bug。iOS 7是大杂烩,既有美好也有挫败。不过你得学习iOS 7,因为用户很快就会升级。
如果你准备好了去探索最新的苹果系统,准备好了挑战应用的极限,那么本书会助你一臂之力。
读者对象
这并不是一本入门书。其他一些书会教你Objective-C并一步步指导你学习Interface Builder。不过本书假定你已经拥有一些iOS开发经验。可能是自学的,或者上过培训班,没准已经有一个应用即将完工只是没有上架而已。对于此类读者,如果你打算学习更深入的内容、最佳实践以及作者源自真实工程的开发经验,那你就找对书了。
这本书并不是示例的简单堆砌,它包含大量代码,不过主线还是围绕如何设计、编写和维护优秀的iOS应用。本书不仅会教你怎么做,并且会剖析这样做的原因。你会学到很多关于设计模式、编写可重用代码以及语法与新框架的知识。
本书内容
iOS平台总是向前发展,本书也一样。书中大部分示例需要至少iOS 6才能运行,有些需要iOS 7。所有示例都启用了自动引用计数(ARC)、自动属性合成和对象字面量。除了很少几处外,本书不会讨论向后兼容。如果你的代码过于庞大,必须要向后兼容,你可能知道如何处理。本书主旨是通过最好的特性来创造最佳应用。
本书专注于iPhone 5、iPad 3和更新的型号。大部分主题对其他iOS设备也适用。第15章讲了如何处理平台间的差异。
新版内容
本版涵盖了iOS 7大部分的新增特性,包括新的后台操作(第11章)、Core Bluetooth(第13章)、UIKit动力学(第19章)以及TextKit(第21章)。我们提供了如何处理新的扁平化UI的指南(第2章),还新增了一章你可能不知道的“小技巧”(第3章)。
本书专注于iOS 7中最有价值的信息。前几版的有些章节被移到了网站上(iosptl.com)。读者可以在那里找到关于常见的Objective-C实践、定位服务、错误处理等内容的章节。
本书结构
iOS提供了非常丰富的工具,既有UIKit这样的高层框架,也有Core Text这样的低层工具。有时候,同一个目标可以通过多种方式来达成。作为开发人员,如何找到最合适的工具呢?
本书既考虑了日常开发需求,也考虑了特定的用途,能够帮你作出正确的选择。学完本书,你会明白每个框架存在的价值、框架之间的相互关系,以及什么时候选用哪一个框架。最终,你会知道哪个框架最适合解决哪一类问题。
本书分四部分,从最常用的工具一直讲到最强大的工具。这一版新增的章会在前面用“新增”字样标识,而经过大范围更新的章会用“更新”字样标识。
第一部分:全新功能
如果你熟悉iOS 6,这部分可以让你快速了解iOS 7的新特性。
(新增)第1章“全新的系统”——iOS 7增加了大量新特性,本章将带你快速概览有哪些内容。
(新增)第2章“世界是平的:新的UI范式”——iOS 7对iOS应用的外观和行为做了巨大的改变。本章将介绍迁移所需的新模式和设计语言。
第二部分:充分利用日常工具
作为一名iOS开发人员,你应该掌握很多常用工具,比如通知、表视图和动画图层。不过要想发挥它们的全部潜力,就要熟悉它们。在这一部分,我们将学到Cocoa开发的最佳实践。
(新增)第3章“你可能不知道的”——即使你是一位有经验的开发者,你可能并不熟悉Cocoa的一些小特性和技巧。本章介绍作者根据多年iOS开发经验总结的最佳实践,以及Cocoa一些不那么常见的方面。
(更新)第4章“故事板及自定义切换效果”——故事板仍然会使一些熟悉nib文件的开发人员感到费解。你在这里将会学到如何使用故事板来提升应用。
(更新)第5章“掌握集合视图”——集合视图正在逐步替代表视图,成为开发人员偏爱的布局控件。即使对于表格类布局,集合视图也提供了极大的灵活性,要想开发出迷人的应用,你应该理解这一点。本章会教你如何掌握这一重要工具。
(新增)第6章“使用自动布局”——如果WWDC 2013有什么核心的信息,那么一定是:使用自动布局。会议期间几乎所有的UIKit会话都在反复强调这一点。由于Xcode 4中诸多Interface Builder问题,开发者可能尽量避免使用自动布局。Xcode 5极大地改进了对自动布局的支持。不管你是喜欢使用约束,还是渴望回归springs & struts,你都不该错过最新的自动布局。
第7章“更完善的自定义绘图”——很多新开发者都对自定义绘图退避三舍,但它却是快速创建美观用户界面的关键。这一章将探究UIKit和Core Graphics中有关绘图的功能,告诉大家怎么才能做到既快又美。
第8章“Core Animation”——iOS设备对动画的支持是无与伦比的。借助强大的GPU和高度优化的Core Animation,你可以创建直观又吸引人的界面。在这一章中,我们会介绍一些基础知识以及动画的原理。
(更新)第9章“多任务”——多任务是许多应用程序的重要部分,这一章将介绍如何同时使用操作和GCD执行多任务。
第三部分:选择工具
第10章“创建(Core)Foundation框架”——说到iOS中最强大的框架,你能想到的Core框架可能会有Core Graphics、Core Animation、Core Text,但它们都是基于Core Foundation框架的。在这一章中,我们学习如何使用Core Foundation数据类型,以便充分利用iOS提供的功能。
(更新)第11章“幕后制作:后台处理”——iOS 7的后台处理又灵活了很多,但是,要想充分利用这些新变化,你得遵循一些新规则。本章带你深入学习新的NSURLSession,以及如何最好地实现状态恢复。
第12章“使用REST服务”——基于REST的服务是现代应用程序的核心,这一章将教会你在iOS中最好地实现它们。
(新增)第13章“充分利用蓝牙设备”——苹果一直在加强iOS与其他设备创建ad hoc网络的能力。这使得开发全新的应用成为可能:从更好的游戏到微定位服务,再到更方便的文件共享。加快创新,投入这个全新的市场吧!
第14章“通过安全服务巩固系统安全”——用户安全和保护隐私永远是第一位的。这一章会介绍如何通过钥匙串、证书和密码保护应用和用户数据不会被盗用。
(更新)第15章“在多个苹果平台和设备及64位体系结构上运行应用”——iOS家族人丁兴旺,不仅有了iPod touch、iPhone、iPad、Apple TV,而且新机型仍会不断涌现。目前还无法一次编写随处运行。为了保证应用在任何平台上都表现卓越,本章将讨论如何基于硬件和平台调整应用。
第16章“国际化和本地化”——虽然你现在可能只想关注某个国家的市场,但让应用明天能够顺利走向世界也只需做一点点工作。本章会告诉你如何不影响当前开发,又能减少未来的麻烦和成本。
第17章“调试”——要是每个应用第一次就能完美运行该有多好。幸好,Xcode和LLDB提供了很多能帮助你抓住狡猾bug的工具。你会学到很多高级的内容,了解实际开发中如何处理错误。
(更新)第18章“性能调优”——高性能可以让应用脱颖而出。优化CPU和内存性能非常重要,不过你也需要优化电池以及网络使用。苹果公司提供了Instruments这个强大的工具来解决这些问题。你会学到如何使用Instruments来找到瓶颈,以及如何在找到问题后改善性能。
第四部分:超越极限
这一部分是全书最精彩的内容。你已经学到了基础知识,掌握了基本技能。现在该使用高级工具来超越极限了。这一部分将带你深入地了解iOS。
(新增)第19章“近乎物理效果:UIKit动力学”——苹果一直致力于让动态的动画界面更容易实现。UIKit动力学是其最新杰作,为UIKit带来了“类物理效果“的引擎。这个工具很强大,同时要用好也很难。本章学习如何使用。
(新增)第20章“魔幻的自定义过渡”——WWDC 2013最绚丽的演示程序就是关于自定义过渡效果的。忘了“推入”,来学习如何创建动态和交互式的过度效果吧。
(更新)第21章“精妙的文本布局”——iOS 7以文本为中心的UI需要在字体处理和文本布局的细节上投入大量精力。TextKit带来了很多新特性,从动态字体到排除路径,还带来了bug和令人抓狂的限制。无论怎么处理文本,首先你得掌握属性化字符串。本章介绍这些强大的数据结构的方方面面,以及如何用TextKit充分利用这些数据结构。
第22章 “Cocoa的大招:键值编码和观察”——苹果的许多强大框架都是依靠KVO(Key-Value Observing)来维护性能和灵活性的。你会学到如何利用灵活性和KVO的速度,以及让它如此透明的诀窍。
(新增)第23章“超越队列:GCD高级功能”——分派队列是非常强大的工具,已经成了很多应用的重要组成部分。但是除了队列以外,GCD还有别的东西。本章介绍信号量、分派组还有非常强大的分派数据和分配IO这些工具。
第24章“深度解析Objective-C”——这一章致力于揭开Objective-C背后的秘密,包括如何使用Ojective-C运行时直接动态地修改类和方法、如何通过Objective-C函数调用C方法,以及如何通过系统来扩展程序。
以上各章可以跳读,除了需要Core Foundation数据对象(特别是Core Graphics、Core Animation)的几章,其他章都是相互独立的。关于Core Foundation的内容,最终会归总到第10章“创建Core Foundation框架”。
阅读条件
本书所有示例都是用Mac OS X 10.8上的Xcode 5以及iOS 7开发的。你需要一个苹果开发人员账户来访问大部分工具和文档,并且需要一个开发人员许可证来运行iOS设备上的应用程序。对此,请参考http://developer.apple.com/programs/ios并注册账号。
本书中大部分示例可以在Xcode 5的iOS模拟器中运行。使用iOS模拟器就不需要苹果开发人员许可证了。
苹果文档
苹果公司在自己的网站上和Xcode中提供了大量文档。这些文档的URL地址变动很频繁而且非常长。本书会使用标题而不是URL来引用这些文档。如果想在Xcode中寻找文档,请按下Cmd-Option-?快捷键或点击Help→Documentation and API Reference。并在Documentation Organizer窗口中点击搜索图标,输入文档的标题,并从搜索结果中选择文档。可以参考图0-1中搜索Coding Guidelines for Cocoa的示例。

图0-1 搜索Coding Guidelines for Cocoa
如果想在苹果官方网站查找文档,可以访问http://developer.apple.com,点击Member Center,并登录。选择iOS Dev Center,并在搜索框中输入文档的标题。
在线文档与Xcode文档是相同的。你可能会接收到iOS和Mac两个平台的结果,请阅读iOS版。很多iOS文档是Mac版的副本,偶尔会包含iOS不支持的函数调用或常量。本书会告诉你哪些功能在iOS上能用。
源代码
在学习本书示例的时候,可以手工输入代码,也可以使用本书附带的源代码文件。本书所有的源代码可以在https://github.com/iosptl/ios7ptl或www.wiley.com/go/ptl/ios7programming上下载得到 。举个例子,下载之后,在第21章文件夹SimpleLayout工程的CoreTextLabel.m文件中可以看到如下代码:
CoreTextLabel.m(SimpleLayout)
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
CGAffineTransform
transform = CGAffineTransformMakeScale(1, -1);
CGAffineTransformTranslate(transform,
0, -self.bounds.size.height);
self.transform = transform;
self.backgroundColor = [UIColor whiteColor];
}
return self;
}
本书中有些代码片段并不完整,其目的只是为了辅助上下文说明问题。要想查看完整代码,可在本书同步网站下载(www.wiley.com/go/ptl/ios7programming)。
勘误
虽然我们已经尽了最大努力,但错误在所难免。有些可能是因为内容有变化,有些可能是输入错误,有些可能是我们理解上有偏差。为了确保代码与时俱进,请参考https://github.com/iosptl/ios7ptl上的最新版本,以及博客中的相关文章。任何问题都可以发送给robnapier@gmail.com或contact@mk.sg。

媒体评论: “翻看本书目录就知道,这是奋战在项目一线的开发人员急需的一本书。”
——T. Casto
“iOS开发过程中最容易出问题的Zombies、GCD、 KVO等主题在本书中都有介绍,对于具备一定基础而又想迫切提高开发水平的程序员来说,这是一本相当给力的书。”
—— Jaime Moreno
“看过这本书的上一版,因此这一版出来后我毫不犹豫就将它放进了购物车。本书是iOS开发进阶的基石。我将本书介绍给了公司内一些年轻的iOS开发者,他们读完成后给出一致好评。”
——京东读者对上一版的评价

书摘: 第1章全新的系统
iOS 7为苹果设备带来了全新的用户界面,但是iOS 7在用户界面上的变化不仅仅是表面的。就像本书一样,iOS 7是给用户和开发者双方都带来好处的一次大升级。本章我们从新的UI及其对应用的影响开始讨论,然后是各种SDK的附加功能,还有新的IDE和编译器Xcode 5/LLVM 5。
iOS 7也为SDK带来了大量全新的核心特性,能帮助应用脱颖而出。iOS 7增加了两种新的技术,分别是UIKit Dynamics和UIMotionEffects,它们能帮你实现用Quarts Core不好实现的动画。过去只有用故事板才能实现视图之间的自定义过渡效果,现在已经可以用在任意两个视图控制器之间的过渡上了。内置的日历和照片应用就是很好的例子,它们利用自定义过渡效果来完美地为用户提供其在应用中所处的位置。Text Kit则是基于Objective-C的加强版Core Text,且易于使用,可以说是最重要也最有意思的新增特性。SDK还有其他的新增特性,举几个例子,Sprite Kit、Dynamic Text、更紧密的MapKit集成、针对所有应用的真正的多任务、更好的低功耗蓝牙支持。
新特性还不止这些,随着新的SDK特性而来的还有Xcode 5,它是iOS 7的新IDE,用ARC编译器完全重写过。Xcode 5速度更快,不易崩溃,新的IDE还引入了新编译器LLVM 5。
苹果再一次对平台做了巨大的改动,这是颠覆性的,会让本已拥挤不堪的App Store中的大部分应用都过时。对于很多应用来说,App Store又成了一个可以闯出一番天地的市场,作为iOS开发者,大家的未来就如2008年iOS SDK刚发布时那么好。
现在我们深入理解一下这些新特性,从新的UI开始。
1.1 新的UI
iOS 7的UI改变巨大,不只是表面的。iOS 7去除了UI元素的拟物效果,强化了真实世界的物理特性,比如运动模拟。
iOS 7主要关注以下几个主题:依从、清晰和层次。内容要比外表重要。如今应用要尽量用全屏显示内容,过去的“镀层效果”变成了半透明,并且会以柔化、模糊的效果显示后面的内容。所有的工具栏、导航栏和状态栏也都变成了半透明状态。除了半透明,它们还会模糊并染上背后UI的颜色,从而给用户一种层次的感觉,如图1-1所示。
图1-1 时钟应用的计时器选项卡周围的区域模糊显示了背后的黑色表盘
空间上的层次不只表现在工具栏、导航栏和状态栏的半透明效果,而是贯穿整个UI。多任务栏的home键就是iOS 7的UI如何展现空间层次的绝佳例子。双击home键会看到应用的截屏和应用的图标,不过这不重要,仔细看这里的动画效果:整个屏幕拉远后显示了其他所有正在运行的应用。点击某个应用图标又会拉近到那个应用。日历应用也有动画来提供空间层次的感觉。从年视图进入月视图再到日视图,该过程使用了精妙的过渡效果来强化空间层次的感觉。点击某个月份进入月视图,再在月视图上点击年份就会拉远。类似地,点击应用图标启动应用会拉近,不像之前的iOS版本那样从屏幕中央拉近,而是从应用图标的中心拉近。关闭应用则会产生相反的效果,会缩回图标而不是屏幕中央,以便用户知道当前的状态。
新的通知中心、控制中心,甚至还有某些模态视图控制器(比如iPod的专辑列表视图控制器)也用模糊效果来显示背后的东西。显示背后的东西能让用户知道自己在哪儿。
对于开发者来说,这些新变化中最有意思的是,在大部分情况下,如果使用UIKit来构建应用,就不需要做额外的工作让这些特性生效。在第2章中你会更加了解UIKit的新特性以及如何为iOS 7设计应用。
1.2 UIKit Dynamics和Motion Effects
iOS 7的SDK增加了能让开发者为用户界面加入运动拟真的类。任何符合UIDynamicItem协议的对象都能加上运动拟真效果。从iOS 7开始,所有的UIView都符合这个协议,所以应用中的任何UIView的子类(包括UIControl)都能加上运动拟真效果。
在iOS 7之前要实现像运动拟真一样的物理特性也是可能的,需要用到QuartsCore.framework里的动画方法。但是iOS 7的UIKit中的新API让这个任务变得非常简单。在iOS 7中实现拟真运动要比使用QuartzCore.framework容易,因为前者采用声明式写法指定UIKit的动力学行为,把动力学行为“附着”到UIView(或其子类)上即可,而后者本质上是命令式写法。
为视图添加UIDynamicAnimator并为该视图的子视图附着以下动力学行为之一—UIA- ttachmentBehavior、UICollisionBehavior、UIGravityBehavior、UIPushBehavior、UISnapBehavior,即可实现运动拟真。这些行为类暴露的属性可以用来自定义行为以及微调行为,动力学动画类会搞定剩下的事情。之前说过,实际编码过程更多是声明式的,而不是命令式的。只要告诉UIDynamicAnimator你所需要的,它就会帮你乖乖干活。
除了UIView以外,UICollectionViewLayoutAttributes也符合UIDynamicItem协议。这意味着开发者也能把动力学行为附着到集合视图单元上。一个很好的例子是内置的信息应用,上下滚动消息对话时能看到聊天气泡之间有逼真的碰撞运动效果。信息应用已经不用表格视图了,而是用集合视图和附着在其单元之上的动力学行为。
UIMotionEffect是iOS 7中增加的又一个类,它能帮助开发者为用户界面加上运动拟真。使用UIKit Dynamics能基于程序实现的物理效果实现运动拟真。用UIMotionEffect则能基于设备的运动实现运动拟真。凡是能够通过CAAnimation实现动画的都能用UIMotionEffect实现。CAAnimation的动画是时间的函数,而UIMotionEffect的动画则是设备运动的函数。
第19章会进一步介绍UIKit Dynamics和UIMotionEffect。第5章则讲到了如何用UIKit Dynamics来在集合视图上实现类似于信息应用的效果。
1.3 自定义过渡效果
在iOS 7之前,自定义过渡效果只能在用故事板创建用户界面时才能使用。通常的做法是创建一个UIStoryboardSegue的子类,覆盖perform方法来实现过渡。iOS 7把这个概念带到了一个新的高度,允许任何用pushViewController:animated:方法推入的视图控制器都能使用自定义过渡效果。这通过实现UIViewControllerAnimatedTransitioning协议就可以做到。
在第20章中,我们将学习如何用传统方法UIStoryboardSegue和新方法UIViewController- AnimatedTransitioning创建过渡效果。
1.4 新的多任务模式
从iOS 4到iOS 6,只有某些类别的应用可以在后台运行,比如需要及时得知用户位置变动的基于地理位置的应用,或者需要串流并在后台播放音乐的音乐播放器应用。但是不同于桌面版本,应用并不是真正在后台运行,而是将自己注册为周期性启动以在后台获取内容。iOS 7为UIBackgroundMode键引入了一个新值fetch来支持这种模式。
还有一种有意思的新东西是远程通知(remote-notification)的后台模式,能让应用在接收到远程通知(推送通知)时下载或获取新数据。
第9章会详细讨论新的多任务模式。
此外,bluetooth-central和bluetooth-peripheral后台模式现在支持一种新技术,叫做状态保存和恢复,它跟UIKit中的同名技术类似。蓝牙相关的多任务模式会在第13章讲到。
1.5 Text Kit
Text Kit是基于Core Text构建的快速现代Unicode文本布局引擎。Core Text严重依赖于Core- Foundation.framework,而Text Kit则更现代,使用的是Foundation.framework中的类。这也意味着与Core Text不同,Text Kit对ARC(自动引用计数)比较友好。在iOS 7之前,大部分渲染文本的UIKit组件(比如说UILabel、UITextView和UITextField)都用到了WebKit。苹果重写了这些类,并在Text Kit的基础上构建WebKit,这意味着Text Kit成了UIKit中的一等公民,开发者能够而且也应该使用Text Kit做所有的文本渲染。Text Kit以三个类(NSTextStorage、NSLayout- Manager和NSTextContainer)为中心,还有对NSAttributedString的扩展。Text Kit本身没有独立的框架,相关的类和扩展方法添加到了UIKit.framework和Foundation.framework中。你会在第21章了解到Text Kit的相关知识。
1.6 动态字体
在iOS 7中,用户可以设置文本大小,几乎所有的内置应用都会遵守这个设置,并且会基于用户的偏好改变文本大小。注意增大文本不总是会让字体的磅数变大。如果设置的文本大小可能会让渲染的小磅数文本难以辨认,iOS 7会自动加粗文本。在应用中加入动态字体的支持,就能根据iOS的设置应用中的设置来动态改变文本大小。iOS 7的动态字体有一个缺点:不支持自定义字体。你会在第21章了解到动态字体的相关知识。
1.7 MapKit集成
iOS 7更加紧密地集成了苹果地图,现在MKMapView对象可以显示3D地图了,如果你是地图供应商,同样可以用MKMapView控件,不过可以提供自己的地图块来替换内置的地图块。此外,地图供应商还能用MKDirections在不退出应用的情况下在地图上显示路线。
1.8 SpriteKit
SpriteKit是苹果对cocos2d和box2d的回应。SpriteKit提供了干净的OpenGL封装,跟QuartzCore.framework非常类似。QuartzCore.framework主要用来做UI动画,而SpriteKit则更多是服务于模拟3D(也就是2.5D)的游戏制作。本书不会讲述SpriteKit。
1.9 LLVM 5
iOS 7的另一个重大变化是Xcode 5和新的LLVM 5编译器。LLVM 5提供了用户可见的特性和性能特性。LLVM 5提供了生成armv7s和arm64指令集的完整支持,这意味着只要用LLVM 5重新编译应用,应用就可以在iPhone 5s和最新的iPad Air上运行得更快。
在C++这边,LLVM 5现在完全支持C++11标准,还用新的libc++库代替了旧的gnuc++库。
在Objective-C这边,LLVM 5增加了新的编译器警告,默认打开了几项已有的警告。比如说,编译器会提醒无用代码——那些没有任何地方会调用的代码。
可以说,最大的变化是把枚举量变成了一等公民。枚举量是类型,现在如果试图把一种枚举量转换为另外一种,LLVM 5会发出警告。
LLVM还能检测到正在使用的选择器是否在当前作用域中进行了声明,如果没有,LLVM 5会发出警告。
对Objective-C语言的加强
今年Objective-C语言有两个主要的加强,那就是模块和自动引用计数的变化。
1. 模块
苹果引入了模块,用来代替#import语句。C/C++已经用了三四十年的#import语句,在引入第三方库或框架时很好用。过去几年来,C/C++应用程序在变大,#import语句开始出现复杂的编译问题。每个.m文件都可能因为几行import语句就引入几千行代码,而且在这些import语句中,有些会在很多文件中重复出现,比如说#import 和#import
问题在于每次修改一个文件,编译器都需要编译那个文件,连带这个文件引入的代码。很明显这会让编译时间变成O(S×H),这里S是源代码文件数,而H是引入的头文件数。为了避免这个问题,一些有经验的开发者曾经尝试在头文件中写前向声明而在实现文件中用import语句,然后把常用的头文件加入预编译头文件中。这种方法在一定程度上解决了该问题,减少了一些编译时间。但是有时候在预编译头文件中加入不那么常用的头文件会造成命名空间污染,而一个写得很差的框架(定义类和宏时没有用前缀)可能会被另外一个写得很差的框架里的类覆盖。
为了解决这些问题,苹果引入了模块。模块在语义上把框架和import语句封装到了代码中,而不是把框架的内容复制粘贴到代码中。
模块可以把编译复杂度从O(S×H)降低到O(S+H),这意味着无论导入一个模块多少次,都只会编译一次。也就是说S个源文件和H个头文件会编译(S+H)次而不是(S×H)次。事实上,H个头文件会预编译到动态库dylib中,并且会自动链接,这样就能把编译时间从O(S×H)降低到O(S)。
只有最新的Xcode 5和LLVM 5编译器支持模块,更重要的是,只有最新的iOS 7 SDK才支持模块。如果你的工程必须支持iOS 6,那就只能再等等。使用模块导入内置库时,编译速度会有很大提升,尤其是大型工程。所有用Xcode 5创建的新工程都默认使用模块。用Xcode 5打开一个已有工程时,可以在Build Settings选项卡下打开模块支持,如图1-2所示。
图1-2 Xcode 5中LLVM 5的模块支持
模块还省去了在工程中显式地链接框架的麻烦,以前需要在工程设置的Build Phases选项卡中添加框架才可以做到。不过这个版本的Xcode/LLVM只对内置库提供模块支持。这一点可能会在不久的将来改变(就是iOS 8)。
2. ARC的改进
LLVM 5有了更好的循环引用检测,而且也能预测一个弱变量会不会在被块捕获之前变为空。不过更有意思的是ARC和Core Foundation类的整合。在LLVM前面的版本中,编译器规定必须用桥接转换,即使对象的所有权没有变化。有了LLVM 5,这种情况会变成自动的。这意味着如果没有所有权变化,就无需再在Core Foundation对象和对应的Foundation对象之间用桥接转换了。
第20章会详细解释Core Foundation和ARC的改进。
1.10 Xcode 5
Xcode 4是苹果很有野心的项目。2011年,苹果完全抛弃了Xcode 3时代独立的Xcode和Interface Builder这个已经存在了近10年的组件,把编辑Interface Builder文件的功能集成到了Xcode中。不过,Xcode 4运行缓慢,还经常崩溃,在一些WWDC的讲座上也发生过这类情况。
Xcode 4性能差的主要原因是它使用旧的GCC编译器,而且用了垃圾回收(而不是ARC)。Xcode 5在面向用户上的变化很少,但是从头开始的。它是用LLVM 5编译的,用ARC重写过,这意味着它的内存使用更高效,在的机器上运行更快。
1.10.1 nib文件格式的变化
Xcode 5的一个主要变化是引入了一种更易读的新nib文件格式。格式仍然是XML,但是对人类更友好。这意味着作为开发者,解决XIB文件中的合并冲突会容易得多。
不过新文件格式和旧版Xcode不兼容,但是大部分情况下这都不会是问题。确保团队中所有开发者都用最新的Xcode。Xcode 4.6无法打开新的文件格式。
1.10.2 源代码控制集成
Xcode 5现在支持合并和切换Git分支。Xcode 5还能在不离开IDE的情况下从远程仓库推送和拉取提交。这意味着开发者可以在Xcode以外花费更少的时间(无论是终端还是第三方的Git客户端),而把更多的精力放在Xcode中。
1.10.3 自动配置
Xcode 4已经集成了iOS开发者账号,允许开发者自动创建和下载授权文件。Xcode 5把这种集成带到了更高的层次上,开发者可以使用Apple ID登录Xcode 。Xcode 5会自动获取开发者合作的团队,并把它们连接到Xcode。开发者甚至可以把一个团队指定给一个项目,Xcode会自动在开发者网站上创建必需的授权文件。
Xcode 5新增了一种特性叫capabilities,能让开发者在Xcode中设置高级的苹果特性,比如打开应用内购买、iCloud或者Game Center。Xcode现在会根据新的App ID自动下载必需的授权文件,如果有必要的话甚至会更新Info.plist文件。
1.10.4 对调试导航面板的改进
Xcode的调试导航面板现在可以在Xcode中就显示实时的应用程序内存、CPU使用以及电量消耗。不再需要频繁地启动Instruments来测量应用的性能。调试导航面板还允许开发者从Xcode中启动以CPU或内存检测工具运行的Instruments。图1-3和图1-4显示了Xcode 5中的CPU和内存报告功能。
图1-3 Xcode 5的调试导航面板中显示的当前运行应用的CPU使用
图1-4 Xcode 5的调试导航面板中显示的当前运行应用的内存使用
1.10.5 文档浏览器
Xcode 5有了全新的支持选项卡浏览的文档浏览器,开发者可以为文档页添加书签(不幸的是文档书签不支持iCloud同步)。目录现在是在文档内容外面用一个单独的选项卡显示的。
Dash是一个第三方应用程序,要比Xcode 5的文档浏览器好很多,也快很多。它在Mac App Store中是免费的,强烈推荐读者下载。Dash能自动找到Xcode安装的文档,也能提供第三方文档,比如cocos2d。
1.10.6 Asset Catalog
Asset Catalog提供了一种新的方式来为应用中的图片分组。Asset Catalog包含图片集(应用中用到的图片和资源)、应用图标和启动图。这些启动图、应用图标和图片集会基于设计它们所针对的设备来分组。
Asset Catalog是一个Xcode的特性,所以就算应用需要支持iOS 6也能使用。在iOS 6上,Xcode会确保UIImage的imageNamed:方法会返回catalog中的正确图片。在iOS 7上,Xcode 5会把Asset Catalog编译成运行时二进制文件(.car文件),能减少应用下载的时间。
Asset Catalog还提供了一种创建可拉伸图片的方法,能让开发者在图片中指定可拉伸的区域。开发者要做的只是在Asset Catalog中选择一张图片,在图片顶部点击Start Slicing按钮,调整切片区域来指定可拉伸的区域。可以选择只垂直拉伸、只水平拉伸或者两个方向都拉伸。
不过,用Asset Catalog创建可拉伸区域(见图1-5)只能在以iOS 7及后续版本为部署目标的工程中使用。
图1-5 在Asset Catalog的图片集中创建可拉伸区域
1.10.7 测试导航面板
Xcode 5让编写单元测试用例成了一等公民。在Xcode 5中创建的所有新工程都会自动包含新的测试框架XCTest.framework,用来代替OCUnit(SenTestingKit.framework)。Xcode 5中还是带SenTestingKit.framework,Xcode 5有一个选项可以自动把OCUnit的测试用例转换为XCTest。这么做的好处在于可以方便地用xcodebuild这样的命令行工具做测试。除了前一个版本的Xcode中已有的7种导航面板,Xcode还增加了一个新的导航面板叫测试导航面板。测试导航面板可以显示开发者编写的测试用例的执行情况。
可以创建一种新断点,用来在测试失败的时候停止程序执行,如图1-6所示。这种断点可以在断点导航面板中添加。
图1-6 添加测试失败断点
1.10.8 持续集成
Xcode 5通过Xcode服务(在OS X Mavericks服务器上运行)支持持续集成。开发者现在可以创建自动执行“每次提交都运行静态分析”或者“在每晚12点编译产品”等操作的机器人。
这类机器人运行在OS X Mavericks服务器上,开发者在客户端的测试导航面板中就能看到结果。
Xcode 5没有原生的Jenkins支持,Jenkins是普遍使用的持续集成工具。开发者仍然需要手动捣鼓命令行、shell脚本,甚至是提交后的钩子。Xcode 5也不支持OS X Mountain Lion服务器的持续集成。不过,用Xcode 5和OS X Mavericks有个小小的好处,诸如断点测试等代码问题会出现在客户端的测试导航面板中。
1.10.9 Auto Layout改进
Xcode 5改进了开发者使用Auto Layout的工作流。最大的变化是Xcode不会自动添加Auto Layout约束条件。开发者必须亲自动手让Xcode为我们添加约束条件,开发者也能删除Xcode添加的约束条件。如果删除的约束条件会导致布局歧义,Xcode会发出警告。如果不能同时满足几个约束条件,Xcode也会发出警告。Auto Layout和Xcode 5的变化无法用一节内容描述清楚,所以我们为此添加了一整章的内容,也就是第6章。
1.10.10 iOS模拟器
现在iOS模拟器支持iCloud了,而且在iOS模拟器中运行的应用可以访问iCloud的数据了。不过iOS模拟器不再支持低功耗蓝牙的模拟。(关于蓝牙的支持详见第13章。)
1.11 其他
除了LLVM编译器、Xcode IDE这些新东西,iOS 7也加强了UIActivityViewController来支持用AirDrop与附近的设备共享数据。一种称为Multipeer Connectivity的类似的技术,能让开发者在不需要热点的情况下就连接附近的设备并发送任意数据。Multipeer Connectivity还能在附近设备用点对点WiFi网络的方式连接着别的WiFi热点的情况下与其连接。
1.12 小结
呼!好多变化。前面说过iOS 7是iOS诞生以来最大的升级,对于用户和开发者来说都是大事。
iOS的升级速率一直要比竞争对手快很多。在写作本书时,根据各大网站的统计,iOS 7已经占据了市场上70%以上的设备,而iOS 6只占不到20%。事实上,iOS 7在发布的第一周就被30%以上的设备接纳了。
如果在App Store上已经有了应用,那可以考虑把它当做只针对iOS 7的新应用重写,然后和旧版应用一起卖。当大量用户升级到iOS 7之后,就可以把旧版应用从App Store下架了。对最终用户来说,有很多杀手级的特性,比如全新的用户界面、iTunes Radio、Air Drop以及更强的多任务,都会加快他们升级系统。所以,为什么还要等呢?让我们从下一章全新的UI范例开始iOS 7之旅吧。
1.13 扩展阅读
1. 苹果文档
下面的文档位于iOS Developer Library (https://developer.apple.com/library/ios/navigation/index.html)中,通过Xcode Documentation and API Reference也可以找到。
What’s New in iOS 7
What’s New in Xcode
Xcode Continuous Integration Guide
iOS 7 UI Transition Guide(TP40013174 1.0.43)
Assets Catalog Help
2. WWDC讲座
下面的讲座视频可以在developer.apple.com找到。
WWDC 2013“Session 400: What's new in Xcode 5”
WWDC 2013“Session 402: What is new in the LLVM compiler”
WWDC 2013“Session 403: From Zero to App Store using Xcode 5”
WWDC 2013“Session 406: Taking control of Auto Layout in Xcode 5”
WWDC 2013“Session 409: Testing in Xcode 5”
WWDC 2013“Session 412: Continuous integration with Xcode 5”