app之间的跳转

app之间的跳转很多场景都用到, 本文主要讲解跳转的两种方式,以及推荐一个好用的第三方平台.

URL Scheme方式

具体操作步骤如下:

在工程或者info.plist里面直接配置app的 URL Schemes 用来让别的app跳转到自己, 配置方式有两种, 如下图所示

1.在工程里面配置

图片

2.在info.plist里面配置

图片

跳转方法

iOS10以前

UIApplication.shared.openURL(url)

iOS10以后

//不带options

1
2
3
4
5
6
7
8
UIApplication.shared.open(url) { (flag) in
         print(flag)
    }


UIApplication.shared.open(url, options:[:] ) { (flag) in
         print(flag)
    }

//带options

1
2
3
 UIApplication.shared.open(url,options: [UIApplicationOpenURLOptionUniversalLinksOnly: false] , completionHandler: { (flag) in
                print(flag)
            })

options目前只有一个key那就是UIApplicationOpenURLOptionUniversalLinksOnly, 其默认只为false. 解释如下

  • true: 安装了目标app, 则跳转目标app, 没有安装不能跳转,并在回调中返回false

  • false: 安装了目标app就跳转到目标app, 没有安装目标app,他能打开safari跳转到对应的网站

3.谨慎使用 UIApplication.shared.canOpenURL(url)

canOpenURL只有在info.plist里面注册过的 URL Schemes 才能打开, 并且info.plist里面最多只能注册50个, 一般够用. (但是像微信这种大型应用, 在别的app跳转进来之后再返回源app是都要要通过源app的URL Scheme回到源应用, 如果没有三方应用都要在微信里注册,那肯定是不现实的, 也肯定不够用. 当然另有解决方法, 下面会谈到)

注意: openUrl 方法没有50个的数量限制

使用方法

像微信这种大型应用, 在别的app跳转进来之后再返回源app是都要要通过源app的URL Scheme回到源应用, 如果没有三方应用都要在微信里注册,那肯定是不现实的, 也肯定不够用. 解决办法很简单: 跳转时将源app的URL Scheme传递给微信

首先了解一下URL的组成部分

1
2
3
4
5
6
	let url = URL(string: "weixin://dl/moments.com?title=hello&content=world&urlscheme=myScheme&name=bundleName")
    print(url?.scheme)
    print(url?.host)
    print(url?.pathExtension)
    print(url?.query)
    print(url?.lastPathComponent)

结果如下:

1
2
3
4
5
	Optional("weixin")
	Optional("dl")
	Optional("com")
	Optional("title=hello&content=world&urlscheme=myScheme&name=bundleName")
	Optional("moments.com")

从源app跳转到目标app时, url是传递参数的媒介

代码入下:

1.源app代码

1
2
3
4
5
6
7
8
9
10
11
12
 let bundleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
 
  //跳转第三方时将自己的Scheme传递过去, 不建议使用BundleIdentifier, 因为不安全, 可以自己定义一个唯一标示即可
 let myScheme = "AppOneScheme"
 
  //url的格式如下: 目标app的scheme://自己app的scheme/自己app名称
  let url = URL(string: "com.heron.Base://\(myScheme)/\(bundleName)")!
  
 UIApplication.shared.open(url,options: [UIApplicationOpenURLOptionUniversalLinksOnly: false] , completionHandler: { (flag) in
 //成功和失败都会走这个回调, flag是bool指
                print(flag)
  })

优化建议:

  • 如果跳转第三方时将自己的Scheme传递过去, 不建议使用BundleIdentifier, 因为不安全, 可以自己定义一个唯一标示即可

  • 拼接URL的规则推荐: com.heron.Base://baseapp/function?title=hello&content=world&urlscheme=AppOneScheme&name=AppOne

    • 上面的三种颜色分别对应一个部分
    • 红色:目标app的scheme
    • 蓝色:参数配置, 目标app通过这个来判断自己要做什么.
    • 绿色: 参数, 参数里面包含了标题, 内容, 源app的scheme(方便从目标app返回源app), 源app的名称(方便第三方应用在返回源app的时候给用户提示要返回到哪个app)

2.目标app的代码

目标app接收到跳转参数的地方在在AppDelegate中, 方法如下:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    //通过分解url来获取信息
    let messages = url.query?.components(separatedBy: "&")
    //标题
    let titleComponent = messages![0].components(separatedBy: "=").last
    //内容
     let contentComponent = messages![1].components(separatedBy: "=").last
    //源app URL Scheme
     let schemeComponent = messages![2].components(separatedBy: "=").last
    //源app 名称
    let nameComponent = messages![3].components(separatedBy: "=").last
    let vc = UIAlertController(title: titleComponent, message: contentComponent, preferredStyle: .alert)
    //返回源app?
    let back = UIAlertAction(title: "返回" + nameComponent!, style: .default) { (_) in
        
        let backUrl = URL(string: schemeComponent! + "://")!
        app.open(backUrl, options: [:], completionHandler: { (flag) in
            print(flag)
        })
    }
    let bundleName = Bundle.main.infoDictionary!["CFBundleName"] as! String
    //留在当前app
    let stay = UIAlertAction(title: "留在" + bundleName, style: .default) { (_) in
        
    }
    vc.addAction(back)
    vc.addAction(stay)
    app.keyWindow?.rootViewController?.present(vc, animated: true, completion: nil)
    return true
}

Universal Links方式

虽然在微信内部开网页会禁止所有的Scheme,但是iOS 9.0新增加了一项功能是Universal Links,使用这个功能可以使我们的App通过HTTP链接来启动App。

1.如果安装过App,不管在微信里面http链接还是在Safari浏览器,还是其他第三方浏览器,都可以打开App。

2.如果没有安装过App,就会打开网页。

具体的使用方法此文章写的十分详细,请查阅

推荐使用的第三个 魔窗

能够快速跳转, 定位页面, 支持universalLink等, 功能十分强大, 具体使用方法参考官网说明.