iPhone 高级编程


移动与嵌入式开发技术 iPhone 高级编程 —— 使用 MonoTouch 和.NET/C# (美) Wallace B. McClure Martin Bowling Craig Dunn 等著 田尊华 译 II 北 京 Wallace B. McClure, Martin Bowling, Craig Dunn, et al. Professional iPhone Programming with MonoTouch and .NET/C# EISBN:978-0-470-63782-1 Copyright © 2010 by Wiley Publishing, Inc. All Rights Reserved. This translation published under license. 本书中文简体字版由 Wiley Publishing, Inc. 授权清华大学出版社出版。未经出版者书面许可,不得以任何方式 复制或抄袭本书内容。 北京市版权局著作权合同登记号 图字:01-2010-7128 本书封面贴有 Wiley 公司防伪标签,无标签者不得销售。 版权所有,侵权必究。侵权举报电话:010-62782989 13701121933 图书在版编目(CIP)数据 iPhone 高级编程—— 使用 MonoTouch 和.NET/C#/ (美) 麦克卢尔(McClure, W. B.),(美) 鲍林(Bowling, M.), (美) 邓恩(Dunn, C.) 著;田尊华 译. —北京:清华大学出版社,2011.6 书名原文:Professional iPhone Programming with MonoTouch and .NET/C# (移动与嵌入式开发技术) ISBN 978-7-302-25549-9 Ⅰ. i… Ⅱ. ①麦… ②鲍… ③邓… ④田… Ⅲ. 移动电话机-应用程序—程序设计 Ⅳ. TN929.53 中国版本图书馆 CIP 数据核字(2011)第 082552 号 责任编辑:王 军 张立浩 装帧设计:孔祥丰 责任校对:胡雁翎 责任印制: 出版发行:清华大学出版社 地 址:北京清华大学学研大厦 A 座 http://www.tup.com.cn 邮 编:100084 社 总 机:010-62770175 邮 购:010-62786544 投稿与读者服务:010-62776969, c-service@tup.tsinghua.edu.cn 质 量 反 馈:010-62772015, zhiliang@tup.tsinghua.edu.cn 印 刷 者: 装 订 者: 经 销:全国新华书店 开 本:185×260 印 张:23 字 数:574 千字 版 次:2011 年 6 月第 1 版 印 次:2011 年 6 月第 1 次印刷 印 数:1~3000 定 价:58.00 元 —————————————————————————————————————————————— 产品编号: 目 录 第 1 章 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 ............... 1 1.1 产品对比 ...................................... 2 1.1.1 .NET Framework ...................... 2 1.1.2 Mono ......................................... 2 1.1.3 MonoTouch ............................... 3 1.1.4 MonoDevelop ........................... 5 1.1.5 iPhone ....................................... 5 1.2 移动开发 ...................................... 7 1.3 苹果公司的 iPhone SDK 工具 .... 8 1.3.1 工具 .......................................... 8 1.3.2 许可 .......................................... 9 1.4 本章小结 ...................................... 9 第 2 章 MonoTouch 介绍 .................... 11 2.1 开发前的准备 ............................ 11 2.2 MonoTouch 的组件 ................... 12 2.2.1 Mono 概述 .............................. 12 2.2.2 MonoTouch 的名称空间 和类 ........................................ 13 2.3 使用 MonoDevelop .................... 15 2.4 使用 Interface Builder ................ 18 2.4.1 使用库中的控件 .................... 20 2.4.2 设置插座变量 ........................ 21 2.4.3 设置动作 ................................ 23 2.5 基于 Interface Builder 实现的 Hello World ................................ 24 2.6 基于代码实现的 Hello World ... 27 2.7 调试 ............................................ 28 2.7.1 在模拟器上调试 .................... 28 2.7.2 在设备上调试 ........................ 29 2.8 理解链接器 ................................ 30 2.9 部署应用程序 ............................ 31 2.10 本章小结 .................................. 32 第 3 章 设计应用程序用户界面: 探讨屏幕控件 ......................... 33 3.1 创建 iPhone(y)用户界面和 应用程序交互模式 ..................... 34 3.1.1 命令界面 ................................ 34 3.1.2 单选界面 ................................ 35 3.1.3 导航界面 ................................ 35 3.1.4 模态界面 ................................ 36 3.1.5 组合界面 ................................ 37 3.2 UILabel ....................................... 37 3.3 UIButton ..................................... 38 3.4 UITextField ................................ 40 3.5 UISwitch ..................................... 41 3.6 UISlider ...................................... 41 3.7 UIActivityIndicatorView ............ 42 3.8 UISegmentedControl .................. 43 3.9 UIPageControl ............................ 44 3.10 本章小结 .................................. 45 第 4 章 数据控件 ................................ 47 4.1 窗口与视图 ................................ 48 4.1.1 UIWindow ............................... 48 4.1.2 UIView .................................... 49 4.2 数据视图控件 ............................ 50 4.2.1 UIWebView ............................. 50 4.2.2 UIScrollView .......................... 57 4.2.3 UITextView ............................. 59 4.2.4 UIPickerView .......................... 63 4.2.5 UIDatePicker .......................... 68 4.3 控制器与栏 ................................ 70 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# XVIII 4.3.1 UIViewController ................... 70 4.3.2 UIToolBar ............................... 71 4.3.3 UITabBarController ................ 74 4.3.4 UINavigationController .......... 81 4.4 本章小结 .................................... 84 第 5 章 在 iPhone 上使用数据 ............ 85 5.1 使用 SQLite ............................... 85 5.1.1 使用 Mono.Data.Sqlite ........... 86 5.1.2 建立数据库 ............................ 86 5.1.3 建立表 .................................... 87 5.1.4 使用 SQL 语句 ....................... 88 5.1.5 升级策略 ................................ 91 5.2 处理远程数据 ............................ 92 5.2.1 使用 SOAP ............................. 92 5.2.2 使用基于 REST 的 Web 服务 ........................................ 97 5.2.3 检索数据 ................................ 99 5.2.4 使用 POST 提交数据 ...........103 5.2.5 可靠地使用 Web 服务 .........105 5.3 本章小结 .................................. 106 第 6 章 使用表显示数据 .................... 107 6.1 在表中显示数据 ...................... 108 6.1.1 选择单元格 .......................... 111 6.1.2 改变单元格布局 .................. 112 6.1.3 展示分组数据 ...................... 114 6.1.4 添加索引 .............................. 117 6.1.5 分组表的样式 ...................... 118 6.1.6 定制单元格布局 .................. 119 6.2 使用表导航 .............................. 122 6.2.1 使用 UINavigation- Controller ..............................123 6.2.2 实现第二层导航 ..................125 6.2.3 创建静态行内容 ..................127 6.3 编辑表行 .................................. 130 6.3.1 添加划过删除 ......................130 6.3.2 启用编辑“模式” ..............131 6.3.3 重新排序单元格 ..................132 6.3.4 创建插入图标 ......................133 6.3.5 添加新行 ............................. 135 6.4 在表中添加搜索栏 .................. 137 6.4.1 启用搜索栏 ......................... 138 6.4.2 定制搜索外观 ..................... 140 6.5 本章小结 .................................. 141 第 7 章 地图功能 .............................. 143 7.1 地图基础知识 .......................... 144 7.1.1 MapKit 功能简介 ................ 144 7.1.2 CoreLocation 功能简介 ....... 144 7.2 使用 CoreLocation ................... 146 7.2.1 确定设备位置 ..................... 147 7.2.2 跟踪设备移动 ..................... 153 7.3 使用 MapKit ............................. 158 7.3.1 显示地图 ............................. 159 7.3.2 标注地图 ............................. 161 7.3.3 使用地理编码功能 .............. 171 7.4 本章小结 .................................. 175 第 8 章 应用程序设置 ....................... 177 8.1 探讨 Info.plist .......................... 177 8.1.1 UIStatusBarHidden .............. 178 8.1.2 UIInterfaceOrientation ......... 179 8.1.3 UIRequiresPersistentWiFi .... 179 8.1.4 UIPrerenderedIcon ............... 179 8.2 了解设置包 .............................. 179 8.2.1 Settings 应用程序 ................ 179 8.2.2 将应用程序添加到 Settings 应用程序中 ......................... 180 8.2.3 读取设置 ............................. 191 8.2.4 更新设置 ............................. 192 8.3 本章小结 .................................. 193 第 9 章 面向设备的硬件编程 ............ 195 9.1 响应加速度 .............................. 196 9.1.1 加速度计 ............................. 196 9.1.2 使用 XYZ 坐标系统 ........... 196 9.1.3 针对加速度计编程 .............. 197 9.1.4 使用加速度作为 UI 输入 ... 198 9.2 确定设备方向 .......................... 200 目 录 XIX 9.2.1 启用通知 ..............................200 9.2.2 确定静态设备方向 ..............201 9.2.3 基于事件确定方向 ..............201 9.3 读取接近传感器 ...................... 202 9.4 联网 .......................................... 203 9.5 考虑电池电量 .......................... 204 9.5.1 确定静态电池状态 ..............204 9.5.2 使用电池改变事件 ..............205 9.6 访问系统信息 .......................... 206 9.7 移动开发 .................................. 207 9.8 本章小结 .................................. 207 第 10 章 多媒体编程 ......................... 209 10.1 图像 ........................................ 209 10.1.1 显示图像 ..........................209 10.1.2 选取图像 ..........................212 10.1.3 处理选取的图像 ..............214 10.1.4 由摄像头创建图像 ..........215 10.1.5 编辑图像 ..........................216 10.1.6 定制摄像头 ......................217 10.1.7 将图像保存到相册 ..........219 10.2 视频 ........................................ 220 10.2.1 播放视频 ..........................220 10.2.2 定制视频播放器 ..............222 10.2.3 选取视频 ..........................225 10.2.4 记录视频 ..........................226 10.2.5 编辑视频 ..........................228 10.2.6 将视频保存到相册 ..........230 10.3 音频 ........................................ 231 10.3.1 播放音频 ..........................231 10.3.2 记录音频 ..........................233 10.4 动画 ........................................ 235 10.4.1 创建基本动画 ..................235 10.4.2 使用 UIView 动画 ...........237 10.5 本章小结 ................................ 239 第 11 章 与其他应用程序通信 ........... 241 11.1 集成苹果公司应用程序 ........ 241 11.1.1 打开 Safari 浏览器 ...........241 11.1.2 打开电子邮件 ..................242 11.1.3 拨打电话 ......................... 242 11.1.4 发送文本/SMS 消息 ....... 243 11.1.5 在 Maps 应用程序中打开 位置 ................................. 243 11.1.6 打开 YouTube 视频 ......... 243 11.1.7 打开 iTunes 商店和应用 程序商店 ......................... 244 11.2 集成第三方应用程序 ............ 244 11.2.1 简单集成 Google Earth ... 244 11.2.2 与 Skype 深度集成 ......... 245 11.3 接受来自其他应用程序的 调用 ........................................ 245 11.3.1 配置 Info.plist 文件 ......... 245 11.3.2 实现 OpenURL 架构 ....... 248 11.4 集成地址簿 ............................ 249 11.4.1 ABPersonViewController ... 250 11.4.2 ABPersonPickerNavigation- Controller ......................... 251 11.4.3 ABNewPersonView- Controller ......................... 252 11.4.4 ABUnknownPersonView- Controller ......................... 253 11.4.5 处理属性选择 ................. 255 11.5 集成 iPod 音乐集 ................... 256 11.6 集成 Objective-C .................... 261 11.6.1 MonoTouch.Foundation ... 261 11.6.2 MonoTouch.Obj- CRuntime ......................... 261 11.6.3 使用 btouch 自动绑定 到 Objective-C ................. 261 11.7 本章小结 ................................ 265 第 12 章 面向国际用户进行本地化 ... 267 12.1 国际化应用程序 .................... 268 12.2 改变语言和地区设置 ............ 269 12.3 显示多种语言 ........................ 270 12.3.1 显示翻译文本 ................. 272 12.3.2 显示图像 ......................... 277 12.3.3 本地化应用程序图标和 名称 ................................. 278 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# XX 12.3.4 显示“双字节”字符 ......279 12.3.5 格式化日期、时间、数值 和货币 ..............................279 12.4 管理实际应用程序中的 Localizable.strings ................. 281 12.4.1 genstrings .........................281 12.4.2 ngenstrings .......................281 12.5 本章小结 ................................ 284 第 13 章 面向 iPad 编程 ................... 285 13.1 iPad 设备 ................................ 285 13.2 iPad 应用程序的组成 ............ 287 13.2.1 设备方向支持 ..................287 13.2.2 启动图像 ..........................290 13.3 iPad 的新功能 ........................ 291 13.3.1 使用 UISplitView- Controller .......................292 13.3.2 创建自定义 UIPopover....295 13.3.3 显示模态视图 ..................298 13.3.4 手势识别 ..........................299 13.4 构建通用应用程序 ................ 304 13.5 本章小结 ................................ 309 第 14 章 必要的 Objective-C 知识 .... 311 14.1 如何使用本章内容 ................ 312 14.2 简单了解 Objective-C 和 Cocoa ..................................... 313 14.3 学术方式与实用方式 ............ 315 14.4 基本语法和概念 .................... 316 14.4.1 初始化 ..............................317 14.4.2 消息与方法 ......................319 14.4.3 内存管理 ..........................321 14.5 备忘录 .................................... 322 14.5.1 术语 ..................................322 14.5.2 编译器指令 ......................324 14.5.3 数据类型 ..........................326 14.6 本章小结 ................................ 327 第 15 章 应用程序商店:提交和销售 应用程序 ............................ 329 15.1 使用多样性生成版进行预提 交测试 .................................... 329 15.1.1 从测试人员获得 UDID .. 330 15.1.2 创建多样性安装配置 文件 ................................. 332 15.1.3 生成应用程序的多样性 测试版 ............................. 333 15.1.4 将多样性生成版打包 ..... 334 15.2 准备提交 ................................ 337 15.2.1 建立应用程序的发布版 ... 337 15.2.2 为发布版添加新配置 ..... 337 15.2.3 针对配置改变签名选项 ... 338 15.2.4 浏览包设置 ..................... 338 15.2.5 生成项目 ......................... 338 15.2.6 预提交核查清单 ............. 338 15.2.7 通过 iTunes 连接提交..... 339 15.3 推销应用程序 ........................ 341 15.3.1 支持应用程序推销 ......... 341 15.3.2 关键的应用程序推销 技术 ................................. 342 15.4 本章小结 ................................ 345 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 本章主要内容 ● iPhone 的历史及其市场影响力 ● Mono 的短暂历史及其与.NET Framework 的关系 ● MonoTouch 为.NET 开发人员开启 iPhone 大门的方式 ● MonoTouch 对开发人员如此具有吸引力的原因 在最近几年中,我们已经见证了智能手机使用量的惊人增长, USA Today 日报最近的报 告指出,智能手机已经成为人们日常生活中不可或缺的组成部分。 运行 32 位 x86 或 64 位 x64 处理器的、基于 Windows 的计算机主宰着桌面计算机市场, 同时.NET Framework 是面向 Windows 平台的主流开发环境,但是没有哪个单一的厂家或平 台能够完全主宰移动设备市场;移动设备使用了各种平台,包括 Symbian、Research in Motion(BlackBerry,加拿大的一家通信公司 )、Windows Mobile、Android 和其他各种平台。 此外,移动设备可以运行相同的操作系统,而向用户呈现不同规格的界面。对于开发人员而 言,这种市场分割是存在问题的—— 他们如何利用已经掌握的开发框架或工具,并将这些知 识用在一种具有大份额市场占有率且处于不断增长中的移动设备上? 本章将要介绍的是,对于具有最大市场影响力且相比其他任何设备的市场份额而言,增 长速度也最快的智能手机,最大群体的开发人员该如何针对这种智能手机进行开发。 1 第 章 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 2 1.1 产品对比 本节将快速浏览一下 .NET Framework、Mono 和 MonoTouch 这 3 种产品,它们让最大群 体的开发人员能够面向 iPhone 进行开发,iPhone 是当前市场上最令人激动的移动平台。 1.1.1 .NET Framework 在 20 世纪 90 年代后期,微软开始致力于 .NET Framework 的开发工作。该框架的第一个 版本于 2002 年正式面世。此后,微软进一步推出了 .NET Framework 的后续版本,最近推出 的是.NET Framework 4,它具有各种版本,包括 32 位版本、 64 位版本、面向 XBOX 游戏平 台的版本和称为 Compact Framework(CF)的面向微软移动设备的版本。下面是关于 .NET Framework 的几个事实。 ● 微软发布了一个带有该框架的开发工具 Visual Studio .NET,这个工具是面向 .NET 的 集成开发环境(Integrated Development Environment,IDE)。 ● .NET Framework 基于一个虚拟机,该虚拟机能够执行针对该框架而编写的软件。这 个虚拟机环境称为公共语言运行时 (Common Language Runtime,CLR),它负责安全、 内存管理、程序执行和异常处理。 ● 在.NET Framework 中编写的应用程序最初是将 Visual Basic 或 C#这样的源代码编译 成一种称为 MSIL 的中间语言。这种初次编译是通过调用语言相关的命令行编译器、 Visual Studio 或某种其他的编译工具完成的。二次编译集通常是在应用程序执行时完 成的。 这种二次编译以中间语言作为输入, 并将其编译为可以在操作系统上运行的可 执行代码。这种二次编译称为即时编译(Just-in-Time Compilation,JTC)。 ● .NET Framework 是语言无关的,该框架可以使用多种语言进行编程。在 Visual Studio 中,微软已经带有各种语言,包括 Visual Basic、F#、C++和 C#。 ● .NET Framework 具有一系列的库,能够提供跨各种语言的一致性编程功能,这些库 称为基类库(Base Class Library,BCL)。 ● 微软已经将.NET Framework 的各个部分提交到了各种标准化组织, 其中包括 C#语言、 公共语言基础设施(Common Language Infrastructure,CLI)、公共类型系统(Common Type System,CTS)、公共语言规范(Common Language Specification,CLS)和虚拟执 行系统(Virtual Execution System,VES)。 ● 在所有的开发框架中, .NET Framework 拥有的开发人员最多。其结果是,相比于其 他的任何开发框架而言,熟悉.NET Framework 的开发人员也更多。 ● .NET Framework 的一个不足之处是,它不存在非微软平台的版本。 1.1.2 Mono Mono是一个开源项目, 它为非 Windows 的操作系统提供了 C#编译器和公共语言运行时。 Mono 当前使用的是 GPL2、LGPL2、MIT 许可和双许可 (dual license)。Mono 可以在 Mac、 第 1 章 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 3 Linux、BSD 和其他操作系统上运行。 Mono 在 2001 年正式宣布启动,由 Miguel de Icaza 发起该项目。Mono 1.0 版本在 2004 年正式面世,而当前最新的版本是 Mono 2.6。Mono 的开发一直由 Miguel de Icaza 领导,并 受 Novell 的总体领导和支持。 尽管 Mono 总是期望能够匹配 .NET Framework 的功能,但是由于这样一个事实而无法实 现,即微软具有更多的资源,并且在 .NET Framework 功能的开发方面具有领先优势。当然, Mono 项目具有大量与.NET Framework 不相上下的功能。 Mono 带有一个开源的 IDE,称为 MonoDevelop,它是作为 SharpDevelop IDE 的移植版 本而启动的。刚开始时, MonoDevelop 是为在 Linux 上进行 Mono 开发而启动的一个项目; 但是, 随着 MonoDevelop 2.2 的正式发布, Mono 的开发能力得到了扩展, 能够在 Mac、Windows 和其他一些非 Linux 的 UNIX 平台上进行开发。 尽管.NET Framework 非常流行,但是存在以下两个问题,使得它不适合在 iPhone 上 运行: ● 从某种程度上讲,苹果公司和微软公司是竞争对手,不太可能愉悦地合作。 ● 从根本上讲,.NET Framework 是在运行时动态编译的,这就是 .NET Framework 的即 时编译。这种即时编译不符合苹果公司的许可和 iOS 的运行原理。 如果在运行时使用即时编译方式将在微软 .NET Framework 上运行的代码编译成机器 码,那么我们会希望为 Mono 编写的应用程序能够具有相同的行为。然而,这样一来就不适 合在 iPhone 上运行。但是, Mono 有一种技术允许应用程序预先编译,这种技术称为 AOT 技术。 .NET/Mono 和 iPhone 之间的一个不利条件是, .NET/Mono 开发人员无法利用他们已有 的.NET/Mono/C#知识,并将这些知识应用于 iPhone 平台。可以通过图 1-1 来说明这一点,从 中可以看出,.NET/Mono 开发人员之所以无法针对 iPhone 进行开发,是因为 .NET/Mono 和 iPhone 是两个分离的实体。 图 1-1 1.1.3 MonoTouch 在 2009 年,Novell 宣布开始发售 MonoTouch,MonoTouch 允许.NET 开发人员使用 C# 语言创建原生的 iPhone 应用程序。有了 MonoTouch,应用程序就可以编译成在 iPhone 上运 行的可执行代码。该产品的重要意义应该不难理解: .NET/Mono 开发人员可以通过 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 4 MonoTouch 直接面向 iPhone 进行编程,这可以通过图 1-2 加以说明。 图 1-2 那么, MonoTouch 是如何实现这一点的呢?难道是通过某种方式允许 Windows Forms 应 用程序在 iPhone 上进行转换或重新编译并部署?在 iOS 提供的原生 iPhone 编程层之上, MonoTouch 提供了一个.NET 层,称为 Cocoa Touch。Cocoa Touch 建立在 Mac OS X 中的 Cocoa 层的基础之上,并且可用于 iPhone、iPod Touch 和 iPad。MonoTouch 并没有提供交叉编译 Windows Forms 应用程序的机制,但是允许开发人员构建能够在 iPhone 上运行的应用程序。 从总体上讲,MonoTouch SDK 提供的应用编程接口 (Application Programming Interface, API)是.NET 2.0 Framework 的核心功能、Silverlight 2.0 API 和 iPhone 上的 API 这三者的组合。 MonoTouch 在基于 Objective-C 的 iPhone 原生 API 和基于 C 的 API 之间架起了一座桥梁 (一 种互操作方式),从而使得基于 Objective-C 的 API 能够进入 C#开发人员所熟悉的 .NET 领域。 1. MonoTouch 的组成 MonoTouch 由下面 4 个部分组成: ● Monotouch.dll 是一个 C#程序集,提供一种将 API 绑定到 iPhone 原生 API 的方式。 ● 一个命令行工具, 用于对 C#代码和公共中间语言 (Common Intermediate Language,CIL) 代码进行编译。这种编译后的代码就可以在模拟器或实际的 iPhone 上运行。 ● 一个 MonoDevelop 插件,使得 iPhone 开发和 Interface Builder 能创建图形应用程序。 ● 一个 Mono 运行时的商业许可,它使得开发的代码可以静态链接 Mono 运行时环境。 2. 名称空间和类 MonoTouch 提供了一组丰富的名称空间和类来支持 iPhone 应用程序的构建。 其中一些最 常用的名称空间和类如下: ● MonoTouch.ObjCRuntime 这个名称空间提供了 .NET/C#领域与 iPhone 的 Objective-C 领域之间的互操作方式/桥梁。 ● MonoTouch.Foundation 这个名称空间提供了与 iPhone 的 Objective-C 领域进行通 信所需的数据类型支持。大多数类型是直接进行映射的。例如,Objective-C 的基类 NSObject 映射为 C#中的 MonoTouch.Foundation.NSObject 类。有些类并不是直接映 第 1 章 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 5 射,而是映射成对应的原生.NET 类型。例如,NSString 映射成基本的字符串类型, NSArray 则映射成强类型数组。 ● MonoTouch.UIKit 这个名称空间提供了 Cocoa Touch 内的 UI 组件之间的直接映射, 这种映射是通过为每个 UI 组件提供相应的.NET 类来实现的。这个名称空间可能是 开发人员最频繁使用的名称空间。对于.NET 开发人员来讲,Cocoa Touch 是用于构 建能够在 iPhone 上运行的程序的一个抽象层或 API。Cocoa Touch 建立在 Cocoa API 的基础之上,Cocoa API 用于构建能够在 Mac OS X 操作系统上运行的程序。Cocoa Touch 可以看作是为了适应基于触摸方式的 iOS 而进行调整的 Cocoa。 ● OpenTK 这个名称空间是 OpenTK API 的修改版本。OpenTK 是针对 OpenGL 的面 向对象绑定,OpenGL 代表的是开放图形库(Open Graphics Library)。OpenGL 是进行 三维图形开发的 API,而 OpenTK 则是执行 OpenGL、OpenAL 和 OpenCL 的一个库。 OpenTK 是用 C#编写的,能够运行于 Windows、Mac OS X 和 Linux 系统上。OpenTK 在 iPhone 上的实现已经得到了更新,从而可以使用 CoreGraphics,并且仅公开 iPhone 上可用的功能。 此外,MonoTouch 还提供了一组其他的名称空间,对于您而言,这些名称空间可能非常 重要,它们包括: ● MonoTouch.AddressBook ● MonoTouch.CoreGraphics ● MonoTouch.AddressBookUI ● MonoTouch.AudioToolbox ● MonoTouch.MapKit ● MonoTouch.AVFoundation ● MonoTouch.MediaPlayer ● MonoTouch.CoreAnimation ● MonoTouch.SystemConfiguration 这些名称空间的功能从它们的名称上就能够一目了然,它们都是专门用于 iPhone 的名称 空间。 1.1.4 MonoDevelop MonoDevelop 是一个用于使用 Mono 进行开发的免费 IDE,它是 SharpDevelop IDE 的一 个早期分支。起初,MonoDevelop 只能在 Linux 上运行,但是从版本 2.2 开始,MonoDevelop 能够在 Mac 上运行。Mac 上的 MonoDevelop 可以创建和管理 iPhone 项目,并可以对 iPhone 项目进行调试,以及将 iPhone 项目部署到模拟器和设备上进行测试。 1.1.5 iPhone 毫无疑问,自从 2001 年 iPod 开始进入市场以来,苹果公司已经改变了移动设备市场。 尽管 iPod 不是播放 MP3 文件的首款设备,但它却是播放 MP3 文件的首款产品。iPod 使得播 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 6 放 MP3 文件更容易,并提供了一个购买音频文件的便捷场所。事实上, iPod 引发了 MP3 设 备市场的爆炸性发展。 2007 年 1 月,苹果公司在正式发布第一代 iPhone 时就彻底颠覆了智能手机市场。 iPhone 被设计成智能手机,它能够提供 Web 浏览、电子邮件和多媒体功能。第一代 iPhone 连接无 线网络,应用程序通过移动版的 Safari 发送给用户。 为 iPhone 编写基于 Web 的应用程序非常简单。Safari Web 浏览器是一款很优秀的工具—— 它能够完美地对基于 Web 的应用程序进行缩放, 以便在 iPhone 大小的屏幕上运行。 Safari Web 浏览器还能够非常好地运行高度依赖于 JavaScript 的应用程序。升级基于 Web 的 iPhone 应用 程序也易如反掌,只需要将新版本的应用程序部署到 Web 服务器上即可。很多应用程序都采 用这种方式进行升级。 既然如此,我们应该如何编写适合于 iPhone 的应用程序呢? 第一代 iPhone 并不支持用户在设备上加载应用程序。对于少数用户来讲,这是不可接受 的行为,因此他们开始设法破解 iPhone,破解是用户在他们的设备上运行苹果公司没有授权 的软件的过程。 这种破解方式存在几个问题: ● 技术问题 破解需要 iPhone 的拥有者完成一些操作,很多 iPhone 用户在技术上还达 不到完成这项任务的水平。 ● 合法性 在编写本书时,破解的合法性还不明确。我们还不清楚破解是否符合数字千 年版权法案(Digital Millennium Copyright Act,DMCA)。电子前沿基金会 (Electronic Frontier Foundation)请求美国版权局将 iPhone 的拥有者破解他们的设备作为 DMCA 的一个特例进行处理。作为回应,苹果公司坚持认为破解 iPhone 是侵犯版权的行为。 ● 未知因素 破解 iPhone 还存在一系列的未知因素。破解后的 iPhone 如何才能够很好 地升级到新版本的 iOS?破解 iPhone 是否会导致安全问题? 2008 年,苹果公司推出了第二代 iPhone,并将其称为 iPhone 3G。随着这一代 iPhone 以 及新版本 iOS 的发布,苹果公司对 iPhone 进行了大量的增强,包括能够在设备上运行原生应 用程序的能力。除此之外,苹果公司还建立了一个生态系统 (ecosystem),用户可以通过它找 到应用程序,并将其安装到自己的 iPhone 设备上。这个生态系统称为应用程序商店 (App Store)。 相对于基于 Web 的应用程序而言,这些原生应用程序是一个极大的进步,因为基于 Web 的应用程序在设备上能够完成的工作是受到限制的。从根本上讲,它们必须通过 Web 加载, 并且不能访问所有的设备功能。原生应用程序对设备功能通常具有更好的支持,包括加速度 但是, Web 应用程序方式并不适合于所有的应用程序— — 对于要求某种后台 处理、访问本地资源、必须在未连接网络时运行的应用程序, 以及某些其他类 型的应用程序,它们在这种模型下并不能很好地工作。 第 1 章 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 7 计、文件系统、照相机、跨域 Web 服务和其他在 HTML 和 JavaScript 中无法访问的功能。此 外,原生应用程序的加载并不依赖于无线网络,而 Web 应用程序的加载则依赖于无线网络。 2009 年,苹果公司推出了 iPhone 3GS 以及第 3 版的 iOS。iPhone 3GS 是 iPhone 3G 的改 良版,相比 iPhone 3G,iPhone 3GS 支持更高的数据传输率,具有改进的照像机、升级的 CPU 和语音控制。 2010 年,苹果公司宣布 iPad 正式上市销售。 iPad 是一款平板电脑,它具有比 iPhone 更 大的屏幕。更重要的是,iPad 带有的 iOS 根本不同于 iPhone。 随着每个新款 iPhone 的发布,苹果公司都会推出一款新的 iPod touch。iPod touch 可以看 作是没有电话和照相机、也没有对 3G 数据服务提供支持的 iPhone;然而, iPod touch 确实支 持通过 WiFi 进行无线上网。 从 3 年前上市以来,苹果公司已经售出的 iPhone 超过了 6000 万台。iPad 在上市的第一 年估计可以销售几百万台,这意味着 iPad 将成为 2010 年最流行的平板电脑。 但是, 对于开发人员来讲, 在这些设备上运行应用程序时有以下 3 个问题必须加以考虑: ● iOS 不允许软件代码以任何方式进行解释或动态编译。 ● 苹果公司针对 iPhone 的 SDK 许可和基于 iPhone 的开发许可不允许应用程序具有经过 解释的或动态编译的代码。 ● 苹果公司对 iPhone 应用程序具有大量的验证过程。某些针对应用程序的自动测试会 检查动态编译和解释的代码。 开发人员需要熟悉这些问题和许可,从某种意义上讲,这限制了开发人员编写在 iPhone 上运行的应用程序的选择。 1.2 移动开发 使用 MonoTouch 构建在 iPhone 上运行的应用程序时,开发人员必须知道几件事情: ● iPhone 有一个启动计时器 (startup timer)。如果应用程序启动时间超过 20 秒,那么 iOS 就会终止该应用程序。 ● 在应用程序运行过程中,如果任何一个应用程序在 20 秒钟内没有响应, iOS 就会关 闭该应用程序。为了避免被关闭,应用程序需要执行某种类型的异步操作。 ● 启动计时器会对耗费在处理 FinishedLaunching()事件上的时间进行计时。为此,在 FinishedLaunching()事件中不要进行任何长时间的同步处理。 ● iPhone 模拟器用于初步测试是很好的;但是,对于任何一项测试而言,这种面向模拟 器的测试并不一定准确。这是因为在模拟器中能够正常运行的程序并不意味着在 iPhone 上总是能够同样正常地运行。最终的测试应该在 iPhone 中完成。 ● 有了.NET 后,可执行程序会很小。每个应用程序都共享 .NET Framework,因此应用 程序并不需要自己完全拥有一份该框架的副本。 MonoTouch 并没有内置到 iPhone 中, 基于 MonoTouch 开发的应用程序必须拥有 MonoTouch 框架的一个副本; MonoTouch iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 8 编译到应用程序中。 其结果是, 相比于同等的 Objective-C 应用程序而言, MonoTouch 应用程序所占用的磁盘空间会更大。 尽管 MonoTouch 是一个已经获得许可的商业产品,但是它仍然处在不断的发展之中,并 且可能不支持某些特定的名称空间或程序集。针对这种情况,可以有两种选择: ● 等待来自 MonoTouch 的产品实现这个程序集。 ● 将必要的代码或程序集拖入项目。 如果应用程序需要使用 System.Web.*名称空间中的 代码,那么这种做法是相当普遍的。 除了为 iPhone 构建应用程序的技术性问题之外,开发人员还应该注意一些设计问题,包 括如下: ● 不能针对桌面环境设计应用程序,这是考虑到不能对桌面应用程序进行裁剪以适应 iPhone 或任何其他的移动设备。 iPhone 不具备桌面计算机的显示器、硬件或存储器。 iPhone 和移动设备应用程序实际上只能适合简单和有限目标的功能,而不应该让它 们做那些应该由桌面应用程序完成的任务。 ● iPhone 模拟器是一款非常优秀的工具,但是测试不要仅限于 iPhone 模拟器。模拟器 只不过是模拟器。虽然存在与 iPhone 模拟器相关联的键盘和鼠标,但要真正测试复 杂的设计,必须使用实际的 iPhone 对应用程序进行测试。 1.3 苹果公司的 iPhone SDK 工具 在 iPhone 开始发售的时候, 无法直接在该设备上运行第三方原生应用程序—— 直到 2008 年 3 月 6 日苹果公司发布了第一个 iPhone SDK 测试版为止。iPhone SDK 允许第三方编写应 用程序,并在该设备上原生运行该应用程序。从那一天开始, iPhone SDK 就一直不断地推出 更新的测试版和发布版。起初, iPhone SDK 只是同时支持 iPhone 和 iPod touch。随着 iPhone SDK 3.2 版的发布,苹果公司开始增加了对 iPad 平板电脑的支持。 1.3.1 工具 苹果公司的 SDK 包含大量的工具, 这些工具对于 MonoTouch 开发人员来讲是很重要的。 这些工具包括如下。 ● Xcode 用于在苹果公司产品环境下进行开发的工具套件,其中主要的工具是集成开 发环境 (IDE)。尽管 MonoTouch 没有直接使用 Xcode IDE,但是它可以帮助您创建简 单的应用程序,并将其部署到设备上。还可以使用 Xcode 核实证书,以及提供关于 相关设备正常工作的信息。 ● Interface Builder Interface Builder(IB)用于以图形方式创建用户界面。 MonoDevelop IDE 集成了 IB,能够将在 IB 内创建的界面转换成 MonoTouch 可以调用的用户界面。 ● 模拟器 用于模拟 iPhone、iPod touch 和 iPad。注意,模拟器不能运行 ARM 代码, 它只能运行 x86 代码。 第 1 章 C#开发人员基于 MonoTouch 进行 iPhone 开发概述 9 ● 针对这些设备所需的库 包括面向 Cocoa Touch、音频、视频、联网、 SQLite、线程、 电源管理和通用 OS X Kernel 的库。 1.3.2 许可 SDK 可以免费下载。但是,要想将软件发布到 iPhone 上,开发人员必须加入 iPhone 开 发计划 (iPhone Development Program)。在编写本书时,加入 iPhone 开发计划的费用是一年 99 美元。各国的加入费用是不一样的。将应用程序发布到设备上的能力依赖于是否具有必要的 开发证书。一旦开发人员加入了 iPhone 开发计划,就可以通过苹果公司的开发人员网站获取 证书。 1.4 本章小结 本章介绍了市场上已有的如下一些产品: ● iPhone、iPhone 的许可及 iPhone 的操作系统。 ● .NET Framework 和 Mono。 ● MonoTouch,它让.NET 开发人员能够面向 iPhone 进行开发。 ● MonoDevelop,它让开发人员有了一个良好的集成开发环境来使用 MonoTouch 编写 代码。 现在,您应该熟悉了使用 .NET/C#构建 iPhone 上运行的原生应用程序所需的工具。在下 一章中,您将探索使用 MonoDevelop 构建 MonoTouch 应用程序的具体细节。第 3 章和第 4 章将描述如何处理用户控件,这些控件以标准形式为用户提供输入方式,以及将数据展示给 用户。本书中的其他章将探讨 iPhone 的一些具体内容,例如地图和加速度,此外还对 iPad 进行了介绍。 MonoTouch 介绍 本章主要内容 ● MonoTouch 入门 ● 使用带有 MonoTouch 的 MonoDevelop ● MonoTouch 和 Interface Builder(IB) ● 调试与部署 MonoTouch 是什么呢?如果已经购买了本书,那么您可能至少对此有一些基本的了解, 但是,本章将专门向您提供这个问题的实质性回答,从而为您着手进行 iPhone 应用程序开发 并将您的开发技能应用于其中奠定坚实的基础。 简而言之, MonoTouch 就是一组工具,通过这组工具,开发人员就可以使用 .NET Framework 的现有知识在 Mac 上构建 iPhone 和 iPod touch 应用程序。对于.NET 3.5 Framework 的核心功能和 iPhone SDK 所提供的核心 API,MonoTouch 应用编程接口 (Application Programming Interface,API)实现这两者的结合。为了实现这样的结合, .NET Framework 被 编译成 ARM 代码,这使得.NET Framework 能够在 iPhone 设备上运行;同时,通过 C#与使 用 Objective-C 和 C 编写的 iPhone 原生 API 之间的互操作来提供这些原生 API。这使得开发 人员能够以类似的方式针对外部的 API 进行编码,同时这种编码方式与开发人员所熟悉的 C#知识是一致的。 2.1 开发前的准备 在进行正式开发之前,需要假设您已经拥有了 Intel Mac 系统。之所以做出这样的假设, 是因为苹果公司的 iPhone SDK 只支持在这些类型的计算机上进行开发。因为 MonoTouch 使 用 iPhone SDK,所以还需要遵循苹果公司实施的开发限制。为了构建第一个 MonoTouch 应 2 第 章 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 12 用程序,并让它能够运行起来,还需要完成如下几件事情: (1) 确保运行的 Intel Mac 系统至少是 10.5.7 版本。 (2) 下载和安装 Mono 框架, 下载网址为: www.go-mono.com/mono-downloads/download.html。 (3) 下载和安装 MonoTouch,下载网址为:http://monotouch.net/。 (4) 下载和安装 MonoDevelop,下载网址为:http://monodevelop.com/Download。 (5) 下载和安装 iPhone SDK,下载网址为: www.apple.com/downloads/macosx/development_ tools/iphonesdk.html。 现在已经安装好了所有的组件,可以深入研究 MonoTouch。首先,需要花点时间看一下 MonoTouch 包含了一些什么组件。 2.2 MonoTouch 的组件 MonoTouch 的 4 个组件如下: ● monotouch.dll 是一个 C#程序集, 提供了对 iPhone 原生 API 进行绑定的 API(在本章后 面的表 2-2 中给出了绑定的 API 的完整列表)。 ● mtouch 是一个命令行 SDK,它将会编译成 C#和公共中间语言(Common Intermediate Language,CIL)代码。这种编译后的代码可以在模拟器或实际的 iPhone 上运行。 ● MonoDevelop 的一个插件,用于面向 iPhone 进行开发。这个插件允许 MonoDevelop 使用命令行工具 mtouch,并能够将 mtouch 与 Interface Builder(IB)和 iPhone 模拟器集 成。通过该插件,还能够将软件部署到设 备上,并能够构建发布到应用程序商店和进 行专门发布(针对特定的用户发布)的应用程序。 ● Mono 运行时的商业许可,有了这个许可,就可以将开发好的、准备在应用程序商店 中进行销售的代码与 Mono 运行时进行静态链接。 2.2.1 Mono 概述 MonoTouch 的核心是 Mono。Mono(就是西班牙语中的 monkey)是.NET Framework 的一 个开源实现版本,它由 Novell 创建,是为了让 .NET Framework 具有跨平台的版本。这意味 着,该框架能够运行在许多不同的平台上,诸如苹果公司的 OS X、Linux、任天堂的 Wii、 索尼公司的 PlayStation 3 和很多其他的平台,包括 Windows。因为 Mono 是开源的,所以任 何人都可以根据自己的需要来使用和修改这个框架,如果希望面向的是具有限制的平台,那 么该框架就很有用。 记住,面向 MonoTouch 进行开发时使用的是 Mono 框架的一个修改版本, 然后针对应用程序代码(和框架 )运行链接器以降低应用程序整体的代码大小。在 2.8 节中将深 安装顺序是很重要的, 因为 MonoTouch 和 MonoDevelop 依赖于 Mono 框架。 在安装这些项时确保是按照前面所列出的顺序进行的。 第 2 章 MonoTouch 介绍 13 入地解释链接器的概念。 2.2.2 MonoTouch 的名称空间和类 本节将深入讨论 MonoTouch 中包含的核心名称空间和类。MonoTouch 使用了 Silverlight .NET 程序集的一个超集, 这意味着在 MonoTouch 的 Silverlight .NET 程序集中还加 入了其他的功能。表 2-1 列出了可用的.NET 程序集。 表 2-1 MonoTouch 中可用的.NET 程序集 程 序 集 API 兼 容 性 Mono.CompilerServices.SymbolWriter.dll 面向编译器的写入器 Mono.Data.Sqlite.dll 面向SQLite的ADO .NET提供程序, 由于iPhone OS SQLite 版本的原因,存在一些限制 Mono.Data.Tds.dll TDS 协议支持;在 System.Data 内用于支持 System.Data.Sql- Client Mono.Security.dll 加密的 API mscorlib.dll Silverlight System.dll Silverlight,增加了来自下面这些名称空间的类型: System.Collections.Specialized System.ComponentModel System.ComponentModel.Design System.Diagnostics System.IO.Compression System.Net System.Net.Cache System.Net.NET.Mail System.Net.Mime System.Net.NetworkInformation System.Net.Security System.Net.Sockets System.Security.Authentication System.Security.Cryptography System.Timers System.Core.dll Silverlight System.Data.dll .NET 3.5 去除像 System CodeDom、XML 配置支持、 OleDb 和 Odbc 这样的功能 System.Json.dll Silverlight System.ServiceModel.dll WCF 栈(与 Silverlight 中展示的栈相同) iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 14 (续表) 程 序 集 API 兼 容 性 System.Transactions.dll .NET 3.5;部分支持 System.Data System.Web.Services.dll 来自.NET 3.5 配置文件的基本 Web 服务, 去除服务器功能 System.Xml.dll .NET 3.5 System.Xml.Linq.dll .NET 3.5 System.Linq .NET 3.5 上面的内容摘自 www.MonoTouch.Net/Documentation/Assemblies 随着 MonoTouch 不断发布新版本, MonoTouch 产品在不断地成长之中,因此,自本书 编写以后,还会有其他的功能加入到 MonoTouch 中。要想了解其他任何改变和更新,需要查 看相关的程序集。 除了.NET 程序集之外, MonoTouch 还提供了 monotouch.dll 程序集, 该程序集包含的 API 都是对基于 Objective-C 和 C 的 API 的绑定。该程序集中的关键名称空间如下: ● MonoTouch.ObjCRuntime 这个名称空间提供了 .NET/C#领域与 iPhone 的 Objective-C 领域的互操作/连接。在第 11 章中将深入对此进行讨论。 ● MonoTouch.Foundation 这个名称空间提供了与 iPhone 的 Objective-C 通信所需的 数据类型支持。大多数类型是直接进行映射的。例如, NSObject Objective-C 基类映 射为 C#中的 MonoTouch.Foundation.NSObject 类。有些类不是直接映射为它们的 Objective-C 类名, 例如 NSArray。如果数组具有一组 UIViewController,那么 NSArray 就映射为 UIViewController[]这样的强类型数组。 ● MonoTouch.UIKit 该名称空间提供了 Cocoa Touch 内的 UIKit 组件之间的直接绑定。 这种绑定是通过为每个可用的 UIKit 组件提供 .NET 类来实现的。开发人员会经常用 到这个名称空间。 ● OpenTK 这个名称空间是 OpenTK API 的修改版本。 OpenTK 是一个针对 OpenGL 的面向对象绑定, OpenGL 代表开放图形库 (Open Graphics Library),它是用于使用三 维图形编程的 API。OpenTK 是用于执行 OpenGL、OpenAL 和 OpenCL 的一个库。 OpenTK 是使用 C#编写的,能够运行于 Windows、Mac OS X 和 Linux 上。OpenTK 在 iPhone 上的实现已经经过了更新, 从而可以使用 Core Graphics,并且仅提供 iPhone 上可用的功能。 对于.NET 开发人员而言, Cocoa Touch 是一个抽象层或一个 API,通过它就 可以构建能够在 iPhone 上运行的程序。 Cocoa 这个 API 能够用于构建在 Mac OS X 操作系统上运行的程序。 Cocoa Touch 可以看作是专门针对基于触摸方式 的 iOS 进行调整后的 Cocoa。在第 14 章中,您会阅读到更多关于 Cocoa 的 内容。 第 2 章 MonoTouch 介绍 15 monotouch.dll 中的其他名称空间都是对 Objective-C 的绑定, 表 2-2 列出了这些名称空间。 您可能会注意到,其中没有包含 Monotouch.CoreData,它应该是对 Objective-C 的 CoreData 类的绑定。之所以没有包含这个名称空间,是因为它与 Objective-C 的执行方式以及与处理持 久化存储的工具是紧密耦合的。作为替代,应该使用 Mono.Data.Sqlite。 表 2-2 对 Objective-C 进行绑定而形成的.NET 程序集 名 称 空 间 描 述 MonoTouch.AddressBook 提供对 iPhone 地址簿的访问 MonoTouch.AddressBookUI 用于访问 iPhone 地址簿的用户界面组件 MonoTouch.AudioToolbox 包含用于定制回放和记录的低级音频功能 MonoTouch.AVFoundation 通用的音频回放和记录 MonoTouch.CoreAnimation 提供动画编程能力 MonoTouch.CoreFoundation 对 Cocoa Touch 中低级 C API 的绑定 MonoTouch.CoreGraphics 对 Quartz 2D 图形 API 的绑定 MonoTouch.CoreLocation 提供位置工具 MonoTouch.GameKit 允许提供像 P2P 通信这样的游戏功能 MonoTouch.MapKit 用于提供丰富地图绘制功能的 API MonoTouch.MediaPlayer 提供音频/视频能力和链接到 iPod 库的能力 MonoTouch.MessageUI 用于在应用程序中发送电子邮件的用户界面组件 MonoTouch.OpenGLES 提供将 OpenGL 嵌入应用程序的能力 MonoTouch.StoreKit 包含处理申请支付的 API MonoTouch. SystemConfiguration 提供联网功能 2.3 使用 MonoDevelop MonoDevelop 是一个开源的集成开发环境,贯穿本书,您都会使用这个工具来编写和开 发自己的示例应用程序。 MonoDevelop 是一个跨平台的集成开发环境,这意味着,它能够在 Linux、Mac 和 Windows 平台上运行。 这个 IDE 具有很多与 Visual Studio 类似的地方, 而 Visual Studio 仅面向 Windows 用户。在此情况下, MonoDevelop 可以用于开发 Windows、Mac OS X 和 Linux 等很多平台上的桌面应用程序、 Web 应用程序 (使用 ASP.NET)和 Moonlight(Silverlight 的 Mono 实现)。既然如此,在开始编码之前,有必要了解一下 MonoDevelop,以及清楚 MonoDevelop 中的 MonoTouch 项目是如何组织的。 在首次启动 MonoDevelop 时,会出现一个欢迎屏幕, 看起来非常类似于打开 Visual Studio 时出现的屏幕。图 2-1 是主屏幕的一个屏幕截图。这个屏幕是有用的,因为它列出了最近的 所有项目,这对于在不同的项目之间跳转是非常方便的。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 16 图 2-1 为了创建一个新的 MonoTouch项目, 可以在屏幕顶部的菜单栏中选择 File | New | Solution 命令;或者直接在主屏幕上单击 Common Actions 部分中的 Start a New Solution 按钮。此时会 出现 New Solution 文件对话框,如图 2-2 所示。 图 2-2 表 2-3 列出了可以创建的各种类型的项目。 第 2 章 MonoTouch 介绍 17 表 2-3 MonoTouch 项目类型模板 项 目 类 型 描 述 iPhone Window-based Project(基于 iPhone 窗口 的项目) 创建一个窗口,并将视图和其他样本代码加载到 其中 iPhone OpenGL Project(iPhone OpenGL 项目) 创建一个带有旋转立方体的 OpenGL 样本代码 iPhone Navigation-based Project( 基于导航的 iPhone 项目) 创建一个默认带有导航视图配置的项目 iPhone Utility Project(iPhone 实用程序项目) 实用程序项目是一个简单的基于两个视图的项目, 在这个项目中,可以通过对视图进行翻页获得“关 于”信息 MonoTouch Library Project(MonoTouch 库项目) 这个项目会封装在 MonoTouch 中使用的库代码 Empty MonoTouch Project(空 MonoTouch 项目) 一个完全空白的 MonoTouch 项目 对于本例而言,只需要选择基于 iPhone 窗口的项目,因为对于 MonoTouch 项目而言, 这是一种最常见的布局。为新建的项目取一个名称,然后单击 Forward 按钮。 您可以看到的下一个屏幕是 Project Features 屏幕,如图 2-3 所示。无须使用其中的任何 功能,因为它们更多地用于像桌面应用程序这样的其他 Mono 项目类型,因此可以跳过这个 屏幕,而直接单击 OK 按钮。 图 2-3 仔细看一下 MonoTouch 的项目布局,就会注意到几个不一样的内容。图 2-4 给出了默认 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 18 的基于窗口项目的结构。解决方案文件包含一个项目—— MonoTouch 项目。用到的任何额外 的库项目也必须是 MonoTouch 项目。 图 2-4 ● References 文件夹看起来很熟悉,然而要知道, monotouch.dll 是自动作为引用包括进 来的。 ● 名为 Main.cs 的.cs 文件是 MonoTouch 使用的默认启动模板, 其中包含一个 Main 方法。 Main 方法是 iPhone 应用程序的起点,它还启动应用程序的事件循环,以处理 iPhone 和应用程序之间的交互。 ● 一个称为 MainWindow.xib 的 XIB 文件(基于 XML 的 Interface Builder 文件),这个文 件包含应用程序的用户界面。该文件通常要通过 Interface Builder 进行修改。Interface Builder 具有一些令人感兴趣的概念,下一节会对此进行探讨。 ● MainWindow.xib.designer.cs 文件包含对用户界面内存在的视图、控件、插座变量和动 作的定义 (在本章后面会对视图、插座变量和动作进行解释 )。在每次通过 Interface Builder 对用户界面进行更新时,该文件都会更新。不应该手动更新这个文件。 现在我们已经了解了 MonoDevelop 和 MonoTouch 项目的基础知识,接下来可以使用 Interface Builder 开始创建“Hello World”应用程序。 2.4 使用 Interface Builder Interface Builder 工具是在 iPhone SDK 中提供的。该工具通常用于 Mac OS X 开发和 iPhone 应用程序开发。 Interface Builder 提供了拖放面板以供开发人员将控件拖放到屏幕上。 使用 Interface Builder 是一件非常纠结的事情,尤其对于那些具有 Visual Studio 背景的开发人 员更是如此;它具有很多与 Visual Studio 内的设计器类似的内容,但是其工作方式和控件的 设置方式却又完全不同。 第 2 章 MonoTouch 介绍 19 Interface Builder 直接集成到 MonoDevelop 中,双击任何 .xib 文件都可以自动基于选择 的.xib 文件打开 Interface Builder。 在打开 Interface Builder 时,会出现几个不同的窗口,如图 2-5 所示。 图 2-5 ● Library 这个窗口包含 Objects、Classes 和 Media 选项卡,其中包含着用户可以单击 并拖到视图上的控件。 ● View 这个窗口是一个视图,可以单击不同的控件,并将其拖到该视图上。这使得 我们可以按照所见即所得(WYSIWYG)的方式对用户界面进行布局。 ● Connections 在这个窗口中,可以设置控件之间的连接,使得我们能够通过程序对 这些控件进行修改。如您所看到的一样,该窗口中还有另外 3 个选项卡。另外 3 个选 项卡是 Attributes、Size 和 Identity,通过这些选项卡,可以对控件细节进行修改。总 体来讲,这个窗口就是所谓的查看器(Inspector)。 ● 图 2-5 中的第 4 个窗口标题为 Untitled,这是 Interface Builder 的主菜单,这个主菜单 给出了视图中所有控件的分层视图。 后面几节将讨论可以使用的控件有哪些类型, 包括通过 Interface Builder 使用的控件和仅 通过代码使用的控件。 使用 Interface Builder 完全是可选的,所有的控件都可以直接通过代码来使 用。但是对于创建布局而言,它是一个有用的工具。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 20 2.4.1 使用库中的控件 Library 窗口包含大量可以在 Interface Builder 内使用的控件。这些控件也可以通过代码 来调用;括号内的内容表示与该控件相对应的类。 ● 控制器(UIViewController) 控制器是控制某种类型活动的控制器系列。 ● 数据视图 数据视图通常用于向用户展示某种类型的信息。展示的控件有: • 表视图 (UITableView) 表视图以表列表的格式向用户展示数据。用户能够通过滚 动栏浏览数据。通常,表视图中的一个单元格就是一整行 (就是所谓的表视图单 元格)。 • 表视图单元格 (UITableViewCell) 对于表视图单元格,可以在表视图内对单元格 定义和应用定制的外观、属性和行为。 • 图像视图(UIImageView) 图像视图向用户显示图像或动画。对于动画的情况,图 像视图是作为一个 UIImage 数组而定义的。 • Web 视图(UIWebView) Web视图在应用程序内向用户显示 Web 内容。 • 地图视图(MKMapView) 地图视图在应用程序内向用户显示地图内容。 • 文本视图(UITextView) 文本视图显示多行可编辑文本。 • 滚动视图(UIScrollView) 对于在单个窗口视图内无法完全显示的内容,滚动视图 为显示这样的内容提供了一种方式。 • 拾取器视图(UIPickerView) 拾取器视图显示一个老虎机样式的旋转轮。 对于不熟 悉 MonoTouch 的.NET 开发人员来讲,这个控件在概念上类似于下拉列表框。 • 日期拾取器 (UIDatePicker) 日期拾取器是一组旋转轮, 通过它可以选择日期和时间。 ● 输入对象与值对象 (Inputs & Values) Inputs & Values窗口提供了一组 UI控件为用户 提供输入方式。这些控件包括: • 分段控件 (UISegmentedControl) 分段控件可以看作是一个按钮,该按钮的不同 部分表现为单独的控件。 • 文本标签(UILabel) 文本标签是显示文本的控件。 • 圆角矩形按钮 (UIButton) 圆角矩形按钮控件实现了触摸事件。触摸事件类似 于.NET 中的“单击”事件。圆角矩形按钮等价于.NET 中的按钮。 • 文本框(UITextField) 文本框控件允许用户通过虚拟键盘输入文本或数据。 • 开关(UISwitch) 开关控件允许用户切换用户界面上的值。从概念上讲,这个控件 类似于复选框。 • 滑动栏(UISlider) 滑动栏控件允许用户输入一定范围值内的某个值。 • 进度视图(UIProgressView) 进度视图控件可以显示任务执行的进度。进度视图 通常用于长时间执行的任务,向用户提供反馈。 • 活动指示器视图(UIActivityIndicatorView) 活动指示器视图控件提供任务当前运 行的反馈。它并不显示任务的状态,只是显示任务正在运行。 • 页面控件(UIPageControl) 页面控件向用户提供应用程序中有其他页面的信息。 第 2 章 MonoTouch 介绍 21 ● 窗口、视图和栏 这些是 Interface Builder 和代码中可以使用的窗口、视图和栏。 • 窗口(UIWindow) 窗口包含多个视图,会首先在屏幕上显示。由于所有的视图都 是在窗口中显示的,因此只能有一个窗口实例。 • 视图(UIView) 视图控件是一个矩形区域,可以放置控件和处理事件。 • 搜索栏(UISearchBar) 搜索栏控件是一个带有圆角边和搜索图标的文本框。其 UI 外观是为了向用户表明,这个字段可用于搜索。 • 搜索栏和搜索显示控制器 (UISearchDisplayController) 搜索栏(Search Bar)和搜 索显示控制器(Search Display Controller)是 Search Bar 控件、 Bookmark 按钮、 Cancel 按钮和显示搜索结果的表视图。 • 导航栏(UINavigationBar) 导航栏是支持按照分层进行内容导航的一个 UI 控件。 • 导航项(UINavigationItem) 导航项控件包含导航栏中导航项的相关信息。 • 工具栏 (UIToolBar) 工具栏控件会在屏幕底部显示一个工具栏。工具栏控件支持 工具栏内的工具栏项。 • 栏按钮项(UIBarButtonItem) 栏按钮项控件代表工具栏控件或导航栏内的一项。 • 灵活空间栏按钮 (UIBarButtonItem) 灵活空间栏按钮控件代表工具栏内的空 间量。 • 选项卡栏 (UITabBar) 选项卡栏控件可以将选项卡栏显示在屏幕底部。选项卡栏 控件可用于选项卡栏项的选择。 • 选项卡栏项(UITabBarItem) 选项卡栏项控件是选项卡栏控件内的一项。 2.4.2 设置插座变量 为了能够使用拖到 Interface Builder 视图上的控件,需要为每个控件创建一个插座变量。 在 MonoTouch 中,插座变量是一个类上的实例变量,该类分配给 Interface Builder 内定义的 控件。该实例变量提供了一个接口,使得我们可以通过编程来访问该控件。为了说明这一 点,您将使用一个基于 iPhone 窗口的项目,并在 Interface Builder 中打开 MainWindows.xib 文件。 (1) 首先,从 Library Objects 选项卡中拖动一个圆角矩形按钮到窗口上。为了设置按钮的 文本,可以在按钮中间双击,然后输入文本。结果看起来如图 2-6 所示。 在大多数情况下,您不会希望在窗口中直接使用控件, 而是使用作为子视 图加入到窗口中的视图来连接控件。这是因为在实际的应用程序中, 您只是使 用窗口来添加视图,而不是使用窗口来显示控件。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 22 图 2-6 (2) 即使按钮控件位于窗口上,如果没有为其创建插 座变量,那么也不能使用这个控件。在库中,选择 Classes 选项卡,然后选择 AppDelegate 选项(这就是您需要用于访 问新建按钮的类)。 (3) 在 Library 窗口的下方,现在有一个由 4 个选项卡 组成的列表:Inheritance、Definitions、Outlets 和 Actions。 现在,需要选择 Outlets 选项卡,单击+按钮加入一个新的 插座变量。将该插座变量命名为 myButton,按 Enter 键保 存修改结果。可以选择输入一种类型,但是可以保留这个 类型为“id”。得到的结果看起来应该如图 2-7 所示。 (4) 您可能已经注意到,还没有告诉这个插座变量哪 个按钮将与之关联。为此,需要使用 Inspector 窗口(位于 图 2-8 中靠右边的窗口)来创建从 AppDelegate 类插座变量 到窗口中实际按钮的连接。首先从 Interface Builder 的主窗 口(从左边开始数的第三个窗口)中选择 AppDelegate。然 后,选择 Inspector 窗口中的 Connections 选项卡(带有蓝色 图标和白色箭头)。插座变量会在此显示;然后需要单击并 将其从 Inspector 插座变量拖到窗口上的实际按钮(创建 Inspector 插座变量与实际按钮的连接)。图 2-8 显示了这个 图 2-7 第 2 章 MonoTouch 介绍 23 过程。 图 2-8 现在已经创建好这个连接, 并且已经设置好这个插座变量, 接下来可以在代码中使用它。 参见 2.5 节,看一看它是如何工作的。 2.4.3 设置动作 动作是一条消息,当特定的事件发生时就会激活这条消息。这与 .NET 内事件的概念非常 类似。 MonoTouch 所做的工作就是通过激活该事件的控件的强类型部分方法来公开这些动 作。在下一节中可以了解到更多的相关知识。 设置动作的方式类似于设置插座变量,通过使用库类部分来创建一个新的动作,然后将 这个动作连接到一个按钮的方法上。 (1) 与前面创建插座变量一样,创建一个新动作,并赋予它一个名称。 (2) 接着,与插座变量的情况一样,选择 Actions 选项卡,单击+按钮添加一个新动作。 应该将这个动作取名为 buttonPressed,从而与示例图像一致。 Interface Builder 会自动在该方 法之后增加一个分号,用于表示这是 Objective-C 中的一个方法,但是,在使用 Mono Touch 时,保留这个分号并无妨碍。 (3) 您应该注意到, 在 AppDelegate Inspector Connections 选项卡内, 有一个名为 Received Actions 的新区域,其中包含着这个新动作。单击并将这个新动作拖到该按钮上。这一次,当 释放鼠标左键后,应该注意到会出现该按钮可用的一系列动作。作为示例,请参见图 2-9。 需要与按钮关联的动作可能是 TouchUpInside 方法。这意味着用户触摸了按钮,并刚刚 移开光标。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 24 图 2-9 这就是在 Interface Builder 中关联一个动作所需的所有工作。关于如何使用动作,请继续 阅读下一节的内容。 2.5 基于 Interface Builder 实现的 Hello World 现在,关于插座变量和动作您已经有了很好的理解。这一节将介绍如何在 MonoTouch 中使用插座变量和动作完成一些简单的任务,例如在单击按钮时改变按钮上的文本。如果还 没有阅读过插座变量和动作相关小节的内容,那么建议您回过头去看一看,因为本节要解释 如何在 MonoTouch 中使用插座变量和动作。 一旦保存了前面创建的 MainWindow.xib 文件,那么打开 MainWindow.xib.designer.cs 文 件,看一看这个文件是如何自动生成的。这个设计器文件看起来应该如程序清单 2-1 所示。 程序清单 2-1 MonoTouch 生成的 AppDelegate 设计器文件 [MonoTouch.Foundation.Register("AppDelegate")] public partial class AppDelegate { private MonoTouch.UIKit.UIWindow __mt_window; private MonoTouch.UIKit.UIButton __mt_myButton; #pragma warning disable 0169 [MonoTouch.Foundation.Export("buttonPressed:")] partial void buttonPressed (MonoTouch.UIKit.UIButton sender); 第 2 章 MonoTouch 介绍 25 [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("myButton")] private MonoTouch.UIKit.UIButton myButton { get { this.__mt_myButton = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("myButton"))); return this.__mt_myButton; } set { this.__mt_myButton = value; this.SetNativeField("myButton", value); } } } 从这个设计器文件中可以看出, 设计器创建的是与 Main.cs 文件中的 AppDelegate 类相伴 的部分类。还可以看到,有一个称为 buttonPressed 的部分方法,它代表创建的动作。还有一 个实例变量 myButton,它代表为该按钮创建的插座变量。 如果进入 Main.cs 文件中 AppDelegate 类的其他部分所在的位置,就可以针对 myButton 变量开始编码。由于您知道 myButton 属于 UIButton 类型,因此可以获得完整的 IntelliSense 支持。因为是通过 Interface Builder 来添加这个按钮的,所以无须添加其他代码来初始化该按 钮—— 这是自动完成的工作。 为了验证该按钮确实被按下,需要创建一个 buttonPressed 部分方法,并通过执行一些自己 的代码来处理这个动作。对于本例而言,只需要改变该按钮上显示的文本来表明按钮已经被单 击(Clicked),为此可以使用 SetTitle 方法,传入需要在按钮上显示的文本和它应该以何种方式显 示的控件状态—— 在本例中只须使用 Normal 状态。完成后的 Main.cs 应该类似于程序清单 2-2。 程序清单 2-2 使用 Interface Builder 控件 // The name AppDelegate is referenced in the MainWindow.xib file. public partial class AppDelegate : UIApplicationDelegate 不应该编辑设计器文件,因为每次在 Interface Builder 中编辑.xib 文件时 , 都会自动生成该文件。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 26 { public override bool FinishedLaunching (UIApplication app, NSDictionary options) { // If you have defined a view, add it here: // window.AddSubview (navigationController.View); window.MakeKeyAndVisible (); return true; } partial void buttonPressed (UIButton sender) { myButton.SetTitle("Clicked", UIControlState.Normal); } // This method is required in iPhoneOS 3.0 public override void OnActivated (UIApplication application) { } } 要运行这段代码, 只须简单地单击 MonoDevelop 中的齿轮状图标 (如 图 2-10 所示)。如果喜欢使用键盘快捷键,那么可以按下 Alt+Cmd+Enter 组合键来完成同样的动作。 这会自动编译应用程序、 打开 iPhone 模拟器, 将应用程序安装到模拟器上,并启动应用程序。 如果所有这些步骤都成功完成,那么应该会看到类似于图 2-11 所示的屏幕。当单击该按 钮时,按钮上的文本会改变为“Clicked”,最终的应用程序看起来应该类似于图 2-12。 图 2-11 图 2-12 图 2-10 第 2 章 MonoTouch 介绍 27 2.6 基于代码实现的 Hello World 由于使用 Interface Builder 进行开发完全是可选的, 因此本节会讲述如何使用代码来构建 与前一节完全相同的应用程序。 首先, 需要再次创建一个新的基于 iPhone 窗口的项目。 此处会自动生成 MainWindow.xib 和设计器文件,但是这一次不会使用这些文件,而是会在 FinishedLaunching 方法中通过编码 来实现所有的内容。 首先,在屏幕上创建一个新按钮。为此,只须简单地调用 UIButton 类上的静态方法 FromType 来创建按钮的一个新实例。使用 UIButtonType 枚举中的 RoundedRect 按钮类型, 这样它就能够匹配前面示例中所使用的按钮。 因为这个按钮是通过程序创建的,因此必须通过程序来确定它在 UIWindow 内的具体位 置。为此,需要设置该按钮的 Frame 属性。可以创建一个新的 System.Drawing.RectangleF 矩 形,并将其传入作为该按钮的 Frame 属性值。为了让这个示例更加匹配前一个示例,还要使 用 SetTitle 方法设置 MyButton 的初始按钮文本。 如果决定直接运行这段代码,那么实际上根本看不到该按钮的显示效果,这是因为还需 要将其加入到窗口中。为此,只须通过在窗口上调用 AddSubview 方法,并将刚创建的按钮 作为参数传入。通过程序添加按钮的代码应该类似于程序清单 2-3,这些代码应该位于 FinishedLaunching 方法中。 程序清单 2-3 通过编程添加按钮 var button = UIButton.FromType(UIButtonType.RoundedRect); var frame = new System.Drawing.RectangleF(35f, 30f, 250f, 40f); button.Frame = frame; button.SetTitle("My Button", UIControlState.Normal); window.AddSubview(button); 现在,当运行该应用程序时按钮就会显示出来,但是当单击这个按钮时,不会有任何响 应。这就需要您开始着手来处理 TouchUpInside 事件。为了实现事件响应,您并不必了解任 如果 FinishedLaunching 方法不在 10 秒钟内返回, 那么 iOS 将关闭该应用程 序。对此进行管理的最佳途径就是创建一个新视图,将其作为主窗口的子视图 , 并在这个视图中添加任意的任务以执行, 而不是直接将任务添加到 FinishedLaunching 方法中。因为这只是一个简单的示例, 这样做不会导致什么 问题。 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 28 何动作;可以简单地像在.NET 中一样处理这些事件。 按钮实例提供了该按钮可用的所有事件, 您在前面使用 Interface Builder 时已经见到过这些事件。在为 TouchUpInside 添加事件后,得 到的代码应该类似于程序清单 2-4。显然,具体代码依赖于实现该事件的方式,但不管使用 哪种方式,最终得到的结果都应该是一样的。这个示例使用了一个 Lambda 表达式来创建匿 名委托。 程序清单 2-4 通过编程添加按钮的触摸事件 var button = UIButton.FromType(UIButtonType.RoundedRect); var frame = new System.Drawing.RectangleF(35f, 30f, 250f, 40f); button.Frame = frame; button.SetTitle("My Button", UIControlState.Normal); button.TouchUpInside += (sender, e) => { button.SetTitle("Clicked", UIControlState.Normal); }; window.AddSubview(button); 注意,相比之下,使用 Interface Builder 只须编写相当少的代码。然而您可能发现,相比 通过.xib 文件来创建新对象而言,使用代码来完成这些工作要直观得多。 2.7 调试 MonoTouch 同时支持在 iPhone 模拟器和设备中进行调试。调试过程非常类似于通过 Visual Studio 进行调试,支持在调试过程中使用断点、捕获点、查看、监视、即时 /表达式计 算器、调用栈和单步执行代码。 2.7.1 在模拟器上调试 您可能已经注意到 MonoDevelop 中Run 齿轮状图标右边的类似图 标;然而,这个图标在顶部包含一个绿色的病菌状图标 (参见图 2-13)。 您就是要使用这个图标以调试模式来运行应用程序。如果希望使用键 盘快捷方式来启动调试模式,那么可以按下 Cmd+Enter 组合键。 可以按照与 Visual Studio 内相同的方式通过 MonoDevelop 来设置断点—— 单击想要调试 的代码行左侧。当应用程序执行时,会停在断点处,并以黄色突出显示断点所在的代码行。 然后,可以将光标放在变量上,如您所希望的一样,在调试模式下可以查看各个属性的值, 如图 2-14 所示。 图 2-13 第 2 章 MonoTouch 介绍 29 图 2-14 2.7.2 在设备上调试 在设备上调试类似于在模拟器上调试。当在 MonoDevelop 中选择 Debug | iPhone 配置命 令(如图 2-15 所示)后,只会剩下调试图标是可以单击的。当单击该按钮后,应用程序会以调 试模式进行编译,并上传到连接的设备上。此时会弹出一个调试窗口 (如图 2-16 所示),需要 在该窗口中指定设备的 IP 地址和端口号。这是因为您将通过 Wi-Fi 来调试该设备,因此需要 确保该设备与计算机处于同一网络中。 图 2-15 图 2-16 为了能够对应用程序进行调试,在配置中还需要启用 一些额外的设置。可以通过 Settings 应用程序和应用程序 名称浏览这些设置。 您应该可以看到类似于图 2-17 所示的 界面。 需要确保计算机上调试窗口中弹出的 IP 地址与设备 调试设置中显示的 IP 地址是匹配的。 在应用程序处于调试模式中时,设备可能会振动。这 是 MonoTouch 的一种提醒方式,它告诉您存在问题,该问 题依赖于振动的次数: ● 一次振动 该应用程序无法连接正在等待设备连 接的计算机。 图 2-17 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 30 ● 两次振动 该应用程序无法分析所配置的主机地址。 ● 三次振动 无法设置标准流(stdout 和 stderr)。 2.8 理解链接器 因为无法在 iPhone 上对库进行重用,所以每次将 MonoTouch 应用程序的某个版本放到 设备或应用程序商店中时,都要再次安装 Mono 框架。您也许会认为,针对每个应用程序, 每次都要将同样的 Mono 框架安装到设备上是一种浪费。如果情况是这样,那么确实是一种 浪费。 MonoTouch 实际上使用链接器 (linker)工具遍历 Mono 框架程序集,并将应用程序中没 有使用到的代码移除。这意味着,每个应用程序使用的都是自己唯一的和经过裁剪的 Mono 框架版本。因此,在出现 MonoTouch 的新版本时,不必使用 MonoTouch 来升级每个应用程 序,就可以支持可能出现的任何最新版本或回归测试。每个应用程序将仍然能够使用自己版 本的框架来运行。 链接器还有助于降低应用程序的大小,这一点是很重要的,尤其对于在移动设备上运行 的应用程序而言则更是如此。如果应用程序小于 20MB,那么苹果公司就能够让您通过 Edge/3G 来下载它;如果应用程序超过了这个限制 (20MB),那么就需要连接到 WiFi 网络才 能下载该应用程序。因为您并没有包含应用程序中没有使用到的整个基类库和 Mono 框架的 核心组件,所以不会被应用程序没有使用的代码耗光存储空间。 链接器集成到了 MonoTouch 和 MonoDevelop 中,因此使用它并不需要额外的处理。默 认情况下,为了使用链接器, MonoDevelop 会对 iPhone 模拟器的配置文件进行设置 (Debug | iPhone Simulator 和 Release | iPhone Simulator),以及对设备的配置文件进行设置 (Debug | iPhone 和 Release | iPhone)。MonoDevelop 会选择 Link SDK assemblies only(只链接 SDK 程 序集)配置,这意味着链接器会遍历该 SDK,并去除没有使用到的代码;但是,它并不链接 您所创建的程序集。另外一种配置是 Link all assemblies(链接所有程序集 ),这会同时遍历 SDK 和您所创建的程序集。对于代码中像 Web 服务、反射或序列化这样的内容,如果不是 静态调用,那么链接所有的程序集通常可能会让涉及到这些内容的代码产生问题。通常需 要在可能被链接器移除的成员上使用 [Preserve]属性,或者在定义这些成员的类型上使用 [Preserve(AllMembers=true)]属性。 为了能够在设备上进行调试,需要具有完整版本的 MonoTouch 和正确安装 的授权证书。参见 2.9 节可以获得更多相关的信息。 第 2 章 MonoTouch 介绍 31 2.9 部署应用程序 您已经完成了 Hello World 应用程序,现在需要将该应用程序部署到 iPhone 上,向全世 界表明该应用程序是多么令人惊奇 (或者表明 MonoTouch 是多么强大 )。按照下面的步骤就可 以将应用程序上传到设备上: (1) 您需要成为 Apple iPhone 开发人员计划的成员。在编写本书时,参与该计划的费用 是一年 99 美元。在本节的结尾处,可以在项目列表中找到注册网站。 (2) 请求和安装开发人员许可证书 (Developer Certificate),该证书可以通过 iPhone 开发人 员计划成员资格从苹果公司获取。这个证书在开发用 Mac 计算机的 Keychain Access 实用程 序内应该是可见的, 在/Applications/Utilities/Keychain Access.app 页面内可以找到该实用程序。 (3) 请求和安装部署许可证书 (Deployment Certificate),该证书可以通过 iPhone 开发人员 计划成员资格从苹果公司获取。这个证书在开发用 Mac 计算机的 Keychain 安全实用程序内 应该是可见的。 (4) 必须正确地提供 iPhone 的相关信息。这意味着, iPhone 能够运行不是从应用程序商 店下载的调试或测试程序。苹果公司通过其开发人员网站提供了一个向导实用程序,这个向 导实用程序能够帮助您对 iPhone 进行信息提供和设置。 (5) 一旦完成了开发系统设置,在开发人员选择将应用程序部署到设备上时,就必须对 MonoDevelop 项目进行设置才能将该应用程序部署到 iPhone 上。这个过程是通过设置项目选 项来完成的。为了访问这个界面,需要右击 iPhone 项目,并选择相应的配置选项。在项目窗 口弹出以后,可以选择 iPhone Bundle Signing 选项,如图 2-18 所示。默认情况下,会使用找 到的第一个开发人员许可证书。 图 2-18 iPhone 高级编程—— 使用 MonoTouch 和.NET/C# 32 为了帮助 Mac 开发人员设置这些关键项和部署配置,苹果公司有几种非常优秀的资源。 为了访问这些资源,需要成为苹果公司的 iPhone 开发人员计划的成员 (为了浏览最新的两项 资源,您需要以成员身份登录): ● iPhone 开发人员计划网站:http://developer.apple.com/ iphone/program。 ● iPhone 开发人员计划的信息提供网站: http://developer.apple.com/iphone/manage/overview/ index.action。 ● 苹果公司的如下 PDF 文档中非常详细地描述了认证过程: http://developer.apple.com/ iphone/download.action?path=/iphone/iphone_developer_program_user_guide/iphone_ developer_program_user_guide_standard_program_v2.5_final.pdf。 2.10 本章小结 本章介绍了如何设置 MonoTouch 和 MonoDevelop,并表明使用 MonoTouch 是相当简单 的,可以让您很快就能够编写 iPhone 应用程序。MonoDevelop 完美地集成了现有的 Apple 工 具,并且对于 Visual Studio 的用户而言具有熟悉的外观,使得这些用户很快就能够使用这些 开发工具。
还剩38页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

zhangyiwen

贡献于2013-01-09

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf