Update
2016-08-12: 在Github的Demo上增加Mac自定義Url Scheme,可以在Safari上輸入特定協議頭打開應用,並傳遞參數)
簡介
我們接下來將要實現應用程序之間的跳轉及通訊。現在手機開發中,很多時候我們都需要在應用內跳轉到別的應用中,這個是很常見的。
為此,我們首先需要准備兩個項目ApplicationOne和ApplicationTwo。(下載項目源碼)
應用間的簡單跳轉
在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/
本文版權歸作者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作!
