Wednesday, October 10, 2012

WWDC 2012笔记(4)

这是七百系列的最后几次视频讲座的笔记。我早已看完了所有的WWDC 2012视频讲座,内容真是太多了。我实在是没有时间再继续写其它系列视频讲座的摘要笔记,因此,我这次完成七百系列的笔记之后,我的WWDC12笔记也就此搁笔了。

709 What's new in The Filesystem

苹果的文件系统是负责管理电脑中的所有数据。该视频讲座首先列出了Filesystem的设计结构,以及新操作系统所支持的文件系统,其中HFS格式只读的支持将会退出。

iOS + OSX从Filesystem来说都是同一编码基础,唯一区别是iOS采用case-sensitive HFS+(HFSX)。

从硬件上来看,存储的方式是朝着SSD的趋势发展,文件I/O的速度更快,因此对Filesystem也有影响,需要更新。从分布式的发展趋势来看,云的服务是发展的方向,因此对Filesystem提出了安全、有效和备份的要求。

操作系统的更新有增加扩展的文件属性。

讲座从应用软件、内存和硬盘三个方面概要介绍之间的关系,并介绍了如何提高性能的一些技巧,如进行搜索的API,文件系统变化的通知方式,文件系统的metadata,推荐采用GCD分式计算方式处理文件,避免用户界面的等待。

云存储推荐采用NSFileCoordinator,这是一个十分复杂的平台,它提供简单的界面,内部处理了文件存储和管理的复杂过程。

在Mac OS的终端,可以用指令fs_usage来了解操作系统文件系统所发生的详细内容。比如用如下指令可以了解整个Filesystem的动态:

sudo fs_usage -w -f filesys

这是UNIX下的一个实时工具指令,用这个指令可以了解操作系统下文件系统的详细动态内容,包括文件读、写、属性等丰富的实时动态内容。

用下面指令可以了解TextEdit有关的文件详细动态,讲座详细分析了TextEdit app的一些运作,这一指令则在终端详细列出了有关的内容。

sudo fs_usage -w -f filesys TextEdit

讲座的最后主要内容介绍了苹果操作系统的File Vault 2,自Mountain Lion之后,苹果的操作系统在系统设置中增加了对整个硬盘进行了加密的选择。实际上苹果在OS 10.3就介绍了加密技术,但仅在ML之后才增加对整个硬盘加密的激活选择。而在iOS设备上,加密是自动激活的,因此iOS的内容在没有密码情况下,是无法从拆卸的硬件中读出硬盘中的任何数据的。

硬盘加密应该满足三个基本的要求:

  • 从系统设置,用户不必对其额外的管理要求,用户正确登陆后就可以想平常一样继续使用电脑
  • 加密的硬件必须上坚不可破的,未经授权的用户无法接触硬盘上的内容
  • 不影响电脑的速度和正常功能

在现实生活中,我们曾经看见过许多电脑被盗后或失误处理后,硬盘中有关机密的内容泄露的事件。苹果从操作系统上很早就开始寻找解决这一难题的答案,现在通过File Vault 2的机制,可以十分坚固地给电脑加密,即使电脑被盗,任何人也无法破解读出硬盘中的内容。这一安全措施可以在系统的设置中设置和激活。

讲座这一部分对此技术进行了概括介绍。首先,加密的钥匙是AES-128 + cipher stealing技术,如果将整个地球覆盖一米厚的电脑,将需要一千年的计算才能解密。因此该技术是十分坚固的。

这个复杂的钥匙在系统设置时,操作系统建议拷贝保存在另外一处(因为硬盘已加密,破密之前无法读取上数据),可以存放在苹果。从苹果获取钥匙可以通过自然语言提问回答的方式获取。一般用户不需要取加密钥匙,只有在忘记登陆密码时才会要求从苹果取出File Vault 2的钥匙。

File Vault 2的钥匙是储存在系统启动区中,如果用户登陆成功,这个钥匙自动被取出,之后硬盘自动解密。因此对用户来说,正常使用不需要采取任何额外的步骤或程序。

硬盘经过File Vaults 2加密之后,从安全考量来看有两大好处,第一,如果没有正确的登陆秘密,无法读取用户区的任何数据;第二,拆卸下来的硬盘无法通过其它方式读取上面的任何数据。实际上File Value 2还有第三个好处,秘密钥匙可以迅速被删除,这样在紧急情况下,可以快速销毁硬盘上的内容。这在iOS中已经成功运用。

710 Privacy Support in iOS and OS X

首先第一内容要点是介绍UDID(Unique Device Identification设备唯一身份号),这在iPhone OS 2.0就推出这一概念,比如每一台iPhone都有自己的特殊设备唯一身份号(这在iTunes中iPhone的Summary中可以找到)。这个身份号是属于app的。

iOS 6在此基础上衍生了数个新的身份号ID。第一个是Vendor Identification,这是软件开发商的唯一身份号,如果手机中装了数个该开发商的软件,这一身份号是唯一的。iOS有新的API产生这一身份号,iOS并对其进行管理。

第二个身份号是Advertising Identification,用于iAd。

这几个不同的身份号都有不同的用途。相应有不同的新API产生身份号。苹果建议iOS的开发者用新的API来产生和代替过去的UDID。

第二个内容是数据孤岛化(Data Isolation),即新的操作系统要求软件对自己的数据进行管理,软件不能接触系统和其它软件的数据。这就是新的操作系统沙场概念(sandbox),这是山狮操作系统的最大变化。软件之间的数据交流是通过操作系统来协调的。如果软件要求系统资源或软件外的数据,有可能会被系统拒绝。

数据孤岛化过去只是限于Location,新的扩展到:Contacts, Calendars, Reminders, Photos。这些新的支持自动用于现有的软件,因此不需要重新编译或重新申请。现有软件使用到系统或软件外资源时,操作系统自动提示用户是否允许。但是新的软件应该利用新的支持API,考虑到有可能被拒绝的情况,从而提供更好的服务和保护隐私。

接着讲座介绍了一些新的有关隐私的用户界面,在系统设置上,可以看到和控制系统资源所支持的软件,这样用户可以从系统设置上来控制软件。另一方面,如果软件中有获取系统资源的请求,操作系统会提示用户界面,让用户控制是否可以得到资源。这种用户界面的信息提示内容可以通过新的API在软件中设置,也可以国际多语言化。

最后介绍了编程中有关安全隐私的考量和技巧。

711 Power Management

本讲座介绍苹果的电脑电源管理以及相关的API。

首先介绍如何从程序上防止电脑自动进入睡眠状态,即Power Assersion。第一个是使用IOPMAssertionID变量为kIOPMAssersionNULID,然后通过IOPMAssiontionCreateWithName(...)来设定,最后通过IOPMAssertionRlease(...)释放变量。

在Terminal上可以通过pmset -g assersions指令了解Assersion状态和相关设定的程序。

第二个概念是DarkWake,这是操作系统的功能。苹果电脑有三个状态:

  • FullWake(全醒):声音、图像、硬盘、网络和CPU都处于活跃状态
  • DarkWake(黑醒):声音和图像处于睡眠状态,其它仍保持活跃状态
  • Sleep(睡眠):全部处于睡眠状态
DarkWake实际上从OS 10.6就开始引入,但在10.8山狮所支持的范围则更为广泛。

接着介绍了终端上使用的Debugging工具:pmset -g log,这一指令可列出睡眠和醒的程序和许多有关asserions的信息。讲座介绍了几个例子。

讲座的后半部分介绍了如何设计有效利用能源的软件。

能源的基本概念:消耗的能源=电力X时间,比如100W X 2h = 200Wh。

因此用电的大小只是一个方面,用电的时间也是一个非常重要的因素。即使用电很少,但是老是处于运行和醒的状态,从长时间来说,仍然可消耗很多能源。

为什么软件需要考虑到有效地使用能源呢?主要是为用户着想:节省电池,减少热量,避免风扇的噪音。

讲座以微波炉作为例子说明,如果只是加热食品,虽然用电很大,但是加热使用的时间都是很短的,比如1500W用6分钟,而微波炉上的显示时间是一个附加的功能,实际上与加热没有多大关系,虽然显示时间所用电很小,一般3W左右,但是一天24小时都亮着,一天用电时间为1440分钟,实际上也消耗了不少能源。讲演者以此列说明,设计软件不必考虑增加那些看起来虽然有用,但是实际上与软件主要目的无关的功能。

设计省能源软件的技巧:
  • 完全停止
  • 非常有效
  • 关灯!
讲座就上面三点举例进行了说明,并且介绍了一些工具。

712 Asynchronous Design Patterns with Blocks, GCD and XPC

Blocks, GCD and XPC是苹果软件平台的三个非常有效的工具,掌握这些技术可以编写非常有效、充分利用硬件,并且加强软件安全性。

首先介绍了Block,这是一种类似Function Pointer Type的技术。通过Block来定义一段程序块。这可以大大简化callback语法的定义,用一个变量来定义一块程序,并可以通过这段程序来改变变量。

Block最为常用的地方:

  • Completion 完成块,在完成某一操作后,定义一块程序进行完成之后的相关处理
  • Comparison 比较,可以通过一段程序来进行与之相关的比较
  • Enumeration 循环枚举,在枚举循环中,对循环元用动态程序进行相关的处理
讲座就上面几个最为常用的进行了简单的举例说明。

GCD(Grand Central Dispatch),这是苹果的多线处理平台,通过GDC可以创建新的处理线(thread),GDC根据CPU自动进行多线排队管理和多线并行处理。GDC是建立在Blocks的基础之上的。

GDC提供许多API。讲座就一些基本的API进行了举例说明,有关GDC的详细内容,上期WWDC的讲座有详细讲演。

讲座推荐利用GDC可以实现Call-Callback Pattern,比如下载图像,可以在call下载图像时,用displath_async(dispatch_get_main_queue(), ^{...})来分支另外一分步处理线来处理下载的图像。

XPC是我第一次从WWDC中听到的技术。这是设计软件在不同Processes之间进行交流的技术。XPC可以说是外部的一个服务或运行程序,XPC提供了一种简单的界面,通过名字发现XPC服务,可以向XPC发送或接受分步的信息,还可以通过block排队方式来接受回答。

这是一种新的分离性软件多处理技术,根据新的操作系统,每个处理都有自己的运行空间(sandbox),不同的处理可以有不同的空间,从而简化和加强软件的安全性。

讲座举例了在XPC中如何进行Call-Callback Pattern。

介绍上面三个基本内容之后,讲座进一步深入地分析了它们与Object-C之间的关系。

首先是Objective-C与Block之间的关系。这主要是从reference count方面来分析Block以及Objective-C的Object是如何创建的和如何消失的。Block是在内存的stack上创建的,但是在function call是,可以拷贝到heap上。讲座以一个例子:

- (void) performAsyncWOrkWithCallback:(id)obj onQueue:(dispatch_queue_t) q {...}

通过stack和heap图示说明了错误和正确使用block q的范例。

然后接着进一步深入分析了Objetive-C中的GCD和XPC。在Objective-C中,GCD和XPC的objects都是Objective-C的objects!

Objective-C的新技术ARC也可以适用于GCD和XPC变量,新创建的相应变量无需考量到释放的问题,因此程序的编写更为简洁。

但是Block是一程序块,内部的变量是如何进行保持和释放管理的呢?讲座就Objective-C与ARC进行了一些深入和特别的说明介绍,这一部分用一实例进行了说明,这里不详细解释了,但是学习和掌握这一技术对写好的程序有很大的帮助,今后需要反复学习这段内容。

接着介绍了异步设计技术(Asynchronous Design Pattern)。采用异步技术的最大优点是能防止锁死用户界面,即让用户界面能够迅速回应用户的请求。但是如何在编码中实现异步,需要很好地理解和掌握正确的技巧。本讲座介绍了基本的技巧和避免常见的错误。

第一是不要阻碍main thread;第二是创建背景thread;第三是不要阻碍太多的背景threads;第四是正确回到Main Runloop;第五是One Queue per Sybsystem,将app分成数个子系统,每个子系统有自己的分布排队;第六是通过读写方式增进app的性能;第七是将控制和数据流分开;第八是更新异步的状态;第九是采用XPC技术将Process从app中分离出去,这样可以很好地避免app出现崩溃,因为XPC的crash不会影响到app。讲座有详细的例子说明。

714 Protecting the User's Data

这是一个非常有意思的讲演,该讲演通过一个简单的网络软件和三个实例示范来介绍如何保护用户的数据。苹果已经在整个操作系统上提供了非常严密的安全体系,并在软件开发方面提供了许多安全平台。但这只是一个方面,作为软件App的设计者,如何考虑到保护用户的数据,也是一个十分重要的方面,这也是苹果WWDC软件开发者大会与广大软件开发者交流和传授知识的一个重点。

讲座以一个用户和服务通过网络交流照片App来进行讲解。服务站是网上提高照片服务的web service,app是用户端的软件,即典型的web service and client的结构。

首先,实例软件采用一般的http网际交流协议来传递用户的登陆名和密码,用户验证后用户可以上传和下载照片。这是一种典型的网上服务案例。

这种方式在公共场所或免费无线Wifi服务环境下,很容易被有恶意的窃听者截获。讲演者说,虽然这是一个非常简单的照片分享软件,但不幸的是,许多用户都使用同一密码,结果暗处的偷窃者会将利用这一信息攻击用户其它更为隐私或银行帐户。

在演示中,一位扮演偷窃者成功地截获了用户名、密码和照片。

用户是对苹果软件耻有充分信任的,因此这一例子说明了软件安全性的重要性。作为软件开发者,应该考虑到如果保护在网络传输中的安全性。

讲演接着介绍了如何加强苹果软件安全性的基本技术,对该软件进行了改进。将NSURLAutehticationMethodHTTPBasic改为NSURLAuthenticationMethodHTTPDigest。这样可以保证在网络传输过程中,所有的数据都进行了加密和验证,这些都采用的网络中的安全性Encryption和authentication的最新技术。讲座就这一点进行了比较详细地介绍,比如TLS的传输安全技术,这种技术可以提高数据在传输过程中的安全性和防止被偷窃和修改的企图。

经过这种修改之后,扮演偷窃的讲演者在重复的数据传输演示中无法获取任何信息。

安全考量的另一方面是存放在iPhone上的数据的安全性。在现实生活中,丢失移动设备是经常出现的问题。如果手机丢失或被窃,恶意者有可能从设备上采取各种手段读取设备上的数据,如越狱或拆卸存储部件来读取。

讲演者提出,用户的任何隐私数据,尤其是登陆名、密码、照片、个人资料等都应该在软件设计过程中考虑到如何进行保护。

讲演者介绍了苹果平台下的数据安全技术和API,如何对文件、数据库、数据等进行保护。在苹果设备上,所有的数据在开锁的状况下,数据可以通过正常的API进行读取,但是进行加密处理的数据在设备关闭或上锁情况下,是无法读取的。讲演介绍了如何使用这些API以保证设备在关机和上锁情况下保证数据安全性,并提出将用户关键数据采用苹果的Keychain技术来进行存储。Keychain是苹果一十分安全性的技术,广泛应用在苹果电脑和移动设备上。

讲演对设备的安全性也进行了未加安全措施和加了安全措施的前后比较示范。

参考


No comments:

Post a Comment