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


Update

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

簡介

我們接下來將要實現應用程序之間的跳轉及通訊。現在手機開發中,很多時候我們都需要在應用內跳轉到別的應用中,這個是很常見的。

為此,我們首先需要准備兩個項目ApplicationOneApplicationTwo。(下載項目源碼)

應用間的簡單跳轉

ApplicationOne應用跳轉到ApplicationTwo應用

我們需要先創建在ApplicationTwo項目里設置URL Types協議,這里我設置為GC,如下所示

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,在這里即為我們的應用跳轉

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

應用間的傳值跳轉

實現方式很簡單,我們只需要在url協議里補充參數就可以了,比如我現在傳一個字符串GarveyCalvin

現在事件的代碼是這樣的

@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個參數,只需要雙方都能解析得到就行,具體的協議規則自行商議

然后在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應用知道是從哪里跳轉的,因此我們可以在ApplicationOne url跳轉事件把自身的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/

本文版權歸作者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作!


免責聲明!

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



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