转载出处:http://hi.baidu.com/sheiganpkdyn/item/7ef94532ce0ba8f3a884288f
iOS的设计思路是原则上禁止不同的应用程序之间相互访问彼此的数据。虽然对于像我这样的桌面应用开发人员而言,不能访问程序以外的数据是不能想象的。但是从安全角度来说不失为一个有效的策略。不过凡事总有例外,所以乔布斯还是为程序间通讯开放了几个接口。
URLScheme
iOS上的应用程序可以通过向其它应用程序发送一个URL格式的字符串来向其发送数据。这个特性通常用于在应用程序中启动另外一个应用程序来打开一种特定格式的数据。例如:你的程序可以向Map发送一个URL,要求其打开指定的地图;或者在邮件程序里向Adobe Reader发送一个URL,要求其打开指定的PDF文件。
iOS预定义了如下几种URL Scheme。
Mail:
Tel:
SMS: 1-408-555-1212
Map: http://maps.google.com/maps?q=cupertino
YouTube:http://www.youtube.com/watch?v=VIDEO_IDENTIFIER
iTunes:
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewAlbum?i=156093464&id=156093462&s=143441
你也可以自定义URLScheme。需要注意的是:在多个应用程序注册了同一种URL Scheme的时候,iOS系统程序的优先级高于第三方开发程序。但是如果一种URL Scheme的注册应用程序都是第三方开发的,那么这些程序的优先级关系是不确定的。
(1) 注册URL Scheme
在应用程序的Info.plist中添加CFBundleURLTypes项。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.acme.todolist</string>
<key>CFBundleURLScheme</key>
<array>
<string>todolist</string>
</array>
</dict>
</array>
(2) 发送 URL Scheme
NSURL *myURL = [NSURL URLWithString:@"URLScheme"];
[[UIApplicationsharedApplication] openURL:myURL];
(3) 接收 URL Scheme
URL Schemes由系统发送给applicationdelegate,而delegate通常应该实现如下几个代理函数:
l application:didFinishLaunchingWithOptions:
判断是否应该启动程序来处理传入的URL Scheme。这个函数只在程序从not running到running时被调用。如果程序在URL Scheme传入时处于Background或者Suspending状态,那么校验工作应该在下面两个代理函数中实现。
l application:openURL:sourceApplication:annotation
在4.2及之后版本的iOS中实现。
l application:handleOpenURL:
在4.1及之前版本的iOS中实现。
(4) 安全性
参考Secure Coding Guide中Validating Input部分。