iOS开发指南:从零基础到App Store上架(第2版 )

第一部分 基础篇
  第1章 开篇综述 2
  1.1  iOS概述 2
  1.1.1  iOS介绍 2
  1.1.2  iOS 6新特性 2
  1.2  开发环境及开发工具 3
  1.3  本书中的约定 4
  1.3.1  案例代码约定 4
  1.3.2  图示的约定 5


  第2章 第一个iOS应用程序 7
  2.1  创建基于nib的HelloWorld工程 7
  2.1.1  创建工程 7
  2.1.2  Xcode中的iOS工程模板 10
  2.1.3  应用剖析 11
  2.2  基于故事板的HelloWorld工程 13
  2.2.1  使用故事板重构HelloWorld 14
  2.2.2  nib、xib与故事板 15
  2.2.3  故事板中的Scene和Segue 16

SceneSegue(参见图2-19)是故事板中非常重要的两个概念。每个视图控制器都会对应一个SceneScene
翻译为“场景”,可以理解为应用的一个界面或屏幕,在这个屏幕中有很多视图或控件,相当于一个xib。这些Scene
之间通过Segue连接,Segue不但定义了Scene之间的跳转(或导航)方式,还体现了Scene之间的关系。跳转的类
型分为:PushModalPopover和自定义方式。Scene跳转类型还要跟具体的控制器结合使用。Push是树形导航模
式,Modal是模态导航模式,Popover是呈现浮动窗口,这些导航模式我们会在后面介绍。

  2.3  应用生命周期 17

作为应用程序的委托对象, AppDelegate类在应用生命周期的不同阶段会回调不同的方法。


下面简要介绍一下iOS应用的5种状态。
Not Running(非运行状态)。应用没有运行或被系统终止。
Inactive(前台非活动状态)。应用正在进入前台状态,但是还不能接受事件处理。
Active(前台活动状态)。应用进入前台状态,能接受事件处理。
Background(后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,
如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态。
Suspended(挂起状态)。处于挂起的应用进入一种“冷冻”状态,不能执行代码。如果系统内存不够,
应用会被终止。

application:didFinishLaunchingWithOptions:UIApplicationDidFinishLaunchingNotification
应用启动并进行初始化时会调用该方法并发出通知。这个阶段会实例化根视图控制器
applicationDidBecomeActive: UIApplicationDidBecomeActiveNotification
应用进入前台并处于活动状态时调用该方法并发出通知。这个阶段可以恢复UI的状态(例如游戏状态等)
applicationWillResignActive: UIApplicationWillResignActiveNotification
应用从活动状态进入到非活动状态时调用该方法并发出通知。这个阶段可以保存UI的状态(例如游戏状态等)
applicationDidEnterBackground: UIApplicationDidEnterBackgroundNotification
应用进入后台时调用该方法并发出通知。这个阶段可以保存用户数据,释放一些资源 (例如释放数据库资源等)
applicationWillEnterForeground: UIApplicationWillEnterForegroundNotification
应用进入到前台,但是还没有处于活动状态时调用该方法并发出通知。这个阶段可以恢复用户数据
applicationWillTerminate: UIApplicationWillTerminateNotification
应用被终止时调用该方法并发出通知,但内存清除时除外。这个阶段释放一些资源,也可以保存用户数据

  2.3.1  非运行状态——应用启动场景 18

Not running→Inactive→Active

Not running→Inactive阶段。调用application:didFinishLaunchingWithOptions:方法,发出UIApplicationDidFinishLaunchingNotification通知。

Inactive→Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。


  2.3.2  点击Home键——应用退出场景 19

HelloWorld-Info.plist文件该设置项对应的键是UIApplicationExitsOnSuspend
1. Active → Inactive → Background→Suspended
Active→Inactive阶段。调用applicationWillResignActive:方法,发出UIApplicationWillResignActiveNotification通知。
Inactive→Background阶段。应用从非活动状态进入到后台(不涉及我们要重点说明的方法和通知)。
Background→Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。

2. 应用不可以在后台运行

Active → Inactive → Background→Suspended→Not running
Active→Inactivd阶段。应用由活动状态转为非活动状态(不涉及我们要重点说明的方法和通知)。
Inactive→Background阶段。应用从非活动状态进入到后台(不涉及我们要重点说明的方法和通知)。
Background→Suspended阶段。调用applicationDidEnterBackground:方法,发出UIApplicationDidEnterBackgroundNotification通知。
Suspended→Not running阶段。调用applicationWillTerminate:方法,发出UIApplicationWillTerminateNotification通知。

  2.3.3  挂起重新运行场景 20

Suspended → Background → Inactive → Active
Suspended→Background阶段。应用从挂起状态进入后台(不涉及我们讲述的这几个方法和通知)。
Background→Inactive阶段。调用applicationWillEnterForeground:方法,发出UIApplicationWillEnterForegroundNotification通知。
Inactive→Active阶段。调用applicationDidBecomeActive:方法,发出UIApplicationDidBecomeActiveNotification通知。

  2.3.4  内存清除——应用终止场景 21
  2.4  视图生命周期 21
  2.4.1  视图生命周期与视图控制器关系 22

在视图不同的生命周期中,视图控制器会回调不同的方法

didReceiveMemoryWarning:方法的主要职能是释放内存,包括视图控制器中的一些成员变量和视图的释放。现举例如下:


  2.4.2  iOS 6 UI状态保持和恢复 23

以下3种地方实现状态保持和恢复:
应用程序委托对象
视图控制器
自定义视图

Restoration ID(恢复标识)为viewController
恢复标识是iOS为了实现UI状态保持和恢复添加的设置项目。我们还需要在应用程序委托对象AppDelegate
码部分做一些修改,添加的代码如下:
-(BOOL) application:(UIApplication *)application shouldSaveApplicationState:
(NSCoder *)coder
{
return YES;
}

-(BOOL) application:(UIApplication *)application shouldRestoreApplicationState:
(NSCoder *)coder
{
return YES;
}
- (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:
(NSCoder *)coder
{
[coder encodeFloat:2.0 forKey:@"Version"];
}
- (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:
(NSCoder *)coder
{
float lastVer = [coder decodeFloatForKey:@"Version"];



其中application:shouldSaveApplicationState:方法在应用退出时调用,负责控制是否允许保存状态,返
YES情况是可以保存,NO是不保存。
application:shouldRestoreApplicationState:方法在应用启动时调用,负责控制是否恢复上次退出
时的状态,返回YES表示可以恢复,返回NO表示不可以恢复。
application:willEncodeRestorableStateWithCoder:方法在保存时调用,在这个方法中实现UI状态
或数据的保存,其中[coder encodeFloat:2.0 forKey:@"Version"]语句是保存简单数据。
application:didDecodeRestorableStateWithCoder:方法在恢复时调用,在这个方法中实现UI状态或
数据的恢复,其中[coder decodeFloatForKey:@"Version"]语句用于恢复上次保存的数据。
想要实现具体界面中控件的保持和恢复,还需要在它的视图控制器中添加一些代码。我们在ViewController.m
中添加的代码如下:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
 {
[super encodeRestorableStateWithCoder:coder];
[coder encodeObject:self.txtField.text forKey:kSaveKey];
}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
[super decodeRestorableStateWithCoder:coder];
self.txtField.text = [coder decodeObjectForKey:kSaveKey];
}

iOS 6之后,视图控制器都添加了两个方法——encodeRestorableStateWithCoder:decodeRestorableStateWithCoder:,用来实现该控制器中的控件或数据的保存和恢复。其中encodeRestorableStateWithCoder:
方法在保存时候调用, [coder encodeObject:self. txtField.textforKey:kSaveKey]语句是按照指定的键保存
文本框的内容,decodeRestorableStateWithCoder:方法在恢复时调用,[coder decodeObjectForKey:kSaveKey]
在恢复文本框内容时调用,保存和恢复事实上就是向一个归档文件中编码和解码的过程。
为了测试是否能够保持和恢复,我们可以将工程属性文件HelloWorld-Info.plist中的相关属性Application does
not run in background设置为YES,使应用退出时终止程序的运行

  2.5  设置产品属性 25

为了禁止应用在后台运行,我们将HelloWorld-Info.plist文件中的Application

does not run in background属性修改为YES(即UIApplicationExitsOnSuspend = YES) ,这项操作就属于
产品属性的设置。

  2.5.1  Xcode中的Project和Target 25

一个工程只有一个Project,但可以有一个或多个Target
首先,依次选择File→New→Target菜单项,此时会弹出一个模板选择对话框

  2.5.2  设置常用的产品属性 27

Target继承了Project。对于TargetProject下都有的设置项,可根据需要对Target进行再设置,此设置可覆盖Project的设置。
1. 设定屏幕方向
2. 设置设备支持情况

  2.6  iOS API简介 29

1. Cocoa Touch
该层提供了构建iOS应用的一些基本系统服务(如多任务、触摸输入和推送通知等)和关键框架(见表2-3)。
2-3 Cocoa Touch层包括的框架
框 架           前 缀        说 明
Address Book UI   AB         访问用户的联系人信息
Event Kit UI     EK           访问用户的日历事件数据
Game Kit         GK          提供能够进行点对点的网络通信的API
iAd              AD            在应用中嵌入广告
Map Kit          MK          在应用中嵌入地图和地理信息编码等
Message UI       MF          提供与发送E-mail相关的API
Twitter          TW            提供发送Twitter的接口
UIKit            UI           提供UI
2. Media
Media层提供了图形、音频、视频和AirPlay技术,包括的框架如表2-4所示。
2-4 Media层包括的框架
框 架              前 缀          说 明
Assets Library      AL             提供访问用户的图片和视频的接口

AudioToolbox         Audio         录制或播放音频、音频流以及格式转换
AudioUnit Audio,    AU             提供使用内置音频单元服务,以及音频处理模块
AV Foundation       AV             提供播放与录制音频和视频的Objective-C接口
Core Audio          Audio           提供录制、制作、播放音频的C语言接口
Core Graphics       CG             提供Quartz 2D接口
Core Image          CI               提供操作视频和静态图像的接口
Core MIDI            MIDI             提供用于处理MIDI数据低层的API
Core Text             CT             提供渲染文本和处理字体的简单、高效的C语言接口
Core Video          CV                提供用于处理音频和视频的API
Image I/O            CG             包含一些读写图像数据类
GLKit               GLK             包含了构建复杂OpenGL ES应用的Objective-C实用类
Media Player        MP              包含全屏播放接口
OpenAL              AL              包含了OpenAL(跨平台的音频)的C语言接口
OpenGL ES EAGL,    GL              包含OpenGL ES(跨平台的2D/3D图形库)的C语言接口
Quartz Core        CA               提供动画接口类
Sprite Kit           SK              是苹果提供的基于2D2.5D游戏的开发引擎,可以开发iOSMac OS X下的游戏。

3. Core Services
该层提供了iCloud、应用内购买、SQLite数据库和XML支持等技术,包括的主要框架如表2-5所示。
2-5 Core Services层包括的框架
框 架 前 缀 说 明
Accounts AC 用于访问用户的Twitter账户(iOS 5之后才有此API
AddressBook AB 访问用户的联系人信息
AdSupport AS 获得iAD广告标识
CFNetwork CF 提供了访问Wi-Fi网络和蜂窝电话网络的API
Core Data NS 提供管理应用数据的ORM接口
CoreFoundation CF 它是iOS开发中最基本的框架,包括数据集
Core Location CL 提供定位服务的API
CoreMedia CM 提供AV Foundation框架使用的底层媒体类型。可以精确控制音频或视频的创建及展
CoreMotion CM 接收和处理重力加速计以及其他的运动事件
CoreTelephony CT 提供访问电话基本信息的API
Event Kit EK 访问用户的日历事件数据
Foundation NS Core Foundation框架的许多功能提供Objective-C封装,是Objective-C最为基本框架

JavaScriptCore.framework JS提 供 了 基 于Objective-C语 言 封 装 的 标 准 JavaScript 对 象 , 通 过 该 框 架 可 以 实 现
Objective-CJavaScript之间的相互调用
MobileCoreServices UT 定义统一类型标识符(UTI)使用的底层类型
Newsstand Kit NK 提供在后台下载杂志和新闻的API接口(iOS 5之后才有此API
Pass Kit PK 提供访问各种优惠券的APIiOS 6之后才有此API
QuickLook QL 该框架可以预览无法直接查看的文件内容,例如打开PDF文件
Social SL 提供社交网络访问API,中国区提供新浪微博APIiOS 6之后才有此API
Store Kit SK 提供处理应用内置收费的资金交易
SystemConfiguration SC 用于确定设备的网络配置(例如,使用该框架判断Wi-Fi或者蜂窝连接是否正在使用
中) ,也可以用于判断某个主机服务是否可以使用


4. Core OS
该层提供了一些低级功能,开发中一般不直接使用它。该层包括的主要框架如表2-6所示。
2-6 Core OS层包括的框架
框 架 前 缀 说 明
Accelerate AC 访问重力加速计API
Core Bluetooth CB 访问低能耗蓝牙设备API
External Accessory EA 访问外围配件API接口
Generic Security Services gss提供一组安全相关的服务
Security CSSMSec管理证书、公钥、私钥和安全信任策略API

.6.1  API概述 29

  2.6.2  如何使用API帮助 31

如果想查询比较完整的、全面的帮助文档,可以按住Alt键双击didReceiveMemoryWarning方法名,这样就会打开一个XcodeAPI帮助文档

  2.7  小结 33

IOS-Foundation框架结构,iosfoundation框架


这些东西,等用的时候查资料就行,用的多了,自然就记住了,大概过一下

发现一个不错的 ios 学习博客:http://www.cnblogs.com/kenshincui,非常好,推荐看看。FOundation系列笔记,是作为个人复习用,内容除了书本,个人经验还有一些是借鉴的它的博文。

Foundation 框架

它是IOS应用程序开发的基础,常用的框架有80多个,而 foundation 是他们所有的基础,提供了许多基本的对象类和数据类型,比如数字,字符串,数组,集合,字典,处理日期时间,自动化内存管理,文件,归档,处理几何数据结构等。它为所有应用程序提供基本的数据服务,

Foundation和界面无关,其前缀为NS 。

在Foundation中有些类仅被MAC OS支持而不被IOS支持。 

IOS 或者 MAC OS 里面的Cocoa是什么呢?

Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。我们通常称为“Cocoa框架”。

Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的“Foundation”和“UIKit”。

前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库,以后我们在IOS开发中会经常用到。这两个框架在系统中的位置如下图:

所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中,具体的类结构如下:

通常分为:

UIKit主要用于界面构架,这里我们不妨也看一下它的类结构:

 




第3章 UIView与控件  
3.1  视图“始祖”--UIView  
Objective-C中,NSObject是所有类的“根”类。同样,在UIKit框架中,也存在一个如此神奇的类UIView从继承关系上看,UIView是所有视图的根,我们形象地称其为“始祖”。

3.1.1  UIView“家族” 
UIView“家族”大体分为“控件”和“视图”两类,二者均继承于UIView


 

UIControl类是控件类,其子类有UIButtonUITextFieldUISilder等。之所以称它们为“控件类”,是因为它们都有能力响应一些高级事件。
其中Send Events栏中的内容就是UIButton相对应的高级事件UIControl类以外的视图没有这些高级事件,
这可以借助HelloWorld工程中的Label控件验证一下。选中UILabel控件,打开连接检查器,如图3-3所示。可以发
UILabel的连接检查器中没有Send Events栏,即没有高级事件,不可以响应高级事件。
事实上,视图也可以响应事件,但这些事件比较低级,需要开发人员自己进行处理。很多手势的开发都以这
些低级事件为基础的。
 
3.1.2  应用界面的构建层次  
如图3-4所示是一个应用界面的构建
层次图,该应用有一个UIWindow,其中包含一个UIView根视图。根视图下又有3个子视图——Button1Label2
UIView(View2),其中子视图UIView(View2)中存在一个按钮Button3

应用界面的构建层次是一种树形结构,UIWindow是“树根”,根视图是“树干”,其他对象为树冠。在层次
结构中,上下两个视图是“父子关系”。除了UIWindow,每个视图的父视图有且只有一个,子视图可以有多个。
superview。获得父视图对象。
subviews。获得子视图对象集合。
window。获得视图所在的UIWindow对象。

3.1.3  视图分类  
 
为了便于开发,苹果将UIKit框架中的视图分成以下几个类别。
控件。继承自UIControl类,能够响应用户高级事件。
窗口。它是UIWindow对象。一个iOS应用只有一个UIWindow对象,它是所有子视图的“根”容器。  (ios应用一个应用只启动一个UIWindow ,而android 每一个activity对应一个UIWindow)
容器视图。它包括了UIScrollViewUIToolbar以及它们的子类。UIScrollView的子类有UITextViewUITableViewUICollectionView,在内容超出屏      幕时,它们可以提供水平或垂直滚动条。UIToolbar是非常特殊的容器,它能够包含其他控件,一般置于屏幕底部,特殊情况下也可以置于屏幕顶部。
显示视图。用于显示信息,包括UIImageViewUILabelUIProgressViewUIActivityIndicatorView等。
文本和Web视图。提供了能够显示多行文本的视图,包括UITextViewUIWebView,其中UITextView也属于容器视图,UIWebView是能够加载和显示HTML代      码的视图。
导航视图。为用户提供从一个屏幕到另外一个屏幕的导航(或跳转)视图,它包括UITabBarUINavigationBar
警告框和操作表。用于给用户提供一种反馈或者与用户进行交互。UIAlertView视图是一个警告框,它会以动画形式弹出来;而UIActionSheet视图给用户提供可选的操作,它会从屏幕底部滑出。
 
在后面章节中,很多视图(如UILabel、文本视图和进度条等)并未继承UIControl类,但我们也习惯
称之为“控件”,这是开发中约定俗成的一种常用归类方式,与严格意义上的概念性分类有差别。

3.2  标签控件和按钮控件 
3.2.1  标签控件 
 
3.2.2  按钮控件  

3.2.3  动作和输出口  
3.3  TextField控件和TextView控件  
3.3.1  TextField控件  
3.3.2  TextView控件  
3.3.3  键盘的打开和关闭  
3.3.4  关闭和打开键盘的通知  
3.3.5  键盘的种类  
3.4  开关控件、滑块控件和分段控件  
3.4.1  开关控件  
3.4.2  滑块控件  
3.4.3  分段控件

分段控件也是一种选择控件,其功能类似于Windows中的单选按钮。它由两段或更多段构成,每个段相当于
一个独立的按钮。它有三种样式——PlainBorderedBar样式,但是iOS 7之后这三种样式没有什么区别,都如
3-29所示。
  
3.5  网页控件WebView  
UIKit中的UIWebView类能够为用户提供显示多行文本的视图,能够冠以“Web”就说明它可以使用Web等技
术进行显示HTML、解析CSS和执行JavaScript等操作。事实上,UIWebView的内核是开源的WebKit浏览器
引擎。
从桌面到移动应用开发,一直有两大阵营的争论,关于是本地好还是Web好的话题本书不做过多讨论,只是
给出技术解决方案。事实上,除了本地和Web应用,我们还有第三条路可以走——HybridHybrid是本地+Web
混合产物,而WebView控件是Hybrid应用的关键技术,它不仅是负责解析HTML的控件,更是本地和Web进行沟通
的桥梁。

3.5.1  WebView介绍  

3.5.2  使用WebView构建Hybrid应用 
Hybrid应用同时融合了本地技术和Web技术,它能够同时发挥本地技术和Web技术各自的优势。纯Web技术的
应用虽然禁止在App Store中发布,但Hybrid却可以获得发布许可。有一个Hybrid框架——PhoneGaphttp://phonegap.
com/)用于移动平台的开发

PhoneGap现在被Adobe收购了,它为开发者提供了13个调用本地的API,采用的是JavaScriptCSS3
HTML5Web技术。PhoneGap的理想情况是不需要本地技术,而只用Web技术就可以完成本地移动应用
的开发。
 
这里我们简要介绍一下PhoneGap的基本核心原理,包括内容:
本地代码调用JavaScript
JavaScript调用本地代码
WebView是实现Hybrid应用的核心,也是实现本地技术和Web技术融合
的核心。所有移动平台都有类似WebView的控件: 在iOS平台中是UIWebView
Android平台中是WebViewWindows Phone平台中是WebBrowser
下面我们通过一个案例来了解如何通过本地代码调用JavaScript代码以及如
何通过JavaScript来调用本地代码。如图3-33所示,该界面是WebView。在案例启
动的时候,WebView页面加载的时候,本地代码会调用JavaScript函数,并在
WebView页面中输出“从iOS对象中调用JS Ok.”字符串。在WebView页面可以点
击“调用iOS对象”按钮(这是一个HTML按钮),来调用iOS本地代码在日志输
出一些内容。
使用Single View Application模板,创建一个名为MyPhoneGap的工程。打开
Interface Builder设计界面,拖曳一个WebView


3.6  屏幕滚动控件ScrollView  
3.6.1  ScrollView属性的设置
它有两个子类——UITextViewUITableView它们在内容超出屏幕时提供水平或垂直滚动条。还有UICollectionView

  
3.6.2  键盘与其他控件的协同  
3.7  等待相关的控件与进度条  
3.7.1  活动指示器ActivityIndicatorView  
3.7.2  进度条ProgressView  
3.8  警告框和操作表  
3.8.1  警告框AlertView  
3.8.2  操作表ActionSheet  
3.9  工具栏和导航栏  
3.9.1  工具栏  
3.9.2  导航栏  
3.10  屏幕布局  
3.10.1  iPad、iPhone和iPhone 5屏幕布局  

iPhone 4之前,屏幕的物理尺寸为3.5英寸,屏幕分辨率是480×320像素。iPhone 4iPhone 4S
用视网膜屏幕技术,屏幕的物理尺寸为3.5英寸,分辨率达到了960×640像素。iPhone 5采用视网膜屏幕技术,屏幕
物理尺寸为4英寸,分辨率是1136×640像素。

Interface Builder设计器中,屏幕或控件的尺寸以点(point)为单位。在视网膜屏幕技术中,1个点包括了4
个像素,而没有采用视网膜屏幕技术的还是1个点包括1个像素。因此,也可以说iPhone 5之前的手机的分辨率
480×320点,iPhone 5的分辨率是568×320点。 为了方便设计,若无特殊说明,屏幕或控件尺寸的单位是“点”。



iPadiPhone屏幕布局中,一般会有状态栏、工具栏、导航栏以及内容视图部分,它们的尺寸也是固定的。
如图3-64所示,在iPhone竖屏幕中,状态栏占用20点,导航栏(或工具栏)占用44点,标签栏占用49点。实际上,
这些尺寸在iPhone横屏幕和iPad上也保持不变。

3.10.2  绝对布局和相对布局  
3.10.3  使用AutoLayout布局
AutoLayout为空间布局定义了一套约束(constraint),
约束定义了控件与视图之间的关系。约束定义可以通过Interface Builder或代码实现,因为通过Interface Builder
定约束相对简单直观,所以本书重点向读者推荐这种方式。

  
3.10.4  旋转你的屏幕  
3.11  选择器  
3.11.1  日期选择器  

日期选择器有4种模
式:日期、日期时间、时间和倒计时定时器,

3.11.2  普通选择器  
3.11.3  数据源协议与委托协议  

UITextField控件不同,UIPickerViewUITableView等复杂控件除了委托协议外,还有数据源协议。
UIPickerView的委托协议是UIPickerViewDelegate,数据源是UIPickerViewDataSource
在上一章中,我们介绍委托设计模式的时候也提到过数据源。数据源与委托一样,都是委托设计模式的具体
实现,只不过它们的角色不同:委托对象负责控制控件外观,如选择器的宽度、选择器的行高等信息,此外,还
负责对控件的事件和状态变化作出反应。数据源对象是控件与应用数据(模型)的桥梁,如选择器的行数、拨轮
数等信息。委托中的方法在实现时是可选

UIPickerViewDataSource中的方法有如下两种。
numberOfComponentsInPickerView:。为选择器中拨轮的数目。
pickerView:numberOfRowsInComponent:。为选择器中某个拨轮的行数


3.12  集合视图  
3.12.1  集合视图介绍  

为了增强网格视图开发,iOS 6中开放了集合视图API。这种网格视图的开源代码在开源社区中很早就有,但
是都比较麻烦,而iOS 6的集合视图API使用起来却非常方便。

3.12.2  集合视图单元格  
3.12.3  数据源协议与委托协议  
3.13  小结  

第4章 表视图  
视图是iOS开发中使用最频繁的视图。一般情况下,我们都会选择以表的形式来展现数据,比如通讯录和
频道列表等。在表视图中,分节、分组和索引等功能使我们所展示的数据看起来更规整、更有条理。更令人兴奋
的是,表视图还可以利用细节展示等功能多层次地展示数据。但与其他控件相比,表视图的使用相对比较复杂

4.1  概述  
本节中,我们将了解表视图中的一些概念、相关类、表视图的分类、单元格的组成和样式以及表视图的两
个协议——UITableViewDelegate委托和UITableViewDataSource数据源。

4.1.1  表视图的组成  
表头视图(table header view。表视图最上边的视图,用于展示表视图的信息,例如表视图刷新信息,
如图4-2所示。
表脚视图(table footer view
单元格(cell。它是组成表视图每一行的单位视图。
节(section
节头。节的头,描述节的信息,如图4-3所示,文字左对齐。
节脚

4.1.2  表视图的相关类  
表 视 图 (UITableView)继 承 自UIScrollView, 它 有 两 个 协 议 :UITableViewDelegate委 托 协 议 和
UITableViewDataSource数据源协议。

4.1.3  表视图分类  
普通表视图。主要用于动态表,而动态表一般在单元格数目未知的情况下使用。
分组表视图。一般用于静态表,用来进行界面布局,它会将表分成很多“孤岛”,这个“孤岛”由一些类
似的单元格组成,从图4-6可以看出扁平化后的iOS 7分组表视图有很大的变化。静态表一般用于控件的界
面布局,它是在iOS 5之后由故事板提供的。

4.1.4  单元格的组成和样式  
4.1.5  数据源协议与委托协议  
4.2  简单表视图  
4.2.1  创建简单表视图  
4.2.2  自定义单元格  
4.2.3  添加搜索栏  
4.3  分节表视图  
4.3.1  添加索引  
4.3.2  分组与静态表  
4.4  修改单元格  
4.4.1  删除和插入单元格  
表视图一旦进入删除和插入状态,单元格的左边就会出现一个“编辑控件”,如图4-48所示。这个区域会显示删
除控件 或插入控件 ,具体显示哪个图标在表视图委托协议的tableView:editingStyleForRowAtIndexPath:
方法中设定。

4.4.2  移动单元格  
4.5  表视图UI设计模式  

4.5.1  分页模式  
根据触发方式的不同,请求分为主动请求和被动请求。(主动请求就是在滑动到底部的时候另外再加载50条,被动请求则在底部放一个button点击之后重新加载)

4.5.2  下拉刷新模式  
下拉刷新是重新刷新表视图或列表,以便重新加载数据,这种模式广泛用于移动平台。

下拉刷新与分页相反,
当翻动屏幕到顶部时,再往下拉屏幕,程序就开始重新请求数据,此时表视图的表头部分会出现活动指示器,请求结束后表视图表头消失。
在很多开源社区中,都有下拉刷新的实现代码供大家参考,比如Github上的githttps://github.com/leah/PullToRefresh.git

4.5.3  iOS 7下拉刷新控件  
随着下拉刷新模式的影响力越来越大,苹果不得不考虑把它列入自己的规范之中,并在iOS 6 API中推出了下
拉刷新控件。图4-65所示的是iOS 6中的下拉刷新,有点像是在拉“胶皮糖”,当这个“胶皮糖”拉断时,就会出
现活动指示器

4.6  小结  

第5章 视图控制器与导航模式  
5.1  概述  
5.1.1  视图控制器的种类  
UIViewController。用于自定义视图控制器的导航。例如,对于两个界面的跳转,我们可以用一个
UIViewController来控制另外两个UIViewController
UINavigationController。导航控制器,它与UITableViewController结合使用,能够构建树形结
构导航模式。
UITabBarController。标签栏控制器,用于构建树标签导航模式。
UIPageViewController。呈现电子书导航风格的控制器。
UISplitViewController。可以把屏幕分割成几块的视图控制器,主要为iPad屏幕设计。
UIPopoverController。呈现“气泡”风格视图的控制器,主要为iPad屏幕设计。

5.1.2  导航模式
  
5.1.3  模态视图  
在导航过程中,有时候需要放弃主要任务转而做其他次要任务,然后再返回到主要任务,这个“次要任务”
就是在“模态视图”中完成的。图5-4为模态视图示意图,该图中的主要任务是登录后进入主界面,如果用户没有
注册,就要先去“注册”。“注册”是次要任务,当用户注册完成后,他会关闭注册视图,回到登录界面继续进行
主任务。

5.2   平铺导航  
5.2.1  应用场景  
5.2.2  基于分屏导航的实现  
5.2.3  基于分页导航的实现  
5.3  标签导航  
标签导航模式是非常重要的导航模式。使用标签栏时,有一定的指导原则:标签栏位于屏幕下方,占有49
的屏幕空间,有时可以隐藏起来;为了点击方便,标签栏中的标签不能超过5个,如果超过5个,则最后一个显示
为“更多”,点击“更多”标签会出现更多的列表,

5.3.1  应用场景  
5.3.2  实现  
5.4  树形结构导航  
对于每一个城市,如果还想看到更加详细的信息,比如想知道长春市在百度百科上的信息网址http://
baike.baidu.com/view/2172.htm,这种情况下吉林省长春网址就构成了一种从属关系,是一种层次模型,此时就
可以使用树形导航模式。如果按照这样的分组在iPhone上展示这些城市信息,需要使用三级视图

5.4.1  应用场景  
5.4.2  实现  
5.5  组合使用导航模式  
有些情况下,我们会将3种导航模式综合到一起使用,其中还会用到模态视图。
5.5.1  应用场景  
5.5.2  实现  
5.6  小结  

第6章 iOS常用设计模式  
设计模式是个很庞杂的知识体系,即便是同一设计模式在不同开发语言环境下也存
在很大的差异,而真正能驾驭设计模式的开发者的确不多。
软件设计模式大都来源于GoF23种设计模式。该书的设计模式都是面向对象的,在C++JavaC#领域都
有广泛的应用。 CocoaCocoa Touch框架中的设计模式也基本上是这23种设计模式的演变,但是具体来说,Cocoa
Cocoa Touch中的设计模式仍然存在着差异。
6.1  单例模式
单例模式的作用是解决“应用中只有一个实例”的一类问题。
  
6.1.1  问题提出
在一个iOS应用的生命周期中,有时候我们只需要某个类的一个实例。例如,iOS设备都有一个重力加速计硬
件设备,要访问设备在x轴、y轴和z轴上的重力加速度,就必然要有一个类能够与硬件设备沟通来实时获得这些数
据,这个类就是UIAccelerometer。除了实时地获得数据,该类还能够保持x轴、y轴和z轴的状态。但是这个类
只需要一个实例就够了,如果有多个实例,就会占用过多的内存。
再有,当应用程序启动时,应用的状态由UIApplication类的一个实例维护,这个实例代表了整个“应用程
序对象”,它只能是一个实例,其作用是实现应用程序中一些共享资源的访问和状态的保持等。

  
6.1.2  实现原理 
  单例模式一般会封装一个静态属性,并提供静态实例的创建方法,
实现的参考代码如下:
//
// Singleton.h
//
@interface Singleton : NSObject
+ (Singleton*)sharedManager;
@property (nonatomic ,strong) NSString* singletonData;
@end
//
// Singleton.m
//
#import "Singleton.h"
@implementation Singleton
@synthesize singletonData = _singletonData;
static Singleton *sharedManager = nil;
+ (Singleton*)sharedManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedManager = [[self alloc] init];
});
return sharedManager;
}
@end
其 中static Singleton *sharedManager为 静 态 变 量 , 类 方 法 为+ (Singleton*)sharedManager
sharedManager方法采用了GCDGrand Central Dispatch)技术,这是一种基于C语言的多线程访问技术。在上述
代码中, dispatch_once函数就是由 GCD提供的,它的作用是在整个应用程序生命周期中只执行一次代码块
^{…})。dispatch_once_tGCD提 供 的 结 构 体 , 使 用 时 需 要 将GCD地 址 传 给dispatch_once函 数 。
dispatch_once函数能够记录该代码块是否被调用过。
dispatch_once函数不仅意味着代码仅会被运行一次,而且还意味着此运行还是线程同步的。也就是说,
当我们使用了 dispatch_once函数时,就不再需要使用诸如@synchronized之类的语句。


6.1.3  应用案例  
1.UIApplication
2. UIAccelerometer
3. NSUserDefaults
4. NSNotificationCenter
5.NSFileManager
6.NSBundle


6.2  委托模式 
  委托模式从GoF装饰(Decorator)模式、适配器(Adapter)模式和模板方法(Template Method)模式等演变
而来。几乎每一个应用都会或多或少地用到委托模式。不只是Cocoa Touch框架,在Cocoa框架中,委托模式也得
到了广泛的应用。


6.2.1  问题提出 
    假设这一系列的处理都是在上帝类UIApplication中完成的。之所以叫“上帝类”(god class),是因为它“无
所不能”、“包含所有”。 在面向对象的软件设计中,“上帝类”不是很友好,需要重构。在编程过程中,要尽量避
免使用上帝类,因为上帝类是高耦合的,职责不清,难以维护。我们需要“去除上帝类”,把看似功能很强且很
难维护的类,按照职责将它的属性或方法分派到各自的类中或分解成功能明确的类。
   幸运的是,苹果没有把UIApplication类设计成“上帝类”,而是将它们分割到两个不同的角色类中:其中
一个扮演框架类角色,框架类具有通用、可重复使用、与具体应用无关等特点;另一个扮演应用相关类的角色,应用相关类与具体应用有关。
由于受到框架类的控制,应用相关类常常被设计为“协议”,在Java中称为“接口”。
开发人员需要在具体的应用中实现这个“协议”。
UIApplication不直接依赖于AppDelegate类,而是依赖于UIApplicationDelegate协议,这在面向对象软件
设计原则中叫做“面向接口的编程”。 AppDelegate类实现协议UIApplicationDelegate,它是委托类。
委托是为了降低一个对象的复杂度和耦合度,使其能够更具通用性而将其中一些处理置于委托对象中的编码
方式。通用类因为通用性(与具体应用的无关性)而变为框架类,框架类保持委托对象的指针,并在特定时刻向
委托对象发送消息。消息可能只是通知委托对象做一些事情,也可能是对委托对象进行控制。


6.2.2  实现原理
  
6.2.3  应用案例  

6.3  观察者模式 
观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC( 模型视图控制器)模式的重要组成部分。

 
6.3.1  问题提出  
6.3.2  实现原理 
它有4个角色,具体如下所示。
抽象主题( Subject。在Objective-C中,抽象主题是一个协议,它是一个观察者集合容器,定义了添加
观察者( attach)方法、移除观察者( detach)方法和为所有观察者发送通知的方法( notifyObserver)。
抽象观察者( Observer。在Objective-C中,抽象观察者是一个协议,它有一个更新(update)方法。
具体观察者( ConcreteObserverObserver协议的具体实现。
具体主题( ConcreteSubjectSubject协议的具体实现。
6.3.3  通知机制和KVO机制  
Cocoa Touch框架中,观察者模式的具体应用有两个——通知(notification) 机制和KVOKey-Value Observing
机制,下面简要介绍这两种机制。
1. 通知机制
通知机制与委托机制不同的是,前者是“一对多”的对象之间的通信,后者是“一对一”的对象之间的通信。
2. KVO机制
KVO不像通知机制那样通过一个通知中心通知所有观察者对象,而是在对象属性变化时通知会被直接发送给
观察者对象。图6-19KVO机制解析图。


6.4  MVC模式  
MVCModel-View-Controller,模型视图控制器)模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中。现在,很多计算机语言和架构都采用了MVC模式。


6.4.1  MVC模式概述
MVC模式是一种复合设计模式,由“观察者”(Observer)模式、“策略”(Strategy)模式和“合成”(Composite
模式等组成。

模型。保存应用数据的状态,回应视图对状态的查询,处理应用业务逻辑,完成应用的功能,将状态的变
化通知视图。
视图。为用户展示信息并提供接口。用户通过视图向控制器发出动作请求,然后再向模型发出查询状态的
申请,而模型状态的变化会通知给视图。
控制器。接收用户请求,根据请求更新模型。另外,控制器还会更新所选择的视图作为对用户请求的回应。
控制器是视图和模型的媒介,可以降低视图与模型的耦合度,使视图和模型的权责更加清晰,从而提高开
发效率。

  
6.4.2  Cocoa Touch中的MVC模式  
CocoaCocoa Touch框架中的MVC模式与传统的MVC模式略有不同,CocoaCocoa Touch框架中的模型与视图不能进行任何通信,所有的通信都是通    过控制器完成的.
6.5  小结  

第7章 iPhone与iPad应用开发的差异  
7.1  概述
   首先,我们回顾一下iPhoneiPad的几个参数:iPhone 4的屏幕尺寸为3.5英寸,分辨率为960×640像素;iPhone
5的屏幕尺寸为4英寸,分辨率为1136×640像素;iPad 1iPad 2的屏幕尺寸是9.7英寸,分辨率为1024×768像素。
屏幕尺寸的不同导致了应用场景的不同,应用场景的不同直接导致了设计和开发的不同。
 
7.1.1  应用场景差异  
         iPhone是让用户一只手使用的设备,因此它适合在等车时拿出来看看天气、收发邮件、看看周围有哪些银行或者饭店,等等。而iPad是两只
手使用的设备,它不太适合处理iPhone用户的场景。据调查,iPad多数用在家里,用来浏览网页、收发电子邮件、
看照片、看视频、听音乐、玩电子游戏和看电子书等。作为平板电脑,它比笔记本电脑更轻便、更适合移动使用。
基于应用场景的不同,同样一款应用在iPhoneiPad上的功能选取和界面布局有着明显的不同。有些应用只
能做成iPhone版本的,有些应用只能做成iPad版本的。与iPhone用户相比,iPad用户更期待具有高保真的、艺术品
般的、高品质的应用,而绝非简单地放大iPhone

7.1.2  设计和开发需注意的问题 
          iPhoneiPad都使用一个操作系统——iOS,因此,它们的API基本上是一样的,但有一些是iPad专用的,比
UIPopoverController控制器和UISplitViewController控制器,其中UIPopoverController控制器用
于呈现“漂浮”类型的视图,UISplitViewController控制器用于将屏幕分栏。这两个控制器在E-mail应用中
都用过。
 
 
7.1.3  构建自适应的iPhone和iPad工程  
7.2  iPad专用API 
 
 
7.2.1  UIPopoverController控制器  
7.2.2  UISplitViewController控制器  
7.2.3  模态视图专用属性  
7.3  小结  

第8章 iOS分层架构设计  
   设计模式只是解决某一特定问题的策略,是面向局部的;而架构设计则是一个将设计模式宏观、全面、有机地组织起来解决整个应用系统的方案。
   衡量一个软件架构设计好坏的标准是可复用性和可扩展性。可复用性和可扩展性强的软件系统能够满足用户不断变化的需求。为了使我们的软件系统具有可复用性和可扩展性,我主张采用分层架构设计。

8.1  低耦合企业级系统架构设计 
         
表示层。用户与系统交互的组件集合。用户通过这一层向系统提交请求或发出指令,系统通过这一层接收
用户请求或指令,待指令消化吸收后再调用下一层,接着将调用结果展现到这一层。表示层应该是轻薄的,
不应该具有业务逻辑。
业务逻辑层。系统的核心业务处理层。负责接收表示层的指令和数据,待指令和数据消化吸收后,再进行
组织业务逻辑的处理,并将结果返回给表示层。
数据持久层。数据持久层用于访问信息系统层,即访问数据库或文件操作的代码只能放到数据持久层中,
而不能出现在其他层中。
信息系统层。系统的数据来源,可以是数据库、文件、遗留系统或者网络数据。

8.2   iOS分层架构设计  
          有关信息处理的应用一般会采用分层架构设计,而游戏等应用一般不会这种采用分层架构设计。
   提示游戏开发一般都会采用引擎。事实上,游戏引擎包含了架构设计解决方案,但其架构一般不是分层的,而
是树形结构的。



8.2.1  基于同一工程的分层  
如果我们要编写一个基于iOSiPhoneiPad两个平台)的MyNotes应用,它具有增加、删除和查询备忘录的
基本功能。图8-3MyNotes应用的用例图。分层设计之后,表示层可以有iPhone版和iPad版本,而业务逻辑层、
数据持久层和信息系统层可以公用,这样大大减少了我们的工作量。


8.2.2  基于一个工作空间不同工程的分层  
有时候,我们需要将某一层复用给其他的团队、公司或者个人,但由于某些原因,我们不能提供源代码,此
时就可以将业务逻辑层和数据持久层编写成静态链接库( static librarystatically-linked library)。

提示库是一些没有main函数的程序代码的集合。除了静态链接库,还有动态链接库,它们的区别是:静态链
接库可以编译到你的执行代码中,应用程序可以在没有静态链接库的环境下运行;动态链接库不能编译到
你的执行代码中,应用程序必须在有链接库文件的环境下运行。

创建三个工程他们之间的依赖关系是:BusinessLogicLayer依赖于PersistenceLayer,PersistenceLayer依赖于BusinessLayer和persistentLayer,因此创建
顺序应该是PersistenceLayer-->BusinessLayer-->PresentationLayer
1. 持久层PersistenceLayer工程
床架过程File--》new--》Project...在打开的对话框中选择FrameWork&Library-->Cocoa Touch Static Library工程模板。同时添加工程到我的工作空间
2. 业务逻辑层BusinessLayer工程



8.3  小结  

第9章 iOS 7中文字排版和渲染引擎--Text Kit  
iOS 7之前,应用中字体的大小用户是不能设置的,而且开发人员要想实现多种样式的文字排版是件非常麻
烦的事情。在iOS 7之后,这些问题都解决了,Text Kit就是解决这些问题的钥匙。本章将向大家介绍iOS 7中文字
排版和渲染引擎——Text Kit

9.1  Text Kit基础
   Text Kit最主要的作用就是为程序提供文字排版和渲染的功能。通过Text Kit可以对文字进行存储、布局,以
更加精准的排版方式来显示文本内容。Text Kit隶属于UIKit框架,其中包含了一些文字排版的相关类和协议.

9.1.1  文字的排版和渲染  
iOS 7之前也有一种用于文字排版和渲染的技术——Core Text,而引入Text Kit的目的并非要取代Core Text
Core Text是面向底层的文字排版和渲染技术,如果我们需要将文本内容直接渲染到图形上下文时,从性能角度考
虑,最佳方案就是使用Core Text。但是从易用性角度考虑,使用Text Kit是最好的选择,因为它能够直接使用UIKit
提供的一些文本控件,例如:UITextViewUILabelUITextField,对文字进行排版。
Text Kit具有很多优点:文本控件UITextViewUITextFieldUILabel是构建于Text Kit之上的。Text Kit完全掌
控着文字的排版和渲染:可以调整字距、行距、文字大小,指定特定的字体,对文字进行分页或分栏,支持富文
本编辑、自定义文字截断,支持文字的换行、折叠和着色等处理,支持凸版印刷

9.1.2  Text Kit架构  
9.1.3  Text Kit中的核心类  
NSTextContainer。定义了文本可以排版的区域。默认情况下是矩形区域,如果是其他形状的区域,需
要通过子类化NSTextContainer来创建。
NSLayoutManager。该类负责对文字进行编辑排版处理,将存储在NSTextStorage中的数据转换为可以
在视图控件中显示的文本内容,并把字符编码映射到对应的字形上,然后将字形排版到NSTextContainer
定义的区域中。
NSTextStorage。主要用来存储文本的字符和相关属性,是NSMutableAttributedString的子类(见
9-3)。此外,当NSTextStorage中的字符或属性发生改变时,会通知NSLayoutManager,进而做到文
本内容的显示更新。
NSAttributedString。支持渲染不同风格的文本。
NSMutableAttributedString。可变类型的NSAttributedString,是NSAttributedString的子类
(见图9-3

9.1.3  实例:凸版印刷效果  
9.2  文字图片混合排版  
9.3  动态字体  
9.4  小结  

第10章 应用程序设置  
曾经见过我的同事将服务器的IP地址“硬编码”在程序中的尴尬事情,结果当用户服务器的IP地址发生变
化时,程序就无法连接到服务器了,只能修改源代码,再重新编译。为了避免发生这种情况,我们需要在程序中
添加一个能够让用户修改服务器IP的功能,这个功能叫做应用程序设置或配置。

10.1  概述  
10.1.1  设置  
10.1.2  配置  
10.2  应用程序设置包  
10.3  设置项目种类  
10.3.1  文本字段  
10.3.2  开关  
10.3.3  滑块  
10.3.4  值列表  
10.3.5  子界面  
10.4  读取设置  
10.5  小结  

第11章 国际化  
11.1  概述  
   国际化(Internationalization,简写为I18N)是指在设计软件时,将软件与特定语言及地区脱钩,使之能适用
不同语言和地区的过程。与国际化相关的概念是本地化(Localization,简写为L10n),指当移植软件时,加上与
特定区域设置有关的信息和翻译文件的过程。


11.1.1  需要国际化的内容
文本信息国际化。它是首先被考虑的,包括应用的名称、按钮、警告提示信息以及界面中显示的静态文
字等。
xib和故事板文件国际化。同一个界面和场景可以提供多个本地化版本的xib和故事板文件。
资源文件国际化。它包括图片和音频等资源的国际化。 图片国际化包括应用图标和一般图片的国际化。资源
文件的国际化要根据具体情况而定,否则工作量还是很大的。




  
11.1.2  国际化目录结构  
11.2  文本信息国际化  
11.2.1  系统按钮和信息国际化  
11.2.2  应用名称国际化  
11.2.3  程序代码输出的静态文本国际化  
11.2.4  使用genstring工具  
11.3  xib和故事板文件国际化  
11.3.1  使用Base国际化技术  
11.3.2  AutoLayout与国际化  
11.4  资源文件国际化  
11.4.1  图片资源文件国际化  
11.4.2  声音资源文件国际化  
11.5  小结  

第12章 数据持久化  
12.1  概述 
  iOS有一套完整的数据安全体系,iOS应用程序只能访问自己的目录,这个目录称为沙箱目录,而应用程序间
禁止数据的共享和访问。访问一些特殊的应用,如:联系人应用,必须通过特定API访问。

12.1.1  沙箱目录 
 沙箱目录是一种数据安全策略,很多系统都采用沙箱设计,实现HTML5规范的一些浏览器也采用沙箱设计。
沙箱目录设计的原理就是只能允许自己的应用访问目录,而不允许其他的应用访问。在Android平台中,我们通过
Content Provider技术将数据共享给其他应用。而在iOS系统中,特有的应用(联系人等)需要特定的API才可以共
享数据,而其他的应用之间都不能共享数据。

下面的目录是iOS平台的沙箱目录,我们可以在模拟器下面看到,在真实设备上也是这样存储的:
/Users/<用户>/Library/Application Support/iPhone Simulator/6.0/
Applications/A262B02A-1975-4A7A-AB8C-C181E2CC059A
其中A262B02A-1975-4A7A-AB8C-C181E2CC059A是应用程序ID,在安装时由系统分配。DocumentsLibrarytmp
都是沙箱目录的子目录,其目录结构如下所示。
├── Documents
│ └── NotesList.sqlite3
├── Library
│ ├── Caches
│ └── Preferences
├── tmp
└── PresentationLayer.app
下面我们分别介绍这3个子目录,它们有不同的用途、场景和访问方式。



 
12.1.2  持久化方式  
持久化方式就是数据存取方式。iOS支持本地存储和云端存储,本章主要介绍本地存储,主要涉及如下4种机制。
属性列表。 集合对象可以读写到属性列表文件中。
对象归档。 对象状态可以保存到归档文件中。
SQLite数据库。 SQLite是一个开源嵌入式关系型数据库。
Core Data 它是一种对象关系映射技术( ORM),本质上也是通过SQLite存储的。
属性列表文件和对象归档一般用于存储少量数据。属性列表文件的
访问要比对象归档的访问简单, Foundation框架集合对象都有对应的方法读写属性列表文件,而对象归档是借助
NSData实现的,使用起来比较麻烦。SQLite数据库和Core Data一般用于有几个简单表关系的大量数据的情况。如
果是复杂表关系而且数据量很大,应该考虑把数据放在远程云服务器中。




12.2  属性列表  
12.3  对象归档  
12.4  使用SQLite数据库  
12.4.1  SQLite数据类型  
12.4.2  创建数据库  
12.4.3  查询数据  
12.4.4  修改数据  
12.5  Core Data  
12.5.1  ORM  
12.5.2  Core Data堆栈  
12.5.3  建模和生成实体  
12.5.4  采用Core Data分层架构设计  
12.5.5  查询数据  
12.5.6  修改数据  
12.6  小结  

第13章 访问通讯录  
 移动设备上都有一个很重要的内置数据库 ——通讯录,苹果把它扩展到了iCloud上,使苹果设备间可以共享
通讯录信息。在iOS上,通讯录放在SQLite3数据库中,但是应用之间不能直接访问,也就是说我们自己编写的应
用不能采用数据持久化技术直接访问通讯录数据库。为了实现通讯录数据库的访问,苹果开放了一些专门的API
与其他应用(如定位服务授权)不同的是,通讯录对一个应用只授权一次,即便是这个应用删除后重新安装,也不必再次授权。

13.1  概述 
  在开发访问通讯录的应用中,我们使用了两个框架:AddressBookAddressBookUI
AddressBook框架主要提
供了直接访问通讯录中记录和属性等API。由于使用这些API,需要自己构建UI界面,所以它们被称为“低级API”。
AddressBook框架中常用的类见表13-1
13-1 AddressBook框架中常用的类
类 名 说 明
ABAddressBook 封装访问通讯录接口。 Core Foundation框架中对应的类型是ABAddressBookRef
ABPerson 封装通讯录个人信息数据,是数据库的一条记录。 Core Foundation框架中对应的类型是ABPersonRef
ABGroup 封装通讯录组信息数据,一个组包含了多个人的信息,一个人也可以隶属多个组。 Core Foundation框架中对应的类型是ABGroupRef
ABRecord 封装了数据库的一条记录,记录由属性组成。 Core Foundation框架中对应的类型是ABRecordRef

提示Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供
Objective-C接口,Core Foundation框架提供C接口。如果将Foundation对象和Core Foundation类型混合使用,
则可利用两个框架之间的“无开销桥接”( toll-free bridging)。无开销桥接是说Core FoundationFoundation
框架中的某些类型可以互相转换,如表13-1中的ABAddressBookABAddressBookRef
AddressBookUI框架提供了4个视图控制器和4个对应的委托协议,它们已经提供UI界面,不需要我们自己构
建,因此称为“高级API”。这4个视图控制器和对应的委托协议如表13-2所述。
13-2 AddressBookUI框架中的视图控制器
视图控制器                                      说 明
ABPeoplePickerNavigationController它是从数据库中选取联系人的导航控制器,对应的委托协议为
ABPeoplePickerNavigationControllerDelegate
ABPersonViewController 查看并编辑单个联系人信息,对应的委托协议为
ABPersonViewControllerDelegate
ABNewPersonViewController 创建新联系人信息,对应的委托协议为
ABNewPersonViewControllerDelegate
ABUnknownPersonViewController 呈现记录部分信息,这些信息可以创建新联系人信息,或添加到已经存在的联系
人,对应的委托协议为ABUnknownPersonViewControllerDelegate




   
 
13.2  读取联系人信息  
13.2.1  查询联系人记录  
13.2.2  读取单值属性  
13.2.3  读取多值属性  
13.2.4  读取图片属性  
13.3  写入联系人信息  
13.3.1  创建联系人  
13.3.2  修改联系人  
13.3.3  删除联系人  
13.4  高级API  
13.4.1  选择联系人  
13.4.2  显示和修改联系人  
13.4.3  创建联系人  
13.5  小结  

第二部分  网  络  篇

第14章 访问Web Service  
14.1  概述  
14.2  数据交换格式  
14.2.1  XML文档结构  
14.2.2  解析XML文档  
ios SDK提供了两个XML框架,
NSXML。它是基于Objective-C语言的SAX解析框架,是iOS SDK默认的XML解析框架,不支持DOM模式。
libxml2.它是基于c语言的CML解析器,被苹果整合在iOS SDK中支持SAX和DOM模式
此外在iOS中解析XML时,还有很多第三方框架可以采用。
TBXML。它是基于DOM模式的解析库。与TBXML类似,只能读取XML文档,不能写XML文档。
KissXML。它是基于DOM的解析库,基于TouchXML,主要的不同是可以写入XML文档。
TinyXML。它是基于C++语言的COM模式解析库,他可以读XML文档,不支持XPath。
GDataXML。它是基于DOM模式的解析库,由Google开发,可以读取XML文档,支持XPath查询。

14.2.3  JSON文档结构  
14.2.4  JSON数据解码
json比较成熟,在ios上有很多框架可以进行JSON的编码/解码
SBJson。它是比较老的JSON编码解码框架,原名是json-framework
TouchJSON。它也是比较老的JSON编码/解码框架,支持ARC和MRC
YAJL。它是比较优秀的JSON框架,基于SBJson进行了优化,底层api使用C编写,上层API使用Objective-C编写,使用者可以有多重不同的选择。它不支持ARC
JSONKit。
NextiveJson
NSJSONSerialization
  
14.3  REST Web Service  
14.3.1  HTTP和HTTPS协议  
1. HTTP协议

2. HTTPS协议
HTTPSHypertext Transfer Protocol Secure,即超文本传输安全协议,是超文本传输协议和SSL的组合,用以
提供加密通信及对网络服务器身份的鉴定。
简单地说, HTTPSHTTP的升级版,与HTTPS的区别是:HTTPS使用https://代替http://HTTPS使用端口443
HTTP使用端口80来与TCP/IP进行通信。SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合
适的。HTTPSSSL支持使用X.509数字认证,如果需要的话,用户可以确认发送者是谁。
14.3.2  同步GET请求方法  

14.3.3  异步GET请求方法 
  同步请求的用户体验不是很好,因此很多情况下我们会采用异步调用。iOS SDK也提供了异步请求的方法,
而异步请求会使用NSURLConnection委托协议NSURLConnectionDelegate。在请求的不同阶段,会回调委托
对象的方法。 NSURLConnectionDelegate协议的方法有如下几个。
connection:didReceiveData: 。请求成功,建立连接,开始接收数据。如果数据量很多,它会被多次调用。
connection:didFailWithError: 。加载数据出现异常。
connectionDidFinishLoading: 。成功完成数据加载,在connection:didReceiveData方法之后执行。



14.3.4  POST请求方式  

14.3.5  调用REST Web Service的插入、修改和删除方法  
14.4  使用轻量级网络请求框架MKNetworkKit  
14.4.1  ASIHTTPRequest、AFNetworking和MKNetworkKit比较 
14-2 ASIHTTPRequestAFNetworkingMKNetworkKit比较

 ASIHTTPRequest、AFNetworking和MKNetworkKit比较

 

ASIHTTPRequest

AFNetworking

MKNetworkKit

支持iOS和Mac OS X

支持ARC

断点续传

同步异步请求

支持同步异步

只支持异步

只支持异步

图片缓存到内存

后台下载

下载进度

缓存离线请求

Cookies

HTTPS

  

14.4.2  安装和配置MKNetworkKit框架  
14.4.3  网络请求  
14.4.4  下载数据  
14.4.5  上传数据  
14.5  反馈网络信息改善用户体验  
14.5.1  使用下拉刷新控件改善用户体验  
14.5.2  使用等待指示器控件  
14.5.3  使用网络等待指示器  
14.6  小结  

第15章 定位服务与地图应用
iOS中,定位服务与地图应用是完全不同的两套API,但是它们结合很紧密,因此把它们放在一章中介绍给
大家。
  
15.1  定位服务 
Wi-Fi。通过Wi-Fi路由器的地理位置信息查询,比较省电。iPhoneiPod touchiPad都可以采用这种方式
定位。
蜂窝式移动电话基站。通过移动运用商基站定位。只有iPhone3G版本的iPod touchiPad可以采用这种方
式定位。
GPS卫星。通过GPS卫星位置定位,这种方式最为准确,但是耗电量大,不能遮挡。iPhoneiPod touch
iPad都可以采用这种方式定位。
iBeacon微定位iOS 7支持iBeacon技术,iBeacon技术是苹果公司研发的,它使用低功耗蓝牙技术,通过
多个iBeacon基站可以创建一个信号区域(地理围栏),当设备进入该区域时,相应的应用程序便会提示用
户进入了这个地理围栏。


15.1.1  定位服务编程  
15.1.2  地理信息反编码  
15.1.3  地理信息编码查询
               
                  使用geohash将经纬度转成字符串。方便入库以及查询
                    http://download.cnet.com/Geohash/3000-12940_4-201071.html#full-specs  

15.1.4  关于定位服务的测试  
15.2  使用iOS苹果地图  
15.2.1  显示地图  
15.2.2  添加标注  
15.2.3  跟踪用户位置变化  
15.3  使用程序外地图  
15.3.1  调用iOS苹果地图  
15.3.2  调用谷歌Web地图  
15.4  小结  

第三部分  进  阶  篇

第16章 升级?  
16.1  从iOS 6到iOS 7的升级  
16.1.1  iOS 7全新的扁平化设计  
16.1.2  屏幕适配问题  
16.1.3  iOS 7状态栏隐藏  
16.1.4  iOS 7状态栏样式设置  
16.2  从Xcode 4到Xcode 5的升级  
16.2.1  ARC与MRC之争  
16.2.2  故事板与xib之争  
16.2.3  找回普通显示屏的模拟器  
16.2.4  找回老版本的Interface Builder  
16.2.5  使用资源目录管理图片  
16.3  从iPhone 4到iPhone 5的升级  
16.3.1  屏幕适配问题  
16.3.2  从32位到64位的升级  
16.4  小结  

第17章 iOS中的商业模式  
17.1  收费策略  
17.1.1  iOS如何赚钱  
产品定价
植入广告苹果自身带有iAd广告,做得比较好的还有被谷歌收购的AdMob
应用内购买一般有购买虚拟道具、关卡解锁、延长
服务时间、扩充存储空间、升级用户权限、提升隐私级别等方式。现在很多应用采用免费模式,然后在产
品中鼓励、刺激用户进行消费。



17.1.2  避免定价策略误区  
17.1.3  免费软件的艺术  
17.1.4  在适当的时间、适当的地点植入广告  
17.1.5  尝试不同的盈利模式  
上面提到,在App Store上面发布产品有很多盈利方式,那么究竟选择哪种方式呢?免费+广告?还是免费+
用内购买?或者是收费+应用内购买?其实,最好的方法是把这些方式都试一下,看哪个盈利模式最适合你的应
用。不要单纯地以自己的主观想法去选择盈利方式,实践才是检验真理的唯一标准。
要应用保持良好的收益,经常做一些分析是很有必要的。知己知彼,百战不殆。从产品自身角度、市场角度、
客户群体、竞争对手、合作伙伴、用户价值等方面分析,不断地完善我们的应用。

17.2  使用苹果iAd广告  
17.2.1  横幅广告 
iPhone 4以及之前设备和iPod touch4代以及设备横屏的情况下,横幅广告的尺寸是480×32
iPhone 5iPod touch5代横屏的情况下,横幅广告的尺寸是568×32
iPhoneiPod touch竖屏的情况下,横幅广告的尺寸是320×50
iPad横屏的情况下,横幅广告的尺寸是1024×66
iPad竖屏的情况下,横幅广告的尺寸是768×66
提示 iPhone 5中,情况有些特殊,iPhone 5的屏幕尺寸是320×568点,而不是iPhone 4320× 480点,因此在iOS
6iPhone 5的最低版本是iOS 6)中,横幅广告应该是自动适应宽度,在设计时要把这个问题考虑在内。

直接从对象库中拖曳的这种方式在横屏和竖屏切换时不够灵活,在应对iPhone 5横屏情况时也不方便,因此,
我们推荐采用编码方式动态设定ADBannerView的位置。无论采用哪一种方式,在使用iAd之前,都需要引入iAd
框架。如图17-2
所示,在框架库中选择iAd.framework并将其添加到当前工程中。


 
17.2.2  插页广告 
 
17.2.3  查看你的收入  


17.3  使用谷歌AdMob广告  
17.3.1  注册AdMob账号和管理应用  
17.3.2  下载谷歌AdMob Ads SDK和示例代码  
17.3.3  添加AdMob横幅广告  
17.3.4  添加AdMob插页广告  
17.3.5  为广告提交用户和位置信息  
17.3.6  搜索广告  
17.3.7  查看你的收入  
17.4  应用内购买 
  应用内购买(In-App Purchase)是另外一种收费策略,很适合游戏、杂志期刊类的应用。这种收费策略有点
像买水果时的先尝后买,游戏的前几个关卡免费,当你觉得有意思需要用到后面的关卡时则需要付费。一般购买
内容包括内容类型、功能扩展、服务和订阅等。

苹果在App Store上提供的应用内购买产品类型有如下3种。
消耗型。产品购买之后即被消费,再次购买该产品时还需要支付,只能应用于当前设备。
非消耗型。该类产品一旦购买可以一直使用,而且可以在与该用户账号关联的多个设备上使用。App Store
会保留用户的购买记录。
订阅型。订阅类产品在订阅周期内如同非消费型购买一样,在订阅期过后如消费型购买一样。作为开发者,
需要确保用户订阅的内容在其iTunes同步的设备上都有效,可以在程序内部加入自己的订阅计划更新机
制。苹果期望订阅类产品可以通过外部服务器交付。另外,订阅类产品可以在与该用户账号关联的多个设
备上使用。订阅类产品又可以细分为:自动再生订阅类、非自动再生订阅类和免费订阅类。


内置产品类型。需要交付的产品已经在程序内部,通常用于一些功能的锁定,这些功能原本是在程序中,但
是需要购买这些功能才能解锁,开发人员需要记录这些购买记录,并且能够备份和恢复这些信息。它的优点
是能很快交付产品给客户。大多数的内置产品应用为非消耗型产品。这种模式是我们本书重点介绍的模式。
服务器产品类型。在这种模式下,需要开发商或运行商提供另外的服务器,将要交付的内容、服务和订阅
的产品更新到服务器上。应用程序与服务器和App Store交互获取信息。这种方式非常灵活,但是投入比较
大,适合于订阅、内容和服务类产品。




17.4.1  概述  
17.4.2  测试环境搭建
  
17.4.3  在程序中实现应用内购买  
17.4.4  测试应用内购买  
17.5  小结  

第18章 找出程序中的bug--调试  
18.1  Xcode调试工具  
18.1.1  定位编译错误  
18.1.2  查看和显示日志  
18.1.3  设置和查看断点  
18.1.4  调试工具栏  
18.1.5  输出窗口  
18.1.6  变量查看窗口  
18.1.7  查看线程  
18.2  日志与断言输出  
18.2.1  使用NSLog函数  
18.2.2  使用NSAssert宏  
18.2.3  移除NSLog和NSAssert  
18.3  LLDB调试工具  
18.3.1  断点命令  
18.3.2  观察点命令  
18.3.3  查看变量和计算表达式命令  
18.4  异常堆栈报告分析  
18.4.1  跟踪异常堆栈  
18.4.2  分析堆栈报告  
18.5  在iOS设备上调试  
18.5.1  创建开发者证书  
18.5.2  设备注册  
18.5.3  创建App ID  
18.5.4  创建配置概要文件  
18.5.5  设备调试  
18.6  Xcode设备管理工具  
18.6.1  管理设备配置概要文件  
18.6.2  查看设备上的应用程序  
18.6.3  设备控制台  
18.6.4  设备日志  
18.7  小结  

第19章 测试驱动下的iOS应用开发  
19.1  测试驱动的软件开发概述  
19.1.1  测试驱动的软件开发流程  
19.1.2  测试驱动的软件开发案例  
19.1.3  iOS 7单元测试框架  
19.2  使用XCTest测试框架  
19.2.1  添加XCTest到工程  
19.2.2  编写XCTest测试方法  
19.2.3  运行测试程序  
19.2.4  分析测试报告  
19.3  iOS单元测试最佳实践  
19.3.1  测试数据持久层  
19.3.2  测试业务逻辑层  
19.3.3  测试表示层  
19.4  小结  

第20章 让你的程序“飞”起来--性能优化  
20.1  内存优化 
  分别是MRRManual Retain Release,手动保持释放)、ARCAutomaticReference Counting,自动引用计数)和GCGarbage Collection,垃圾收集)
MRR。也称为MRCManual Reference Counting,手动引用计数),就是由程序员自己负责管理对象生命
周期,负责对象的创建和销毁。
ARC。采用与MRR一样的内存引用计数管理方法,但不同的是,它在编译时会在合适的位置插入对象内
存释放(如releaseautoreleaseretain等),程序员不用关心对象释放的问题。苹果推荐在新项目
中使用ARC,但在iOS 5之前的系统中不能采用ARC
GC GC技术不能应用于iOS开发,只能应用于Mac OS X开发。
20.1.1  内存泄漏问题的解决  
内存泄漏指当一个对象或变量在使用完成后没有释放掉,这个对象一直占用着内存,直到应用停止。
Xcode提 供 了 两 种 工 具 帮助 查 找 泄 漏点 :AnalyzeInstruments
Analyze 是 静 态分 析 工 具 。可 以 通 过
Product→Analyze菜单项启动,图20-1所示为静态分析之后的代码界面。Instruments是动态分析工具,它与Xcode
集成在一起,可以在Xcode中通过Product→Profile菜单项启动。如图20-2所示,Instruments有很多跟踪模板可以动
态分析和跟踪内存、 CPU和文件系统。

20-7 InstrumentsLeaks模板
20-8 Instruments检测到的内存泄漏
20-9查看泄漏的详细信息
20-10查看泄漏点
20-12 InstrumentsZombies模板



20.1.2  查找和解决僵尸对象  
存泄漏是指一个对象或变量在使用完成后没有释放掉。如果我们走向了另外一个极端,会是什么样的呢?
这就导致了过度释放问题,从而使对象“僵尸化”,该对象被称为僵尸对象。如果一个对象已经被释放过了,或
者调用者没有这个对象的所有权却释放了它,就会造成过度释放,产生僵尸对象。
对于很多人来说,僵尸对象或许听起来很恐怖,也很陌生,但是如果说起EXEC_BAD_ACCESS异常,可能大
家并不陌生。

20.1.3  autorelease的使用问题  
20.1.4  响应内存警告 
好的应用应该在系统内存警告的情况下释放一些可以重新创建的资源。在iOS中,我们可以在应用程序委托
对象、视图控制器以及其他类中获得系统内存警告消息。
 
20.1.5  选择xib还是故事板  
故事板是苹果在iOS 5之后推出的技术,本意是集成多个xib文件于一个故事板文件,管理起来方便。故事板
还能反应控制器之间的导航关系,很多导航只需要连线就可以了,不需写代码,使用起来很方便。但是我告诫读
者,从内存占用角度来看,故事板不是一个好的技术。

事实上, xib仍然是比较好的技术,只不过不能表达界面之间的导航关系,界面导航要手工编写代码。



20.2  优化资源文件  
20.2.1  图片文件优化  
图片文件优化包括文件格式和文件大小的优化。在移动设备中,支持的图片格式主要是PNGGIFJPEG
式,苹果推荐使用PNG格式。在Xcode中,集成了第三方PNG优化工具pngcrush,它可以在编译的时候对PNG
式文件进行优化和压缩,而我们只需要设定如图20-19所示的编译参数Compress PNG FilesYES就可以了。


综上所述,如果在本地资源情况下,我们应该优先使用PNG格式文件;如果资源来源于网络,最好采用JPEG
格式文件。
另外,图片是一种很特殊的资源文件。创建UIImage对象时,可以使用类级构造方法+ imageNamed: 和实例
构造方法-initWithContentsOfFile: + imageNamed: 方法会在内存中建立缓存,这些缓存直到应用停止才

清除。如果是贯穿整个应用的图片(如图标、logo等),推荐使用+ imageNamed:创建;如果是仅使用一次的图
片,推荐使用下面的语句:
NSString *path = [[NSBundle mainBundle] pathForResource:@"animal-2" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
……
[image release]; //MRR情况下调用



20.2.2  音频文件优化  
WAV文件WAV是一种由微软和IBM联合开发的用于音频数字存储的文件格式。WAV文件的格式灵活,
可以存储多种类型的音频数据。由于文件较大,不太适合于移动设备这些存储容量小的设备。
MP3MPEG Audio Layer 3)文件MP3利用MPEG Audio Layer 3技术,将数据以110 甚至 112 的压
缩率压缩成容量较小的文件。MP3是一种有损压缩格式,它尽可能地去掉人耳无法感觉的部分和不敏感的
部分。这么高的压缩比率非常适合移动设备等存储容量小的设备,现在非常流行。
CAFFCore Audio File Format)文件CAFF是苹果开发的专门用于Mac OS XiOS系统的无压缩音频
格式,它被设计用来替换老的WAV格式。
AIFFAudio Interchange File Format)文件AIFF是苹果开发的专门用于Mac OS X系统的专业的音频文
件格式。AIFF的压缩格式是AIFF-C(或AIFC),将数据以41 压缩率进行压缩,应用于Mac OS X


20.3  延迟加载 
延迟加载(lazy load)指一些对象不是在应用和视图等初始化时创建,而是在用到它的时候创建。当应用中
有一些对象并不经常使用时,延迟加载可以提高程序性能。
 
20.3.1  资源文件的延迟加载  
20.3.2  故事板和xib文件的延迟加载  
20.4  数据持久化的优化  
20.4.1  使用文件  
20.4.2  使用SQLite数据库  
20.4.3  使用Core Data  
20.5  可重用对象的使用  
20.5.1  表视图中的可重用对象  
20.5.2  集合视图中的可重用对象  
20.5.3  地图视图中的可重用对象  
20.6  并发处理与多核CPU  
20.6.1  主线程阻塞问题  
20.6.2  选择NSThread还是GCD  
20.7  编译参数  
20.8  小结  

第21章 管理好你的程序代码--代码版本控制  
21.1  概述  
21.1.1  版本控制历史 
集中管理模式。这以一个服务器作为代码库,团队人员本地没有代码库只能与服务器进行交互。这种类型
的版本控制工具有VSSVisual Source Safe,微软开发的Microsoft Visual Studio套件中的软件之一)、CVS
Concurrent Versions System,并发版本系统)、SVNSubversion)等,其中SVN是目前这种模式的佼佼者。
分布式管理模式。这是更为先进的模式,不仅有一个中心代码库,而且每位团队人员本地也都有代码库,
在不能上网的情况下也可以提交代码。该类型的版本控制工具有GitMercurialBazzarDarcs
 
21.1.2  基本概念
代码库(repository。存放项目代码以及历史备份的地方。
分支( branch。为了验证和实验一些想法、版本发布、缺陷修改等需要,建立一个开发主干之外的分支,
这个分支被隔离在各自的开发线上。当改变一个分支中的文件时,这些更改不会出现在开发主干和其他分
支中。
合并分支( merging branch。完成某分支工作后,将该分支上的工作成果合并到主分支上。
签出( check out。从代码库获得文件或目录,将其作为副本保存在工作目录下,此副本包含了指定代码
库的最新版本。
提交( commit。将工作目录中修改的文件或目录作为新版本复制回代码库。
冲突( conflict。有时候提交文件或目录时可能会遇到冲突,当两个或多个开发人员更改文件中的一些相
同行时,将发生冲突。
解决( resolution。遇到冲突时,需要人为干预解决,这必须通过手动编辑该文件进行处理,必须有人逐
行检查该文件,以接受一组更改并删除另一组更改。除非冲突解决,否则存在冲突的文件无法成功提交到
代码库中。
索引( indexGit工具特有的概念。在修改的文件提交到代码库之前被做出一个快照,这个快照被称为
“索引”,它一般会暂时存储在一个临时存储区域中。


  
21.2  Git代码版本控制  
21.2.1  服务器搭建  
21.2.2  Gitolite服务器管理  
21.2.3  Git常用命令  
21.2.4  Git分支  
21.2.5  Git协同开发  
21.2.6  Xcode 5中Git的配置与使用  
21.3  GitHub代码托管服务  
21.3.1  创建和配置GitHub账号  
21.3.2  创建代码库  
21.3.3  派生代码库  
21.3.4  使用GitHub协同开发  
21.3.5  管理组织  
21.4  小结  

第22章 把你的应用放到App Store上  
22.1  收官  
22.1.1  在Xcode 5下添加图标 
iOS应用图标(App Icon)分为设备上使用的图标(见图22-1)和App Store上使用的图标(见图22-2),区别只是尺寸不同。
此外,iOS上使用的图标还有Spotlight搜索图标、设置图标、工具栏(或导航栏)图标、标签栏图标。


 
22.1.2  Xcode 5添加启动界面 
  启动界面是应用启动与进入到第一个屏幕之间的界面。如果应用没有启动界面,那么在进入第一个屏幕之
前就是黑屏,这会影响用户体验。虽然这在开发阶段没有什么影响,但是在应用发布前,还是需要添加启动
界面的。



22.1.3  调整Identity和Deployment Info属性 
  在编程过程中,有些产品的属性并不影响开发,即便属性设置不正确,一般也不会有什么影响。但是在产品
发布时,正确地设置这些属性就很重要了。如果设置不正确,就会影响产品的发布。这些产品属性主要是TARGETS
中的 IdentityDeployment Info属性,如图22-11所示。


22.1.4  为发布进行编译  
从编写到发布应用会经历3个阶段:在模拟器上运行调试、在设备上运行调试和发布编译。为了防止非法设
备和非开发人员调试和发布应用,苹果使用了配置概要文件控制在设备上运行调试和发布编译阶段。配置概要文
件分为两种——开发配置概要文件和发布配置概要文件,它们的创建非常相似(具体可参考18.5.4节)。完整的编
译发布流程如图22-15所示,其中创建开发者证书和创建App ID与调试阶段没有区别,具体请参考18.5节,下面介
绍最后的两个步骤。


22.1.5  应用打包
   在把应用上传到App Store之前,我们需要把编译的二进制文件和资源文件打成压缩包,压缩格式是ZIP。首
先找到编译到什么地方,这个很重要但不太好找,我们可以看看图 22-26所示的编译日志,找到其中的Create
universal binary HelloWorld…的内容并展开,具体如下:

22.2  发布流程 
  程序打包后,就可以发布我们的应用了。发布应用在iTunes Connect中完成,发布完成后等待审核,审核通过
后就可以到App Store上销售了。详细的发布流程如图
22-30所示。

其中第A步、第B步、第C步和第D步主要在iOS开发中心的配置门户网站中完成,本章前面已经介绍过了。下面
我们介绍其他几个流程,其中主要的流程是在iTunes Connect中完成的,而上传应用要使用Application Loader工具实现。



22.2.1  创建应用及基本信息  
通过网址https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa,打开iTunes Connect登录页面,使用苹
果开发账号登录,登录成功后的iTunes Connect页面如图22-31所示。
点击Manage Your Applications图标,进入应用管理页面,如图22-32所示,在这里可以管理我们审核中的、未
通过的以及已经上线的所有应用。

22.2.2  应用定价信息 
 
22.2.3  最后的信息输入
   1.版本信息
版本信息输入页面如图22-35所示。Version Number是应用的版本号,它必须与图22-11所示应用Target属性中
Version(应用版本号)一致,否则上传应用会失败。
2.元数据
元数据输入页面如图22-36所示。Description是应用描述信息,这段描述对应用很重要,将出现在App Store
应用介绍中。用户购买应用时,主要通过这段文字来了解我们的应用到底是做什么的,有什么用。因此,要认真、
用心地准备这段文字,描述清楚应用的所有功能,体现出应用的特点、特色等,从而吸引用户来购买。

3.应用审核信息
应用审核信息输入页面如图 22-37所示,这里的信息主要是给苹果审核团队的工作人员看的。在Contact
Information中填写开发者团队中负责与苹果审核小组联系的人员的信息,包括姓名、邮箱和电话号码。
4.最终用户许可协议
最终用户许可协议输入页面如图22-38所示。最终用户许可协议只有用户同意后才能下载我们的应用。如果没
有特别的,建议不要添加。

5.上传应用图标和截图
上传应用图标和截图填写页面如图22-39所示,这里可以上传应用的一些图片,包括应用图标(在App Store
上使用的图标)、 iPhoneiPod touch截图、iPhone 5和第5iPod touch截图以及iPad的一些截图等。这里要注意所
有图片尺寸的要求、格式要求以及DPI要求。随着系统升级,苹果要求的内容也一直在变化,详细内容可以参考
苹果说明

 

22.2.4  上传应用  


22.3  审核不通过的常见原因  
App Store的审核是出了名地严格,相信大家也都略有耳闻。苹果官方提供了一份详细的审核指南,包括22
项、 100多小项的拒绝上线条款,并且条款在不断增加中。此外,还包含一些模棱两可的条例,所以稍有“闪失”,
应用就有可能被拒绝。但是有一点比较好,那就是每次遭到拒绝时,苹果会给出拒绝的理由,并指出你违反了审
核指南的哪一条,开发者可以根据评审小组给的回复修改应用重新提交。下面我们讨论一下被拒绝的常见原因。
1.功能问题
在发布应用之前,我们一定要认真测试,如果在审核中出现了程序崩溃或者程序错误,无疑这是会被审核小
组拒绝的。如果我们想发布一个演示版的程序,通过它给客户演示,这也是不会通过的。应用的功能与描述不相
符,或者应用中含有欺诈虚假的功能,应用都会被拒绝。比如在应用中有某个按钮,但是点击这个按钮时没有反
应或者不能点击,这样的程序也是不会通过的。
苹果不允许访问私有API,有浏览器的网络程序必须使用iOS WebKit框架和WebKit JavaScript。还有几点比较
头痛的规则,那就是如果你的App没有什么显著的功能或者没有长久的娱乐价值,也会被拒绝。如果你的应用在
市场中已经存在了,在相关产品比较多的时候也可能被拒绝。
2.用户界面问题
苹果审核指南规定开发者的应用必须遵守苹果《 iOS用户界面指导原则》中解释的所有条款和条件,如果违
反了这些设计原则,就会被拒绝上线,所以开发者在设计和开发产品之前一定要认真阅读《 iOS用户界面指导原
则》。这些原则中也渗透着苹果产品的一些理念,阅读它们不仅是为了避免程序被拒绝,而且还为了让开发者设
计出更好的App。苹果不允许开发者更改自身按键的功能(包括声音按键以及静音按键),如果开发者使用了这些
按键并利用它们做一些别的功能,将会被拒绝。
3.商业问题
要发布的应用,首先不能侵犯苹果公司的商标及版权。简单地说,在应用中不能出现苹果的图标,不能使用
苹果公司现在产品的类似名字为应用命名,涉及iPhoneiPadiTunes等相关或者相近的名字都是不可以的。苹果
认为这会误导用户,认为该应用是来自苹果公司的产品。误导用户认为该应用是受到苹果公司的肯定与认可的,
也是不行的。
   私自使用受保护的第三方材料(商标、版权、商业机密和其他私有内容),需要提供版权认可。如果应用涉

及第三方版权的信息,开发者就要仔细考虑考虑了。有些开发者的版权法律意识比较淡薄,总会忽视这一点,然
而这一点是非常致命的。苹果对于这种被起诉的侵权应用,最轻的处罚是下架应用,有时需要将开发者账户里的
钱转到起诉者账户。严重的就是,起诉者将你告上法庭,除了自己账户中的钱被扣除外,还要另赔付起诉者相关
费用。
4.不当内容
一些不合适、不和谐的内容,苹果当然不会允许上架的。比如具有诽谤、人身攻击的应用,含有暴力倾向的
应用,低俗、令人反感、厌恶的应用,赤裸裸的色情应用等。含有赌博性质的应用必须并且必须明确表示苹果不
是发起者,也没有以任何方式参与活动。
5.其他问题
关于宗教、文化或种族群体的应用或评论包含诽谤性、攻击性或自私性内容的应用不会被通过,使用第三方
支付的应用会被拒绝,模仿iPod界面的应用将会被拒绝,怂恿用户造成设备损坏的应用会被拒绝。这里有个小故
事,有一款应用,功能是比比谁将设备扔得高,最后算积分,这个应用始终没能上架,因为在测试应用的时候就
摔坏了两部手机。此外,未获得用户同意便向用户发送推送通知,要求用户共享个人信息的应用都会被拒绝。


22.4  小结  

第四部分  实  战  篇

第23章 重构MyNotes应用--iOS网络通信中的设计模式与架构设计  
23.1  移动网络通信应用的分层架构设计  
23.2  基于委托模式实现  
23.2.1  网络通信与委托模式  
23.2.2  在异步网络通信中使用委托模式实现分层架构设计  
23.2.3  类图  
23.2.4  时序图  
23.2.5  数据持久层重构  
23.2.6  业务逻辑层的代码实现  
23.2.7  表示层的代码实现  
23.3  基于观察者模式的通知机制实现  
23.3.1  观察者模式的通知机制回顾  
23.3.2  异步网络通信中通知机制的分层架构设计  
23.3.3  类图  
23.3.4  时序图  
23.3.5  数据持久层的重构  
23.3.6  业务逻辑层的代码实现  
23.3.7  表示层的代码实现  
23.4  小结  

第24章 iOS敏捷开发项目实战--2016里约热内卢奥运会应用开发及App Store发布  
24.1  应用分析与设计  
24.1.1  应用概述  
24.1.2  需求分析  
24.1.3  原型设计  
24.1.4  数据库设计  
24.1.5  架构设计  
24.2  iOS敏捷开发  
24.2.1  敏捷开发宣言  
24.2.2  iOS适合敏捷开发吗  
24.2.3  iOS敏捷开发最佳实践  
24.3  任务1:创建应用基本工作空间  
24.4  任务2:信息系统层与持久层开发  
24.4.1  迭代2.1:编写数据库DDL脚本  
24.4.2  迭代2.2:插入初始数据到数据库  
24.4.3  迭代2.3:编写实体类  
24.4.4  迭代2.4:DAO类XCTest单元测试  
24.4.5  迭代2.5:编写DAO类  
24.4.6  迭代2.6:发布到GitHub  
24.5  任务3:业务逻辑层开发  
24.5.1  迭代3.1:比赛项目业务逻辑类XCTest单元测试  
24.5.2  迭代3.2:编写比赛项目业务逻辑类  
24.5.3  迭代3.3:比赛日程业务逻辑类XCTest单元测试  
24.5.4  迭代3.4:编写比赛日程业务逻辑类  
24.5.5  迭代3.5:发布到GitHub  
24.6  任务4:表示层开发  
24.6.1  迭代4.1:使用资源目录管理图片和图标资源  
24.6.2  迭代4.3:根据原型设计初步设计iPad故事板  
24.6.3  迭代4.3:根据原型设计初步设计iPhone故事板  
24.6.4  迭代4.4:首页模块  
24.6.5  迭代4.5:比赛项目模块  
24.6.6  迭代4.6:比赛日程模块  
24.6.7  迭代4.7:倒计时模块表示层  
24.6.8  迭代4.8:关于我们模块表示层  
24.6.9  迭代4.9:发布到GitHub  
24.7  任务5:收工  
24.7.1  迭代5.1:添加图标  
24.7.2  迭代5.2:设计和添加启动界面  
24.7.3  迭代5.3:植入谷歌AdMob横幅广告  
24.7.4  迭代5.4:性能测试与改善  
24.7.5  迭代5.5:发布到GitHub  
24.7.6  迭代5.6:在App Store上发布应用  
24.8  小结





©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页