iOS-進程間通信-URL Schema


轉載自: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中添加函數:
[cpp]  view plain copy
 
  1. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  
  2. {  
  3.     if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {  
  4.         //xx  
  5.     }  
  6.     return YES;  
  7. }  

此函數便是URL Call的處理函數了,每當其他應用通過URL打開此應用時,該函數都會被調用。
參數url是傳進的url,sourceApplication是呼叫應用的bundle identifier,通過此參數,應用可以對呼叫的應用進行過濾。annotation是呼叫過程中可以附加的額外參數,這里沒有用到。
 
4:當另一個應用想調用我的應用時,只需拼接好URL,,然后打開URL即可,十分方便:
 
[cpp]  view plain copy
 
  1. NSURL* url = [NSURL URLWithString: @"lifengzhong://1,545166"];  
  2. [[UIApplication sharedApplication] openURL: url];  

這里的1,545166是我自定義的參數,你可以根據自己需要定義URL的格式。
 
 
 
 
通過上面介紹的URL Schema方法,算是實現了某種程度的進程間通信,但這種方式的一個缺點是,同一時刻還是只能有一個進程在前台,主動呼叫的應用在調用成功后必須進入后台,所以能傳遞的只有URL中所帶的參數或annotation中所帶的參數。調用的過程中會出現應用之間的切換,用戶體驗不好。但聊勝於無,蘋果好歹還是留了這么一個口子,感恩吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM