移动互联网革命的时代,移动终端、云计算以及极大丰富的APP生态系统让人们实现了高效和便捷!人们的生活和工作由此开始了虚拟与现实的充分融合,购物、社交、聊天、LBS、预订等网络应用层出不穷。苹果当仁不让,全力服务于高品质的生活,总是恰到好处地推出引导潮流的应用;可以预见,iOS仍将领导并继续称霸移动计算天下,在Android与Windows Phone的强势挑战中,为我们奉献更加多彩的作品。如今,苹果公司斥资数十亿美元搭建了服务数据中心,在苹果云之下,我们可以尽情享受苹果网络带给我们的乐趣!本书作者秉持“原创”与“分享”的IT人精神,倾其全力,将研发心得体会毫无保留地呈现在本书中,全面深入剖析Passbook、Newsstand、iCloud、Facebook、微博、苹果地图等开发细节……本书内容:
n iOS 6 Passbook基于Pass Kit编程与Passbook设计
n AppStore应用内购买开发
n Newsstand在杂志应用如何开发
n 把消息推送到用户手里
n iOS6苹果地图开发
n 谷歌Web地图开发
n 百度地图开发
n 定位服务
n 苹果中中国元素新浪微博客服
n Twitter开发
n Facebook开发
n iOS6分享列表应用
n 强大的iCloud客服
n REST Web Service
n SOAP Web Serbice
n ASIHTTPRequest框架使用
n JSON和XML数据交互格式的性能分析与使用
n iOS中对等网络
n iOS中的Socket编程
n Bonjour服务发现
n iOS中蓝牙编程
n Game Kit开发
n iOS中的网络通信架构设计
本书是介绍iOS 6网络编程和云端应用开发技术书籍,介绍了苹果网络、数据交换格式、Web Service、iCloud、定位服务、地图、推送通知、Newsstand、应用内购买、Passbook、以及社交网络编程,还介绍了网络通信设计模式和架构设计。
本书分为5部分:网络基础篇、云服务篇、社交篇、电子商务篇和实战篇。网络基础篇包括第2章~第3章,介绍了网络结构、Socket网络通信、对等结构网络、Bonjour服务发现,以及 JSON和XML数据交互格式。云服务篇包括了第4章~第5章,介绍了客户端服务器结构网络通信两种具体实现方式:REST Web Service和SOAP Web Service,以及 iCloud编程。社交篇包括了第6章~第7章,介绍了Twitter、Facebook、新浪微博社交网络客户端编程API,以及定位服务与地图应用开发。电子商务篇包括了第8章~第11章,介绍了推送通知、Newsstand应用编程、服务器产品类型应用内购买、iOS6 Passbook应用开发。实战篇包括了第12章~第13章,通过重构MyNotes应用介绍了iOS网络通信中的设计模式与架构设计,最后通过价格线酒店预订iPhone客户端开发介绍了iOS敏捷开发过程。
第3章数据交换格式
在
上小学的时候,一次我向云龙同学借一本《小学生常用成语词典》,结果我到他家时,他不在,于是我写了下面(见图31)的留言条。
图31留言条
留言条与类似的书信都有一定的格式,我曾经也学习过如何写留言条。它有4个部分: 称谓、内容、落款和时间,如图32所示。
图32留言条格式
这4个部分是不能搞乱的,云龙同学也懂得这个格式,否则就会出笑话。他知道“称谓” 部分是称呼他,“内容”部分是要做什么,“落款”部分是谁写给他的,“时间”部分是什么时候写的。
留言条是信息交换的手段,需要“写”与“看”的人都要遵守某种格式。计算机中两个程序之间的相互通信,也是要约定好某种格式。
数据交换格式就像两个人聊天,采用彼此都能听得懂的语言,你来我往。其中的语言就相当于通信中的数据交换格式。有的时候,为防止聊天被人偷听,可以采用暗语。同理,计算机程序之间也可以通过数据加密技术防止“偷听”现象。
数据交换格式主要分为: 纯文本格式、XML格式和JSON格式。纯文本格式是一种简单的、无格式数据交换方式。上面的留言条写成纯文本格式如下:
"云龙同学","你好!\n今天上午,我到你家来想向你借一本《小学生常用成语词典》。可是不巧,你不在。我准备晚上6时再来借书。请你在家里等我,谢谢!","关东升","2012年12月08日"
留言条中的4部分数据按照顺序存放,各个部分之间用逗号分隔。有的时候数据量很小,可以采用这种格式。但是随着数据量的增加,问题也会暴露出来。我们总是搞乱他们的顺序,如果各个数据部分能有描述信息就好了。而XML格式和JSON格式可以带有描述信息,这叫做“自描述的”结构化文档。
上面的留言条写成XML格式如下:
?xml version="1.0" encoding="UTF-8"?
note
to云龙同学/to
conent你好!\n今天上午,我到你家来想向你借一本《小学生常用成语词典》。可是不巧,你不在。我准备晚上6时再来借书。请你在家里等我,谢谢!/conent
from关东升/from
date2012年12月08日/date
/note
位于尖括号内容(<to>…</to>等)就是描述数据的标识,在XML中称为“标签”。
上面的留言条写成JSON格式如下:
{to:"云龙同学",conent:"你好!\n今天上午,我到你家来想向你借一本《小学生常用成语词典》。可是不巧,你不在。我准备晚上6时再来借书。请你在家里等我,谢谢!",from:"关东升",date:"2012年12月08日"}
数据放置在大括号“{}”之中,每个数据项之前都有一个描述的名字(如to等),描述名字和数据项之间用冒号(:)分开。描述同样的信息我们会发现,一般来讲JSON所用的字节数要比XML少,这也是为什么很多人喜欢采用JSON格式的主要原因,因此JSON也被称为“轻量级”的数据交换格式。接下来重点介绍XML和JSON数据交换格式。
3.1XML数据交换格式
XML是一种自描述的数据交换格式,虽然XML数据交换格式不如JSON“轻便”,但也是非常重要的数据交换格式。多年来,一直在各种计算机语言之间使用。它是老牌的、经典的、灵活的数据交换方式。而且在计算机的其他领域中XML也有广泛的应用。
3.1.1文档结构
在读写XML文档之前,我们需要了解XML文档结构。在前文中提到的留言条XML文档,是由开始标签<flag>和结束标签</flag>组成。它们就像括号一样把数据项括起来,这样不难看出标签<to></to>之间是表示“称谓”; 标签<conent></conent>之间是表示“内容”; 标签<from></from>之间是表示“落款”; 标签<date></date>之间是表示“日期”。
XML文档结构要遵守一定的格式规范。XML虽然形式上与HTML很相似,但是它有着严格的语法规则,只有严格按照规范编写的XML文档才是有效的文档,称为“格式良好”(wellformed)的XML文档。XML文档的基本架构,可以分为下列几个部分:
(1) 声明: 如图33所示的<?xml version="1.0" encoding="UTF8"?>就是XML文件的声明,它定义XML文件的版本和使用的字符集,此例为1.0版,使用中文UTF8字符。
图33XML文档结构
图34有属性的XML文档
(2) 根元素: 如图33所示的note是XML文件的根元素,<note>是根元素的开始标签,</note>是根元素的结束标签。根元素只有一个,开始和结束标签必须一致。
(3) 子元素: 如图33所示的to、content、from和date是根元素note的子元素。所有元素都要有结束标签,开始和结束标签必须一致。如果开始标签和结束标签之间没有内容,可以写成<from/>,称为“空标签”。
(4) 属性: 图34所示,是具有属性的XML文档,留言条XML文档中没有属性,属性是定义在开始标签中的,在开始标签<Note id="1">中的id="1"是Note元素的一个属性,id是属性名,1是属性值,属性值必须放置在双引号或单引号之间。一个元素不能有多个相同名字的属性。
(5) 命名空间(namespace): 用于一个XML文档中提供名字唯一的元素和属性。例如: 在一个学籍信息的XML文档中需要引用到教师和学生,他们都有一个子元素id,这时候直接引用id元素会造成名称冲突。但是如果将两个id元素放到不同的命名空间中就会解决这个问题。图35中的“xmlns:”开头的内容,xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"等都属于命名空间。
图35命名空间和限定名的XML文档
(6) 限定名(qualified name): 由命名空间引出的概念,定义了元素和属性的合法标识符。限定名通常在XML文档中用作特定元素或属性的引用。图35中的标签<soap:Body>就是合法的限定名,前缀soap是由命名空间定义的。
3.1.2XML文档解析与框架性能
对于XML文档操作包括了“读”与“写”,读入XML文档并分析的过程称为“解析”XML文档; 事实上,在使用XML开发过程中,“解析”XML文档工作占很大的比重。
读写XML文档,目前流行的有两种模式: SAX和DOM。SAX是一种基于事件驱动的解析模式。解析XML的时候,程序从上到下读取XML文档,如果遇到开始标签、结束标签、属性等,就会触发相应的事件,但是这种解析XML文件有一个弊端就是只能读取XML文档,不能写入XML文档。它的优点是解析速度快,iOS重点推荐使用SAX模式解析。
DOM模式是将XML文档作为一棵树状结构进行分析,提供获取节点的内容,以及相关属性,或是新增、删除和修改节点的内容。XML解析器在加载XML文件以后,DOM将XML文件的元素视为一个树状结构的节点,一次性读入到内存中。如果文档比较大,解析速度就会变慢。但是DOM模式有一点是SAX无法取代的,就是DOM能够修改XML文档。
iOS SDK提供了两个的XML框架:
(1) NSXML,基于ObjectiveC语言的SAX解析框架,它是iOS SDK默认的XML解析框架,它不支持DOM模式。
(2) libxml2,基于C语言的第三方(http://xmlsoft.org/)提供的SAX解析框架,被苹果整合在iOS SDK中,它支持SAX和DOM模式。
此外,iOS中解析XML还有很多第三方框架可以采用,这些框架主要有:
(1) TBXML,是轻量级的DOM模式解析库,它不支持XML文档验证和XPath,只能读取XML不能写XML文档;
(2) TouchXML,基于DOM模式解析库,与TBXML类似只能读取XML不能写XML文档;
(3) KissXML,基于DOM模式解析库,它是基于TouchXML,主要的不同是可以写如XML文档;
(4) TinyXML,基于C++语言的DOM模式解析库,可以读写XML文档,不支持XPath;
(5) GDataXML,基于DOM模式解析库,是由Google开发,可以读写XML文档,支持XPath查询。
这么多的框架我们选择哪一个呢?解析性能是选择的主要指标,笔者编写了一个测试程序来测试这些框架,测试程序采用GHUnit单元测试框架。
……
i推荐序(一)Ⅰ
推荐序(二)Ⅲ
赞誉Ⅴ
前言Ⅶ
第1章 开篇综述
1.1 本书结构
1.2 本书中的约定
1.2.1 实例代码约定
1.2.2 图示的约定
网络基础篇
第2章 沟通无限——苹果的网络
2.1 网络结构
2.1.1 客户端服务器结构网络
2.1.2 对等结构网络
2.2 基于Socket的C/S结构网络通信
2.2.1 Socket概念
2.2.2 Socket编程
2.2.3 实例: NSStream&CFStream实现TCP Socket服务器端
2.2.4 实例: NSStream&CFStream实现TCP Socket客户端
2.3 Bonjour服务发现
2.3.1 发布服务
2.3.2 解析服务
2.3.3 查找服务
2.3.4 实例: 基于服务发现的Socket通信服务器端
2.3.5 实例: 基于服务发现的Socket通信客户端
2.4 对等结构网络
2.4.1 使用Game Kit开发对等结构网络应用
2.4.2 实例: 基于蓝牙对等网络通信
本章 小结
第3章 数据交换格式
3.1 XML数据交换格式
3.1.1 文档结构
3.1.2 XML文档解析与框架性能
3.1.3 实例: MyNotes应用XML
3.2 JSON数据交换格式
3.2.1 文档结构
3.2.2 JSON数据编码/解码与框架性能
3.2.3 实例: MyNotes应用JSON解码
本章 小结
云 服 务 篇
第4章 使用Web Service——基于客户端服务器结构网络通信
4.1 REST Web Service
4.1.1 HTTP和HTTPS协议
4.1.2 同步GET方法请求编程
4.1.3 异步GET方法请求编程
4.1.4 POST方法请求编程
4.1.5 实例: REST Web Service实现的MyNotes应用
4.2 SOAP Web Service
4.2.1 WSDL概念
4.2.2 SOAP协议
4.2.3 实例: SOAP Web Service实现MyNotes应用
4.3 ASIHTTPRequest框架使用
4.3.1 安装和配置ASIHTTPRequest框架
4.3.2 同步请求
4.3.3 异步请求
4.3.4 实例: 请求队列应用
4.3.5 实例: 上传数据应用
4.4 反馈网络信息改善用户体验
4.4.1 iOS 6表视图刷新控件的使用
4.4.2 使用等待指示器控件
4.4.3 使用网络等待指示器
4.4.4 使用MBProgressHUD等待指示器
本章 小结
第5章 iCloud编程
5.1 苹果云服务——iCloud
5.2 配置iCloud
5.2.1 创建App ID
5.2.2 创建配置概要文件
5.3 iCloud数据存储
5.3.1 iCloud键值数据存储
5.3.2 iCloud文档存储
5.3.3 iCloud存储注意事项
5.4 iCloud键值数据存储编程
5.4.1 实例: iCloud键值数据存储设计
5.4.2 配置Xcode工程
5.4.3 代码实现
5.5 iCloud文档存储编程
5.5.1 实例: iCloud文档存储编程设计
5.5.2 配置Xcode工程
5.5.3 自定义文档类
5.5.4 获得iCloud文档目录
5.5.5 查找Ubiquity容器中的文档
5.5.6 保存文档
5.5.7 解决文档冲突
5.6 在iCloud下使用Core Data技术
5.6.1 实例: iCloud Core Data编程设计
5.6.2 使用Xcode创建Core Data工程
5.6.3 创建持久化存储协调者
5.6.4 创建被管理的对象上下文
5.6.5 合并iCloud与本地数据
本章 小结
社交篇
第6章 社交网络编程
6.1 苹果公司的社交网络
6.1.1 设置账户信息
6.1.2 社交网络编程API
6.2 iOS 6分享列表——UIActivityViewController
6.2.1 内置活动列表项
6.2.2 自定义活动列表项
6.3 撰写视图控制器——SLComposeViewController
6.4 编写自己的社交网络客户端
6.4.1 实例: 编写新浪微博客户端
6.4.2 实例: 编写Twitter客户端
6.4.3 实例: 编写Facebook客户端
本章 小结
第7章 定位服务与地图应用开发
7.1 定位服务
7.1.1 定位服务编程
7.1.2 地理信息反编码
7.1.3 地理信息编码查询
7.1.4 关于定位服务的测试
7.2 使用iOS 6苹果地图
7.2.1 显示地图
7.2.2 添加标注
7.2.3 跟踪用户位置变化
7.3 使用程序外地图
7.3.1 调用iOS 6苹果地图
7.3.2 调用谷歌Web地图
7.4 使用本地化的百度地图
7.4.1 百度地图的安装与初始化
7.4.2 显示地图
7.4.3 地理信息编码与反编码
7.4.4 添加标注点
本章 小结
电子商务篇
第8章 发布你的促销信息——推送通知
8.1 苹果中究竟有多少个“通知”
8.1.1 广播通知
8.1.2 本地通知
8.1.3 推送通知
8.2 配置推送通知
8.2.1 证书签名请求
8.2.2 配置应用推送通知
8.2.3 生成SSL证书
8.2.4 为SSL证书导出p12文件
8.3 iOS客户端编程
8.3.1 配置Xcode工程
8.3.2 代码实现
8.4 推送服务端编程
8.4.1 使用PHP实现推送服务
8.4.2 使用Java推送服务
本章 小结
第9章 报刊杂志——Newsstand应用编程
9.1 iOS 5中Newsstand应用
9.2 Newsstand应用编程
9.2.1 配置Newsstand
9.2.2 使用Newsstand Kit API
9.3 实例: MyNewsstand杂志应用
9.3.1 实例设计原型草图
9.3.2 实例设计类图
9.3.3 初始化杂志画面
9.3.4 主动式下载资源
9.3.5 后台下载资源
9.3.6 断点续传
9.3.7 读取杂志内容
本章 小结
第10章 应用内购买
10.1 应用内购买实例设计
10.2 测试环境搭建
10.2.1 添加测试用户
10.2.2 创建App ID
10.2.3 添加空白应用
10.2.4 为应用添加购买产品信息
10.3 服务器产品类型应用内购买
10.3.1 工作流程
10.3.2 实例: 应用内购买iOS客户端
10.3.3 实例: PHP实现的服务器端
本章 小结
第11章 iOS 6 Passbook应用开发
11.1 Passbook与Pass
11.1.1 Pass的5种风格
11.1.2 Pass的内部结构
11.2 设计Pass
11.2.1 pass.json文件结构
11.2.2 Pass类型和字段
11.2.3 二维条形码
11.2.4 位置与时间
11.2.5 本地化
11.2.6 图标和图片的使用
11.3 创建Pass
11.3.1 创建Pass证书
11.3.2 数字签名与打包Pass文件
11.4 发布Pass
11.4.1 Email发布
11.4.2 Web网站发布
11.5 Pass Kit编程
11.5.1 实例: MyPass实例设计与说明
11.5.2 准备工作
11.5.3 访问Passbook
11.5.4 添加与替换Pass
11.5.5 删除Pass
本章 小结
实战篇
第12章 重构MyNotes应用——iOS网络通信中的设计模式与架构设计
12.1 移动网络通信应用的分层架构设计
12.2 基于委托模式实现
12.2.1 网络通信与委托模式
12.2.2 异步网络通信中委托模式实现分层架构设计
12.2.3 类图
12.2.4 时序图
12.2.5 数据持久层代码实现
12.2.6 业务逻辑层代码实现
12.2.7 表示层代码实现
12.3 基于观察者模式通知机制实现
12.3.1 观察者模式的通知机制回顾
12.3.2 异步网络通信中通知机制实现分层架构设计
12.3.3 类图
12.3.4 时序图
12.3.5 数据持久层代码实现
12.3.6 业务逻辑层代码实现
12.3.7 表示层代码实现
本章 小结
第13章 iOS敏捷开发项目实战——价格线酒店预订iPhone客户端开发
13.1 应用分析与设计
13.1.1 应用概述
13.1.2 需求分析
13.1.3 原型设计
13.1.4 架构设计
13.2 iOS敏捷开发
13.2.1 敏捷开发宣言
13.2.2 iOS可以敏捷开发
13.2.3 iOS敏捷开发一般过程
13.3 任务1: 创建应用基本工作空间
13.3.1 迭代1.1 创建业务逻辑层工程
13.3.2 迭代1.2 创建表示层工程
13.4 任务2: 业务逻辑层开发
13.4.1 迭代2.1 编写搜索酒店的业务逻辑层类
13.4.2 迭代2.2 编写房间查询业务逻辑类
13.5 任务3: 表示层开发
13.5.1 迭代3.1 根据原型设计初步设计故事板
13.5.2 迭代3.2 搜索酒店模块
13.5.3 迭代3.2.1 选择城市视图控制器
13.5.4 迭代3.2.2 选择关键字视图控制器
13.5.5 迭代3.2.3 选择价格和日期拾取器
13.5.6 迭代3.2.4 酒店搜索视图控制器
13.5.7 迭代3.2.5 酒店搜索列表视图控制器
13.5.8 迭代3.3 房间查询模块