iOS開發-應用之間的跳轉及通訊

Update

2016-08-12: 在Github的Demo上增長Mac自定義Url Scheme,能夠在Safari上輸入特定協議頭打開應用,並傳遞參數)html

簡介

咱們接下來將要實現應用程序之間的跳轉及通信。如今手機開發中,不少時候咱們都須要在應用內跳轉到別的應用中,這個是很常見的。ios

爲此,咱們首先須要準備兩個項目ApplicationOneApplicationTwo。(下載項目源碼)git

應用間的簡單跳轉

ApplicationOne應用跳轉到ApplicationTwo應用github

咱們須要先建立在ApplicationTwo項目裏設置URL Types協議,這裏我設置爲GC,以下所示swift

ApplicationOne應用添加事件數組

@IBAction func openApplication() {
    // 1
    let urlSting = "GC://"
    // 2
    if let url = NSURL(string: urlSting) {
        // 3
        let application = UIApplication.sharedApplication()
        // 4
        if application.canOpenURL(url) {
        // 5
            application.openURL(url)
        }
    }
}
  • 1: 建立urlString字符串
  • 2: 利用urlString字符串建立真正的url,並檢測url是否有用
  • 3: 得到UIApplication實例
  • 4: 檢測是否可以打開此url
  • 5: 打開url,在這裏即爲咱們的應用跳轉

須要注意的是,協議開頭必需要是完整的,即爲****://app

應用間的傳值跳轉

實現方式很簡單,咱們只須要在url協議裏補充參數就能夠了,好比我如今傳一個字符串GarveyCalvinurl

如今事件的代碼是這樣的code

@IBAction func openApplication() {
    let urlSting = "GC://GarveyCalvin"
    if let url = NSURL(string: urlSting) {
        let application = UIApplication.sharedApplication()
        if application.canOpenURL(url) {
            application.openURL(url)
        }
    }
}

你能夠在協議後補充n個參數,只須要雙方都能解析獲得就行,具體的協議規則自行商議htm

而後在ApplicationTwo應用的AppDelegate文件,咱們須要實現以下方法去接收其它應用傳進來的參數

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
let newUrlHost: NSString = url.absoluteString ?? ""
let range = newUrlHost.rangeOfString("//")
    
if range.length != NSNotFound {
    let params = newUrlHost.substringFromIndex(range.length)
    UIAlertView(title: "params is \(params)", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
} else {
    UIAlertView(title: "haven't params", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
}
    
return false
}

應用間的反向跳轉

咱們要實現的是,從ApplicationOne跳轉到ApplicationTwo應用,再從ApplicationTwo跳轉回ApplicationOne應用裏。

具體的實現步驟以下:

  • 咱們須要在ApplicationOne項目中添加URL Types協議,具體看文章的上方,咱們剛剛纔作過。
  • 爲了實現應用間的反轉跳轉,咱們必須讓ApplicationTwo應用知道是從哪裏跳轉的,所以咱們能夠在ApplicationOneurl跳轉事件把自身的URL Types協議傳遞給ApplicationTwo應用。像這樣GC://GarveyCalvin&GCFirst
  • 這樣咱們就能在ApplicationTwo應用的application(_:openURL: sourceApplication:annotation:)方法中獲取到ApplicationOne的協議,咱們保存它,等到須要反向跳轉的時候就可使用它來進行跳轉了。

適配iOS9

有一位git友提醒了我,在iOS9下運行報如下錯誤(issue):

-canOpenURL: failed for URL: "GC://GarveyCalvin&GCFirst" - error: "This app is not allowed to query for scheme GC"

這是由於在iOS9中,蘋果作了嚴格的限制,咱們想要調起這個url,必需要手動添加白名單,這樣蘋果纔會"放行"。咱們須要在info.plist裏添加

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>GC</string>
</array>

LSApplicationQueriesSchemes是一個數組,用於存放url白名單

Download

大家能夠經過這個Git的連接去下載本文章所使用的完整項目源碼。(ApplicationJumpAndSentValue).

參考文章


iOS開發拓展篇—應用之間的跳轉和數據傳遞

iOS應用程序開發之應用間的跳轉

在Mac和iOS中註冊自定義的URL Scheme



博文做者:GarveyCalvin

博文出處:http://www.cnblogs.com/GarveyCalvin/ 本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索