MonoTouch应用开发实践指南:使用C#和.NET开发iOS应用

更多详情

内容简介: 《MonoTouch应用开发实践指南:使用C#和.NET开发iOS应用》是Amazon五星畅销书,广获好评。内容全面,系统讲解了利用MonoTouch开发iOS应用的技术和方法;注重实战,包含大量精心设计的案例,可操作性极强。它是有效指导有经验的.NET开发者利用已掌握的.NET技术快速开发iOS应用的参考书,为.NET开发者低成本地向iOS开发者过渡提供了捷径。
全书一共12章:第1~2章首先详细介绍了MonoTouch开发环境的搭建以及MonoTouch应用的创建方法,然后介绍了iOS SDK和MonoTouch之间的关联以及MonoTouch的工作原理;第3~6章分别讲解了视图控制器、常用的iOS类、表格和导航、图形和动画等MonoTouch的基础功能;第7~11章详细讲解了核心定位、MapKit框架、Web服务连接、基于蓝牙的服务发现和联网技术,以及应用数据的保存;第12章介绍了如何利用MonoTouch开发iPad应用。

目录: 《MonoTouch应用开发实践指南:使用C#和.NET开发iOS应用》
译者序

前言
第1章 Hello,MonoTouch / 1
1.1 搭建开发环境 / 2
1.1.1 安装iOS SDK和苹果开发工具 / 2
1.1.2 安装MonoTouch / 5
1.2 创建MonoTouch应用程序 / 9
1.2.1 创建用户界面 / 9
1.2.2 添加outlet / 10
1.3 在设备上进行开发 / 15
1.4 使用MonoTouch调试器 / 20
1.5 小结 / 21
第2章 iOS SDK与MonoTouch / 22
2.1 iOS SDK概述 / 23
2.2 通过示例将Object-C与MonoTouch进行对比 / 24
2.2.1 从Xcode开始编写应用程序 / 25
2.2.2 在MonoTouch中实现相同的功能 / 29
2.2.3 AppDelegate实现的比较 / 30
2.2.4 通过Xcode实现UIActionSheet / 33
2.2.5 在MonoTouch中实现UIActionSheet / 35
2.3 MonoTouch的工作原理 / 38
2.4 小结 / 41
第3章 视图和视图控制器 / 42
3.1 构建MonoTouch MVC应用程序 / 43
3.2 在IB中使用视图和控制器 / 44
3.3 为视图控制器及其视图添加功能 / 50
3.4 使用多个视图和控制器 / 53
3.5 实现自定义UIView / 57
3.6 小结 / 61
第4章 常用的iOS类 / 62
4.1 用户界面视图和控件 / 63
4.1.1 UISegmentedControl / 63
4.1.2 UISlider / 66
4.1.3 UISwitch / 68
4.1.4 UIPageControl和UIScrollView / 69
4.1.5 UIActivityIndicatorView / 71
4.1.6 UIProgressView / 73
4.1.7 UIImageView / 74
4.1.8 UIWebView / 75
4.1.9 ADBannerView / 77
4.2 设备功能 / 80
4.2.1 MFMailComposeViewController / 80
4.2.2 MPMediaPickerController和MPMusicPlayerController / 81
4.2.3 地址簿 / 84
4.2.4 UIImagePickerController / 87
4.3 小结 / 91
第5章 表格和导航 / 92
5.1 UITableView和UITableViewController的概述 / 93
5.1.1 表格有什么用 / 93
5.1.2 在UITableView中显示数据 / 94
5.1.3 UITableViewCell部件与样式 / 99
5.1.4 使用表格和导航 / 102
5.2 其他的UITableView自定义功能 / 115
5.2.1 自定义表格及其单元格 / 115
5.2.2 增加多个区域 / 119
5.2.3 MonoTouch.Dialog / 123
5.3 小结 / 124
第6章 图形和动画 / 125
6.1 核心图形 / 126
6.1.1 核心图形基础 / 126
6.1.2 绘制图像 / 131
6.1.3 绘制PDF / 134
6.2 动画 / 143
6.2.1 UIView动画 / 143
6.2.2 核心动画 / 147
6.3 小结 / 155
第7章 核心定位 / 156
7.1 核心定位概述 / 157
7.2 标准定位服务 / 158
7.3 检索方向变更 / 166
7.4 显著位置变更服务 / 168
7.5 区域监测 / 170
7.6 后台定位 / 172
7.7 小结 / 175
第8章 MapKit / 176
8.1 MapKit概述 / 177
8.2 添加标注 / 181
8.3 地图叠加 / 188
8.4 小结 / 193
第9章 连接Web服务 / 194
9.1 连接基于REST的Web服务 / 195
9.1.1 通过HTTP连接 / 195
9.1.2 解析XML结果 / 197
9.1.3 解析JSON结果 / 200
9.2 使用基于SOAP的Web服务 / 201
9.2.1 使用.NET 2.0客户端代理 / 201
9.2.2 MonoTouch下的WCF / 203
9.3 使用CocoaTouch的HTTP类 / 204
9.4 小结 / 206
第10章 联网 / 207
10.1 GameKit联网功能 / 208
10.1.1 GameKit联网核心类 / 208
10.1.2 使用GKPeerPickerController / 216
10.1.3 GameKit语音聊天 / 219
10.2 Bonjour / 223
10.3 小结 / 231
第11章 保存应用程序的数据 / 232
11.1 记事本示例应用程序 / 233
11.2 SQLite / 238
11.3 序列化 / 243
11.4 Settings Bundle和NSUserDefaults / 245
11.5 小结 / 252
第12章 iPad开发 / 253
12.1 移植到iPad / 254
12.1.1 在iPhone应用程序使用像素倍增技术 / 254
12.1.2 通用应用程序 / 255
12.2 基于iPad的设计 / 258
12.2.1 UISplitViewController / 258
12.2.2 UIPopoverController / 267
12.3 小结 / 270

译者序: 在iPhone和iPad风行世界的时候,基于App Store的整个生态链也就建立起来。如果持续关注每月的程序设计语言排名,就会发现Objective-C飙升得非常快。最新的排行数据显示,Objective-C已经超越C++,登上了第三名的位子。这说明越来越多的开发人员已投身于iPhone与iPad的应用程序开发当中了。Objective-C是否就是iPhone和iPad应用程序开发的唯一选择呢?
对于Mono,在我的印象中一直是将C#移植于Linux平台。直到接触本书的时候,才知道原来Mono还有个MonoTouch项目,用于iPhone和iPad应用程序开发,这无疑是广大.NET平台开发爱好者的福音。对于已熟悉一种平台开发的开发人员来说,半道出家,去学习另一种平台的开发理念和开发语言,无疑是巨大的挑战,而且学习时间有限,项目不等人啊!因此能用最熟悉的开发方法,以最快的时间开发出产品去占有市场是最好的选择。而且,使用.NET进行开发,还可以实现部分代码的跨平台重用,这也是一举多得的好事。总而言之,MonoTouch是不错的选择,值得推荐!
本书是一本不错的、针对初学者学习MonoTouch的书。全书以简单明了的示例,一步一步地讲述了MonoTouch的开发模式和一些常用控件及底层功能。我们的翻译过程,也是一个学习过程。通过翻译本书,基本掌握了使用MonoTouch开发iPhone和iPad应用程序的基本方法。这也大大增加了我们开发iPhone和iPad应用程序的兴趣。
参加本书翻译的人员有黄灯桥和黄浩宇。因为都是第一次从事翻译工作,错误和纰漏在所难免,望大家见谅。
译者

前言: 欢迎阅读本书。如果你是一个.NET开发人员且有兴趣开发基于iOS设备的本地应用程序,那么MonoTouch是个不错的选择。它在优雅的C#和.NET中融合了CocoaTouch框架和Objective-C语言概念,让其成为一个精心设计且乐在其中的技术。可以使用MonoTouch,在App Store和企业中部署应用程序(假设具有适用的许可证)。甚至只需要一个免费版本的模拟器,就可以学习和尝试它,而不需要任何额外的费用。此外,如果你是一个学生,还可以使用带有折扣的学生版本。
MonoTouch允许使用与Objective-C一样的API创建应用程序,同时提供了许多基于Mono、C#和.NET的语言和API特性。此外,除了很好地抽象化了Objective-C的内存管理外,还可以使用垃圾回收、可重用的非UI代码、SQLite的ADO.NET封装、Web服务、LINQ和泛型等技术。
MonoTouch很强大,因为它构建于苹果公司的技术之上,同时增加了大量额外的功能来辅助开发应用程序。围绕MonoTouch的团队和社区也是值得关注的。可以通过论坛、邮件列表以及非常活跃的IRC通道等渠道从MonoTouch团队和社区成员那里获得支持,讨论你的想法,或者只是潜水。社区是讨论MonoTouch相关问题的最好平台。而在IRC通道,则会发现从MonoTouch新手到Mono和MonoTouch创建者,他们每一个人都在为使开发人员的体验更好而努力工作着。
本书是如何组织的
本书一共有12章来帮助你学习一切你需要知道的有关使用MonoTouch进行iOS开发的知识。
第1章演示了如何搭建开发环境,以及在MonoDevelop中使用各种开发工具进行开发的一些基础知识。然后演示了一个简单应用程序的开发过程,随后讲解了其内部工作原理。该章还概述了在设备上部署应用程序的方法以及使用MonoTouch软调试器调试应用程序的方法。
第2章介绍MonoTouch如何抽象化iOS SDK,以便使用C#开发本地类。首先概述了iOS SDK,并通过一个简单示例演示了Objective-C的开发过程,随后与相应的C#的开发过程进行了比较。通过这个示例,本章讲解了outlet的工作原理,对常用的iOS开发模式进行了比较,还演示了如何在C#中使用它们。最后概述了Objective-C的内存管理机制,并与MonoTouch的垃圾回收机制进行了比较,演示了如何在MonoTouch开发中注意这些问题以及何时在C#代码中考虑Objective-C模型。
第3章介绍了使用模型-视图-控制(Model-View-Controller, MVC)设计模式搭建MonoTouch应用程序的过程,还介绍了UIView类和UIViewController类,并通过触碰支持和加速度计的示例演示了如何在代码和Interface Builder中使用它们。
第4章介绍了如何使用iOS开发常用的几个基本类,还演示了如何使用iOS SDK封装多视图和控制器以帮助创建用户界面,以及几个抽象为不同功能的控制器,如地址簿、摄像头访问、发送电子邮件和播放iPod库中的音乐等功能。
第5章介绍UITableView和UITableViewController,并演示了一些通常使用表格的常见场景。随后讲述和演示了使用UITableViewController的基本模式,并演示了几个自定义UITableView的方法,为应用程序在视觉和性能上提供丰富的体验。该章还介绍了UINavigationController,并演示了如何结合UITableViewController使用它。
第6章讲述图形和动画子系统(核心图形(Core Graphics)和核心动画(Core Animation)),并分别讲解了如何在UIKit下使用它们以便在iOS中构建常见的基本动画。
第7章介绍核心定位(Core Location)框架,并演示了如何通过蜂窝、Wi-Fi或GPS等技术直接使用它来获取定位数据。然后深入研究了一些新的定位技术,如显著位置变更和区域监测。
第8章介绍MapKit框架,包括MKMapViewControl,并演示了如何在应用程序中创建交互式地图。还讲解了在MapKit中集成核心定位,以及如何添加标注和叠加地图来创建自定义的地图体验。
第9章介绍几种在MonoTouch中可用的Web服务技术。讨论了如何在MonoTouch开发中使用基于SOAP的Web服务、REST服务,以及JSON、XML、RSS和WCF。除了.NET外,该章还演示了如何在MonoTouch中使用CocoaTouch的 HTTP协议。
第10章演示了GameKit框架提供的基于蓝牙的服务发现和联网等网络功能,包括如何在设备之间创建语音通信。然后还演示了如何使用Bonjour直接发布和发现服务,使用了熟悉的.NET网络技术,如TcpClient。
第11章演示了在使用MonoTouch时,几种在iOS中可用的数据存储技术,如SQLite的ADO.NET提供程序、.NET序列化和NSUserDefaults。还创建了在第12章中要用到的示例应用程序。
第12章介绍了几种专门为iPad应用程序开发提供的类。继续完成第11章中的示例应用程序,演示了如何将一个iPhone应用程序转化为或扩展为一个既适用于iPhone和iPod Touch,又适用于iPad的通用应用程序。

序言: 2008年,当我在微软专业开发人员大会上听到Miguel de Icaza所做的Mono讲座时,第一次了解了Mono团队所做的iPhone工作。Miguel谈到他们是怎样把.NET和C#开发作为Unity3D游戏平台的一部分引入iPhone的。他们居然能做到这一点,这太神奇了。那时,我已经把Xcode和Objective-C用在了iPhone上,而且我也和许多人一样,认为它真是个不错的平台。在与.NET和C#打了这么多年的交道后,能够在iPhone上使用这些技术的想法吸引了我。.NET和iPhone是我最喜爱的两种技术组合。然而,我没关注过游戏的开发,所以当时并没有进行相关研究。
2009年,Joseph Hill来到我们当地的.NET代码营发表了有关Mono的演讲。这时,Mono团队已经开始开发即将成为MonoTouch的产品了。Joseph提到很快就会有个内部测试,如果有兴趣可以和他联络。我想如果他们能够提供些许Objective-C或者一般来说.NET所能提供的功能那也不错,因为这就可以为解决iPhone的一些问题提供另外的选择,比如垃圾回收和代码复用。
我完全不知道他们放在桌子上的东西竟然是我用Objective-C在iPhone上能做的一切,同样也是.NET能实现的绝大部分工作。而且,我后来发现,MonoTouch团队和社区都是一些知识丰富的人,他们对他们从事的工作充满热情。围绕MonoTouch所发生的故事非常具有震撼力,因为增加在iOS上解决问题的工具的同时,不需要牺牲用户体验或者平台的能力。我享受使用MonoTouch的每一个时刻,相信你也会这样。
本书读者对象
本书主要针对有多年程序开发经验但很少甚至没有iPhone或Mac开发经验的.NET/C#开发人员。我们假定读者已具有C#/.NET中等水平。然而,对于Objective-C开发人员,本书涉及许多与语言无关的核心 iOS概念,所以也具有参考意义。本书将教授C#/.NET开发人员怎样把现有技巧运用到iPhone上去,用MonoTouch创建iOS应用程序。
关于示例代码
所有示例代码均可访问我的Github账户获取,地址为https://github.com/mikebluestein。
致谢
首先,我要感谢我的妻子和孩子在我为写这本书而不能陪伴他们的所有时间内所做的一切。没有他们的鼓励我不可能完成本书。可以想象,本书的创作过程牵涉了许多人。感谢Pearson团队所给予的支持和努力,包括Chuck Toporek、Sheri Cain、Olivia Basegio、Bart Reed和Anne Goebel以及所有幕后工作人员。我还要感谢卓越的Mono和MonoTouch团队开发出如此出色的平台,其中特别要感谢Joseph Hill自打我加入MonoTouch社区那一刻开始就一直给我支持和鼓励,感谢Miguel de Icaza为各地开发人员所做的出色工作。 我还要特别感谢Geoff Norton领导创建了MonoTouch并给所有人无私的支持和指引。多少次我被问题难倒直至深夜依然不得其解,正如他帮助其他人一样,他总在我身旁尽他所能给我帮助和支持。我还要感谢Geoff、 Chris Hardy和Robert Kozak为本书所做的技术审校。能创作一本关于MonoTouch的书我感到非常开心,希望读者能够像我享受写这本书那样来阅读它。

书摘: 第1章
Hello,MonoTouch
1.1 搭建开发环境
1.2 创建MonoTouch应用程序
1.3 在设备上进行开发
1.4 使用MonoTouch调试器
1.5 小结
本章将介绍MonoTouch的开发环境。首先讲述搭建开发环境的所有步骤;然后创建第一个MonoTouch应用程序,并介绍MonoDevelop这个IDE开发工具和调试器;最后讲述如何将设备配置为开发部署设备。
1.1 搭建开发环境
在使用MonoTouch开发之前,有许多事情需要先验知识(priori)。首先从苹果(Apple)入手获取所需要的一切,然后过渡到必不可少的MonoTouch上。
1.1.1 安装iOS SDK和苹果开发工具
欢迎来到使用.NET进行iOS应用开发的世界。我敢肯定,你现在会兴奋得想立刻开始编写程序,不过,首先要做的是在手头那部闪闪发亮的Mac上搭建开发环境。然后熟悉一下在模拟器和iPhone上进行开发所需的所有步骤以及应用程序如何在它们中运行。
注意 本书的内容也适用于iPod Touch和iPad。本书将iPhone、iPod Touch或iPad统称为“设备”(device),只有在只适用于某个设备的时候才会提及设备的名称。
现在要做的第一件事是,到iOS开发者计划(iOS Developer Program)中注册。通过免费账号可下载在iOS模拟器中使用的开发工具和iOS SDK,还可以访问iOS开发中心(iOS Dev Center)的其他资源。如果要在设备上部署应用程序并将它发布到iTunes App Store,就要从苹果购买付费许可。可以在图1-1所示的iOS开发者中心主页上找到注册链接。
注册后,登录到iOS开发者中心并下载包含XCode的iOS SDK,它提供了整套使用Objective-C开发iPhone应用程序的工具。没错,你没眼花。MonoTouch建立在苹果开发工具链的顶端,并带来了优雅的C#和.NET。它是一个两全其美的设计,既符合苹果的设计规范,又可以让使用者体验到像使用本地应用程序一样自然。在MonoTouch的旅程中一定会获益良多,不过,现在还是先回到搭建环境上。
如图1-2所示,下载包含XCode的iOS SDK。在本书中,将使用Mac OS X雪豹(Mac OS X Snow Leopard)进行iOS开发。
下载并安装苹果的iOS SDK之后,先要做一个快速的完整性测试,以确保在继续下一步之前的工作一切正常没有错、漏。不用担心这看起来似乎很外行,只要明白验证安装是一件很开心的事就行。在终端中输入命令open –n/Developer/Applications/Xcode.app打开Xcode这个苹果的IDE开发工具。Xcode运行后,在主菜单选择File→New Project,创建一个iPhone应用程序。然后如图1-3所示在New Project(新建工程)对话框的左侧,选择iOS下的Application,并选择View-based Application模板。最后将工程名称修改为LMT1-1,并单击Save(保存)按钮保存新建工程。
图1-1 iOS开发者中心页面上的注册和登录链接
图1-2 登录开发者中心后显示的下载链接
图1-3 在Xcode中创建一个新工程
在Xcode IDE加载工程模板后,单击顶部工具栏的Build and Run按钮。如果一切正常,将启动iPhone模拟器并加载应用程序,显示如图1-4所示的空白屏幕。
图1-4 在Xcode中创建的只有一个空白窗口的iPhone应用程序
关闭模拟器并返回Xcode后,展开如图1-5所示的Group & Files内的NIB Files节点,然后双击LMT1-1ViewController.xib文件。这时,苹果的用户界面设计工具Interface Builder(IB)将会启动,并显示如图1-6所示的LMT1-1ViewController.xib文件的内容。如果以上操作一切正常,说明iOS SDK和苹果开发工具已经正确安装。现在,可以转移到MonoTouch了。
图1-5 在Xcode的Group & Files中展开NIB Files节点后的效果
图1-6 MainWindow.xib文件在IB的显示效果
1.1.2 安装MonoTouch
MonoTouch是基于Mono平台、在Linux或Mac OS X平台上使用.NET开发应用程序的开源开发环境。在使用MonoTouch之前,需要先安装最新发布的基于OS X平台的Mono(当前版本为2.10.1),可以到www.go-mono.com/mono-downloads/download.html上下载。如图1-7所示,在Select Plantform下选择Mac OS X,然后选择Intel旁边的链接进行下载。
图1-7 OS X平台的Mono下载页面
安装完Mono后,准备安装MonoTouch SDK。如果要将MonoTouch开发的应用程序部署到设备并提交到iTunes App Store,首先要为苹果iOS开发者的账号付费,还要购买一个Novell的MonoTouch商业许可协议。如果只是想在模拟器上进行开发,可以从Novell网站的http://monotouch.net/DownloadTrial下载MonoTouch的免费试用版本。如果已经为苹果iOS开发者的账号付费,并且想购买MonoTouch许可证,可以到位于http://monotouch.net/Store的MonoTouch的商店进行购买,在该页面中,可以对各种许可证版本进行比较,并选择一个适合的版本。购买后,会在浏览器中显示一个带有激活码的确认回执。
注意 记得保存好回执,因为后面需要使用回执里的激活码。
在Novell发回的电子邮件中,会有一个许可授权版本的MonoTouch SDK的下载链接。从下载链接下载安装包后,进行安装。当提示安装完成后,在MonoTouch激活对话框中,将确认回执(购买许可后在浏览器中保存下来的那份确认回执)中的激活码输入进行激活。要验证是否安装成功,可在终端中输入命令/Developer/MonoTouch/usr/bin/mtouch–version,显示当前运行的MonoTouch版本。现在,准备安装MonoDevelop。
注意 iOS平台上基于Mono的新版软件会由一个名为Xamarin的新公司进行开发,该公司由创建Mono和MonoTouch的团队组建。他们的MonoTouch产品向后兼容。要获得更多信息可浏览xamain.com网站。
MonoDevelop是一个用来进行MonoTouch开发及其他事情的IDE工具。它很好地集成了苹果的工具链并支持全部调试功能,这些将在本章后面进行讲述。要下载用于MonoTouch开发的MonoDevelop版本,可访问http://monodevelop.com/Download/Mac_MonoTouch,然后选择install链接下载并进行安装。MonoDevelop安装完成后,打开Finder的Application(应用程序)目录,双击MonoDevelop图标,运行应用程序,将看到如图1-8所示的窗口。
图1-8 MonoDevelop IDE
注意 也可以在终端中执行命令“open–n /Applications/Monodevelop.app”运行MonoDevelop的多个实例。
MonoDevelop运行后,进行一次之前在Xcode中做过的完整性测试,以确保一切运作正常,步骤如下:
1)在主工具栏中选择File→New→Solution,创建一个新的解决方案。
2)在如图1-9所示的New Solution(新建解决方案)对话框中,在模板树中选择 C#→iPhone and iPad。然后选择iPhone Window-based Project模板。
3)将解决方案的名称修改为LMT1-2后,单击Forward按钮,然后单击OK按钮。(因为 Project Features选项不适用于MonoTouch,因而可忽略该选项,保留复选框为未选状态。)
4)在下拉菜单中选择Run→Run。让MonoDevelop生成应用程序,并将它安装到模拟器上。然后在模拟器内运行应用程序,将会看到与之前在Xcode中创建的应用程序一样的空白屏幕。
5)退出模拟器并返回MonoDevelop,开始检查集成的IB。
注意 在初次运行MonoDevelop时,如果有任何升级提示,应该安装它们。
图1-9 MonoDevelop New Solution(新建解决方案)对话框
MonoDevelop很好地与IB集成开发原生应用程序,该程序与使用Xcode和Objectitve-C开发的应用程序不但观感(look and feel)一样,而且使用的控件实际上也是一样的,这在本章后面将会讲述,目前继续进行与之前Xcode一样的检测工作。在解决方案标签页内展开解决方案和工程,会看到MainWindow.xib文件和其他一些工程文件。双击MainWindow.xib就可打开IB并看到一个空白窗口。
如果一切正常,说明MonoTouch已安装成功。当创建了一个非空白窗口的应用程序后,要将它部署到设备上,还需要花点儿时间。现在开始去做吧!
1.2 创建MonoTouch应用程序
在本节中,将编写一个带有标签和按钮的简单应用程序,并通过单击按钮来改变标签的文本显示。完成后的应用程序将如图1-10所示。
图1-10 完成后的Hello MonoTouch应用程序
1.2.1 创建用户界面
首先要做的是创建用户界面。返回刚才在MonoDevelop创建的包含一个空白窗口的应用程序,如果IB还没打开,双击MainWindow.xib文件打开IB。前面提及过,IB是苹果的用户界面设计工具,可以用它来创建应用程序的界面。如果曾经进行过Windows或ASP.NET开发,就会觉得它的作用有点类似于Visual Studio中的设计工具,但是功能不同。IB管理的是xib文件,它是一个XML格式的文件,在文件里封装了所有定义应用程序用户界面的对象。当生成应用程序时,xib文件会转换为以.nib为扩展名的二进制格式文件(这就是常说的“nib文件”)。基本上,xib文件就是UI层的序列化对象图。现在,可根据以下步骤创建一个用户界面:
1)在IB中,如图1-11所示那样在Library窗口中选择Objects(对象)标签页。
2)在Library窗口内滚动中间区域的滚动条,直到看到类型为UILabel的标签控件(Label)。然后将它拖动到窗口的设计界面上,并放置在靠窗口顶部的位置。
3)现在,添加一个按钮用来改变标签的显示。在Library窗口中找到类型为UIButton的Round Rect Button对象,将它拖到窗口里,并放在标签下面。
4)将按钮加入设计界面后,双击按钮进入编辑模式,将按钮的文本改为“Say Hello”。
5)保存xib文件后,返回MonoDevelop并运行应用程序。
当应用程序在模拟器中运行时,会看到添加的按钮和标签。触碰(实际只能单击,因为是在模拟器上运行的)按钮,会看到按钮的背景颜色变成了蓝色,但什么也没有发生。要在触碰按钮时改变标签的文本,还要为按钮编写相应的代码。准备好,继续!
1.2.2 添加outlet
IB不像常用的微软开发工具那样支持类代码生成。要在IB中定义的视图与代码之间实现交互,需要使用outlet,它可在代码中引用在xib文件中定义的对象。虽然需要一些手动步骤来完成该工作,但很快就会熟悉。而且,通过C#语言(尤其是局部类)与MonoTouch设计工具相结合,实际接触的代码比在使用objective-C和Xcode时要少很多。现在,回到IB。
在IB中,需要为示例创建两个outlet,一个用于按钮,以便订阅其事件;另一个用于标签,以便通过程序来修改它的文本。下面先创建标签的outlet,在Library窗口中选择Classes标签页,然后在列表中选择AppDelegate。最后,如图1-12所示,选择AppDelegate之后,在显示的Library窗口下半部分区域选择Outlets。
AppDelegate是一个类,其作用是接收由UIApplication操作所触发的调用,例如应用程序启动完成(有点类似回调接口,不过并不完全相同)。这里,“委托”(Delegate)并不是.NET中所熟悉和喜爱的委托,而是整个IOS SDK中常用的Objective-C技术。MonoTouch支持Objective-C 的Delegates(委托),将该委托抽象化,让C#和C# Delegates(委托)都可以对它进行访问。如果暂时无法理解这个概念也不要紧,第2章会详细讲述它。现在,只需要知道在应用程序中可通过AppDelegate类访问按钮和标签就可以了,因此需要在AppDelegate中为它们创建outlet。
要将UILabel的outlet添加到AppDelegate中,单击Library窗口左下角的+按钮添加一个outlet,将它的默认的名字myOutlet1修改为HelloLabel。新outlet的类型(Type)的默认值是id,它的值也可以是任何的NSObject,和C#的对象有点类似,将该值改为UILabel,这样就可将标签连接到outlet了(下面要做的事),而且只能连接到UILabel,不能是其他对象。完成后,将会看到如图1-13所示的Library窗口。
回顾一下刚才所做的,会给有微软开发经验的用户带来非常不同的用户体验。现在,有了保存用户界面显示所需要的所有序列化对象的xib文件,有了实现用户界面对象之间交互的代码,而要将xib中的对象与代码连接起来,需要在IB的AppDelegate中为UILabel添加outlet。剩下的工作就是将UILabel连接到刚刚定义的outlet,而这将会在C#中创建一个指向UILabel的属性。
要连接窗口中的UILabel与AppDelegate中的UILabel outlet,在MainWindow.xib窗口中选择AppDelegate,然后在主菜单中打开Connections Inspector (Tools→Connections Inspector)窗口。在Outlet区域中,会看到刚才创建的HelloLable outlet。单击Connections Inspector中outlet右边的圆形图标,并按住鼠标键(如果是多按钮鼠标,按住鼠标左键),将它拖到窗口的标签上。按住鼠标键将鼠标指针移动标签上面,会看到标签的颜色变成了蓝色,这说明它的属性类型没有错,是outlet定义的UILabel类型。如果拖动到按钮上,就不会有提示表明该控件可以与outlet连接。这是因为之前将outlet的类型由id改为UILabel了,如果不修改,类型还是id,outlet就可以连接任何控件。这就留下了一个隐患,有可能做出错误的连接。在标签上松开鼠标按钮即可建立连接。下面讲述在MonoDevelop中会触发什么事件,不过,要先完成按钮的连接。重复之前的步骤将按钮连接到outlet。这次,outlet的名称为SayHellButton,类型为UIButton。重复之前的拖放操作,这次的目标是窗口中的UIButton。请注意,也可以将outlet拖动到MainWindow.xib窗口的元素上进行连接(这也是为什么要保留树形视图的原因),因为它们都代表着相同的对象。如果元素在窗口的初始状态是隐藏的,就会相当方便。将IB中完成的操作保存。此时,应用程序所需要的东西已经准备完毕,可通过代码实现对象串之间的交互了(如图1-14所示)。
现在开始把注意力集中到代码上。首先,先看一下在IB中保存所有东西后,MonoDevelop如何响应所有这些outlet。在MonoDevelop中,展开Solution Explorer的MainWindow.xib,打开MainWindow.xib.designer.cs文件,将看到代码清单1-1所示的代码。在代码中定义了一个局部类,包含了所有在IB中创建的outlet连接。这里看到的是AppDelegate类的一部分类,包括为IB中每一个连接所创建的多个属性。此外,要注意使用Connect特性(attributes)来声明这些属性(properties)。这些都是MonoTouch为代码连接到IB中的outlet所要做的。最后要注意的是AppDelegate类的Register特性,MonoTouch会使用它在Objective-C运行时注册一个类。
图1-14 IB中显示的UIButton和UILabel的outlet连接
注意 严格地说,MonoTouch会自动注册NSObject的子类。默认情况下,它使用Full.Namespace.Typemape这样的格式来注册子类。特性的作用就是将注册类名映射成“简写名称”(ShortName);否则,MonoTouch.UIKit.UIButton就连接不到UIButton。
代码清单1-1 MainWindow.xib.designer.cs
//
//
// This code was generated by a tool.
// Mono Runtime Version: ...
//
// Changes to this file may cause incorrect behavior and
// will be lost if the code is regenerated.
//

//
namespace LMT12
{
// Base type probably should be MonoTouch.Foundation.NSObject or
// subclass
[MonoTouch.Foundation.Register("AppDelegate")]
public partial class AppDelegate
{
private MonoTouch.UIKit.UIWindow __mt_window;
private MonoTouch.UIKit.UIButton __mt_SayHelloButton;
private MonoTouch.UIKit.UILabel __mt_HelloLabel;
#pragma warning disable 0169
[MonoTouch.Foundation.Connect("window")]
private MonoTouch.UIKit.UIWindow window {
get {
this.__mt_window = ((MonoTouch.UIKit.UIWindow)
(this.GetNativeField ("window")));
return this.__mt_window;
}
set {
this.__mt_window = value;
this.SetNativeField ("window", value);
}
}
[MonoTouch.Foundation.Connect("SayHelloButton")]
private MonoTouch.UIKit.UIButton SayHelloButton {
get {
this.__mt_SayHelloButton = ((MonoTouch.UIKit.UIButton)
(this.GetNativeField ("SayHelloButton")));
return this.__mt_SayHelloButton;
}
set {
this.__mt_SayHelloButton = value;
this.SetNativeField ("SayHelloButton", value);
}
}
[MonoTouch.Foundation.Connect("HelloLabel")]
private MonoTouch.UIKit.UILabel HelloLabel {
get {
this.__mt_HelloLabel = ((MonoTouch.UIKit.UILabel)
(this.GetNativeField ("HelloLabel")));
return this.__mt_HelloLabel;
}
set {
this.__mt_HelloLabel = value;
this.SetNativeField ("HelloLabel", value);
}
}
}
}
打开Main.cs文件,会看到局部类AppDelegate的另一部分代码。这里可以添加响应按钮的TouchUpInside事件的代码,并改变标签的文本,详细代码请看代码清单1-2。
代码清单1-2 在AppDelegate中处理UIButton的TouchUpInside事件
...
public partial class AppDelegate : UIApplicationDelegate
{
public override bool FinishedLaunching (
UIApplication app, NSDictionary options)
{
// If you have defined a view, add it here:
// window.AddSubview (navigationController.View);
SayHelloButton.TouchUpInside += (o,e) =>
{ HelloLabel.Text = "Hello MonoTouch"; };
window.MakeKeyAndVisible ();
return true;
}
...
}
保存后,运行应用程序。当应用程序在模拟器中运行后,单击按钮,并注意标签上文本的变化。可以看到,标签尺寸太小,容纳不了全部文本,因而在文本的末尾使用了省略号代替(其实,这是故意的,目的是为了讲述将要在IB中做的事)。现在,返回IB,修正这个问题。
注意 在IB和MonoDevelop之间来回切换是很常见的事,因而尽早熟悉有好处。
返回IB,在窗口中选择UILabel并通过拉伸增加它的宽度。如图1-15所示,IB会显示Guide Geometry来协助调整大小和布局,以符合苹果人机界面指南(Human Interface Guideline,HIG)。
然后,设置标签文本居中显示。选择标签,打开Attributes Inspector(Tools→ Attribures Inspector),在Attribures Inspector布局区域,设置文本的排列(alignment)为居中(centered)。保存修改并返回MonoDevelop运行应用程序。单击按钮,这次就可在标签内看到全部文本了。
如果回头再看MonoDevelop,也许希望它能生成一些代码反映刚才对标签所做的改动。然而,IB不会生成代码,它会将它内部的改动直接序列化到xib文件中。在整个过程中,只有钩上(hook)outlet的属性才会生成代码,而且是在MonoDevelop观察到xib文件发生改动时创建的。代码清单1-3列出了xib文件中反映标签变化的代码,节点表示增大后标签的尺寸。
代码清单1-3 MainWindow.xib文件中的UILabel设置


1316
{{25, 80}, {275, 21}}

NO
YES
NO
Label

1
MCAwIDAAA


1
10
1

返回MonoDevelop并运行应用程序,单击按钮,这次会看到“Hello MonoTouch”已经全部显示出来了。值得庆贺,终于完成了这个简单的Hello World示例。现在已经可以在模拟器中看到应用程序的运行情况了,下一步要做的是将它移植到设备上进行开发。
1.3 在设备上进行开发
为了在设备上安装和调试应用程序,必须将它配置为开发设备,下面通过一个过程来讲述如何将设备配置为开发设备。
注册前的准备
在开发过程中将应用程序部署到设备上,需要注册一个iOS开发者的付费账号,之后,需要获得一个开发证书并创建一个开发配置文件(development provisioning profile)。配置主要有两个部分,一是注册设备让它可以运行开发环境下生成的应用程序;二是在Mac上创建一个开发证书对应用程序进行签名。
注意 要完成这几个相关步骤,就像跳舞一样,要跳来跳去。一旦在初期配置好它,就会发现其处理过程与为ad-hoc或App Store发布应用程序相类似。
登录iOS开发者中心,打开如图1-16所示的iOS Provisioning Portal(以下简称Portal),它是一个用于创建证书、注册开发设备并创建开发配置文件的网络工具。
图1-16 iOS配置中心
首先,单击左侧导航面板的Term链接,这里可以管理团队成员。如果注册的是原开发商,可以看到注册者的姓名以及在团队代理(Team Agent)的角色。如果团队有多名成员,可以在这里添加成员及分配其角色为成员或管理员。团队管理员(Team Admin)与团队代理人的权限一样,可以做与开发相关的任何事情,如添加新成员、批准证书请求,以及创建开发配置文件等。然而,团队管理员不能在ad-hoc或App Store分发证书和配置文件。团队成员只能向管理员或代理人申请开发证书。现在,假设只有一个开发人员且默认情况下是团队代理人,这样做的原因是添加团队成员只是这些步骤的一个子集。
此时就没有签发开发证书的问题了。开发证书是为应用程序签名用的。要获得证书,需要申请。要申请证书,就要创建一个证书签名请求(Certificate Signing Request,CSR)。在OS X中选择Applications→Utilities,出现Keychain Access工具,通过它可以创建CSR。运行Keychain Access工具,选择KeychainAccess→Preferences,单击Certificates标签页,确保从上往下数的前两个下拉列表的设置为Off(关闭)(如图1-17所示)。
图1-17 Keychain Access工具的偏好设置对话框的证书标签
现在,选择KeychainAccess→Certificate Assistant→Request a Certificate From a Certificate Authority,运行Certificate Assistance(证书助理)创建一个CSR。在Certificate Assistance(证书助理)对话框中,输入在iOS开发者中心注册账号时使用的邮件地址并在Common Name文本框中输入注册者的姓名。因为要将CSR文件上传到iOS Developer Program Portal,所以不需要输入CA电子邮件地址。选择Save to disk选项以便将CSR保存为上传到Portal的文件。此外,还要选择“Let me specify key pair information.”复选框。单击Continue按钮并选择一个文件夹来保存CSR文件。最后,确保密钥的大小是2048位,算法采用RSA,单击Continue按钮保存CSR文件到指定位置。有了这个CSR,就可以申请开发证书了。现在,返回Portal去做这事。
在Portal中,单击左边导航面板的Certificates,选择Development标签页并单击右上角的Add Certificate按钮。往下滚动到所有指示信息的下面,会看到一个Choose File按钮,单击它并选择刚才由KeychainAccess生成的CSR文件,然后单击Submit按钮上传它。接着单击证书申请旁边的Approve按钮批准该申请,单击Download按钮下载开发证书。下载完毕后,双击证书文件并在弹出的对话框中单击OK按钮将文件安装到keychain。现在,开发证书已经安装了,可以添加开发设备了。
要对开发设备授权,首先要在Program Portal中添加UDID。为了找到UDID,连接设备并运行Xcode。
在Xcode的主菜单中选择Window→Organizer,运行Xcode Organizer。在Devices下选择准备授权的设备,然后选择Summary标签页,显示在Identifier标签里的文本就是设备的UDID(如图1-18所示)。
图1-18 Xcode组织显示的UDID
有了UDID,返回到iOS Provisioning Portal,在Devices区域单击Add Device,然后输入为设备准备的名称和设备的UDID。
记住,这样做的最终目标是在开发设备上进行应用程序开发(这是所有相关步骤中最值得一提的)。现在,已创建了为应用程序签名的证书,设备也已注册为开发设备,离实现目标只差创建开发配置文件了,不过在这之前还需要做一件事—创建一个应用程序id。
应用程序id(app id)由Portal产生的bundle seed id和你(或团队管理员)选择的bundle id组成,其格式为BundleSeedID.BundleID。在开发阶段,使用通配符(*)作为bundle id比较方便,这样就不需要为每一个应用程序的开发生成一个新的应用程序id了。
注意 在发布的时候,就需要为每个应用程序创建一个单独的应用程序id。
要在Portal中创建应用程序id,可以在App Ids区域单击Add App Id,然后在App ID Name内输入应用程序id的名称(只是在Portal内使用),然后在Bundle Identifier中输入星号(*)。
注意 如果应用程序要求Keychain Access,就不能使用星号,就必须为它生成一个唯一的Bundle id。根据习惯,Bundle id通常的形式为一个将域名反转后加上应用程序名称的字符串,例如com.mydomain.myapp。
现在准备创建开发配置文件,它可将应用程序部署到设备上,它由开发证书、注册设备和应用程序id组成。返回到Portal,在Provisioning区域选择Development标签页,然后单击Add Profile。填写在Portal中使用的配置文件名称,选择之前创建的证书、应用程序id和设备,然后单击Submit按钮创建配置文件。文件创建完成后,单击该文件旁边的Download按钮下载这个文件,将应用程序部署到开发设备上以备以后使用。文件下载完后,将它拖到Dock(已连接到MAC)的Xcode图标上,这样就可将它安装到设备上。如图11-9所示,打开Xcode Organize,展开Development节点,选择Provisioning Profile检查一下配置文件是否已经安装。留意App Identifier,很快就要使用它。现在,有了App Identifier,准备好将应用程序部署到开发设备了。
图1-19 Xcode Organize中显示的开发配置文件
由于设备仍然连接着,所以切换回MonoDevelop。下面将部署一个发布版本到设备并运行它,之后将演示如何在设备上进行调试。在解决方案树中选择LMT1-2工程,在主菜单选择Project→LMT-1 Options。展开Build节点。在iPhone Build中,设置configuration为Release,platform为iPhone,其他使用默认配置。在iPhone Bundle Signing中,将configuration和platform分别设置为Release和iPhone,设置identity为Developer(Automatic)。在iPhone Application中,设置Application Name为LMT1-2,设置identifier为之前在Xcode中看到的App Identifier。
注意 如果使用通配符(*)作为bundle id,应该输入应用程序id中不含通配符的部分,例如,应用程序id为AA11BB22CC.*,在MonoDevelop的Bundle Identifier文本框中必须输入AA11BB22CC。
单击OK按钮关闭Project Options对话框。在工具栏中,选择当前配置为Release