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/ 本文版权归做者和博客园共有,欢迎转载,但须保留此段声明,并给出原文连接,谢谢合做!

相关文章
相关标签/搜索