iOS 的設計思路是原則上禁止不同的應用程序之間相互訪問彼此的數據。雖然對於像我這樣的桌面應用開發人員而言,不能訪問程序以外的數據是不能想象的。但是從安全角度來說不失爲一個有效的策略。不過凡事總有例外,所以喬布斯還是爲程序間通訊開放了幾個接口。
URL Scheme
iOS 上的應用程序可以通過向其它應用程序發送一個URL 格式的字符串來向其發送數據。這個特性通常用於在應用程序中啓動另外一個應用程序來打開一種特定格式的數據。例如:你的程序可以向Map 發送一個URL ,要求其打開指定的地圖;或者在郵件程序裏向Adobe Reader 發送一個URL ,要求其打開指定的PDF 文件。
iOS 預定義瞭如下幾種URL Scheme 。
Mail: mailto:[email protected]
Tel: tel:1-408-555-5555
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
你也可以自定義URL Scheme 。需要注意的是:在多個應用程序註冊了同一種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:@"URL Scheme"];
[[UIApplication sharedApplication ] openURL:myURL];
(3) 接收 URL Scheme
URL Schemes 由系統發送給 application delegate ,而 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 部分。
本文轉自:http://blog.csdn.net/flower4wine/article/details/6454957