轉載自:http://blog.csdn.net/lifengzhong/article/details/7739539
受限與iOS系統的運行機制,絕大多數情況下一個應用在進入后台后會馬上進入suspend或terminate狀態,也就是說不能執行代碼,iOS中也沒有類似WIndows中Service的概念,但存在某些例外:
1:有某些重要的任務,例如保存用戶數據,網絡下載等,可以申請一段時間的background運行時間,但時間段內能進行的操作比較有限,且有時間限制,長度為600秒左右。
2:某些特定類型的應用,具體包括:
- VoIP應用
- 定位類應用
- 新聞類應用
- 音樂類應用
這些類型的應用可以獲得沒有時間限制的background運行。但並不是你隨便聲明一下應用類型就可以了,如果掛羊頭賣狗肉,是無法通過App Store審核的。
既然大多數情況下系統中只有一個活動的應用在運行,加上iOS內不同應用由於沙箱運行導致的高度隔離,我們熟悉的那些IPC方法,例如管道、郵槽、共享內存、Socket等,往往會顯得比較無力了,針對此種情況,蘋果也提供了對應的解決方案,也就是我們今天將要介紹的:URL Schema
簡單來說,URL Schema就是iOS內的應用調用協議,應用A可以聲明自定義的調用協議,就如http/https那樣,當另一個應用B打算在應用內打開應用A時,可以打開使用A自定義的協議開頭的URL來打開A,除了協議頭,URL中還可以附加其他參數,具體過程參見下圖:

這個就是Safari與Alocola之間的交互過程。
接下來介紹一下自定義URL Schema的過程。
1:創建Xcode項目
2:打開項目,在其中的info.plist中添加如下圖所示字段:

其中的"lifengzhong"便是我為此應用注冊的自定義協議名稱,其他應用如果想調用我的應用,只要打開形似:“lifengzhong://XXX”的URL便可以了。
3:在項目AppDelegate中添加函數:
- - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- {
- if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {
- //xx
- }
- return YES;
- }
此函數便是URL Call的處理函數了,每當其他應用通過URL打開此應用時,該函數都會被調用。
參數url是傳進的url,sourceApplication是呼叫應用的bundle identifier,通過此參數,應用可以對呼叫的應用進行過濾。annotation是呼叫過程中可以附加的額外參數,這里沒有用到。
4:當另一個應用想調用我的應用時,只需拼接好URL,,然后打開URL即可,十分方便:
- NSURL* url = [NSURL URLWithString: @"lifengzhong://1,545166"];
- [[UIApplication sharedApplication] openURL: url];
這里的1,545166是我自定義的參數,你可以根據自己需要定義URL的格式。
通過上面介紹的URL Schema方法,算是實現了某種程度的進程間通信,但這種方式的一個缺點是,同一時刻還是只能有一個進程在前台,主動呼叫的應用在調用成功后必須進入后台,所以能傳遞的只有URL中所帶的參數或annotation中所帶的參數。調用的過程中會出現應用之間的切換,用戶體驗不好。但聊勝於無,蘋果好歹還是留了這么一個口子,感恩吧。