Swift - URL schemes的使用样例(如:在Safari中打开App)
(本文代码已升级至Swift4)
(2)同时由于 iOS 9 系统策略更新,限制了 http 协议的访问。我们还需在“Info.plist”(发起跳转的那个应用)中将要使用的 URL Schemes 列为白名单,才可正常检查其他应用是否安装。
一、基本介绍
1,URL scheme 的作用
我们可以将应用“绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用,同时跳转时也可以传递参数。- 比如,可以在网页上添加一个链接,点击这个链接后会自动打开对应的APP上。
- 或者从一个 APP 跳转到另一个 APP,用的也是 URL scheme。比如微博或者微信的登录或者分享之类的。在选择登录时就会跳到微信或者微博里,等登录了以后就可以跳转回去。
下面通过样例演示 URL schemes 的使用。

(2)跳转代码
(3)点击按钮,可以看到跳转成功了。
2,URL scheme 的配置
(1)在“项目” -> “info” -> “URL Types”中,新增一个URL Schemes。

(2)其实只要通过上面的配置就可以打开应用了。但有时我们还要传递参数进来,然后程序根据参数调用不同的功能或打开不同的页面。
我们可在 AppDelegate.swift 中的如下方法里获取参数,并做相应的处理。这里直接将参数打印出来:
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if url.host == nil {
return true;
}
//获取来源应用的Identifier
print("来源App:\(options[UIApplicationOpenURLOptionsKey.sourceApplication]!)")
//获取url以及参数
let urlString = url.absoluteString
let queryArray = urlString.components(separatedBy: "/")
print(urlString)
let alertController = UIAlertController(title: "参数如下",
message: "\(queryArray[2]) \(queryArray[3])",
preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
alertController.addAction(cancelAction)
self.window!.rootViewController!.present(alertController, animated: true,
completion: nil)
return true
}
二、从Safari中打开并跳转到这个App
1,跳转的实现
假设我们有如下的html页面:
<html>
<title>Deep Link测试</title>
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<body>
<a href="hangge://article/A">hangge://article/A</a>
<P>
<a href="hangge://article/B">hangge://article/B</a>
<P>
<a href="hangge://article/C">hangge://article/C</a>
<P>
</body>
</html>
使用 Safari 打开这个页面,点击链接。可以看到跳转成功了。
2,跳转前判断设备是否有这个App
下面通过 js 来进行跳转,这样当手机未安装该应用时,浏览器也会进行提示并跳转到 App Store 去下载。
<html>
<title>Deep Link测试</title>
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<script type="text/javascript">
function startMyApp(url)
{
document.location = url;
setTimeout( function()
{
if( confirm( '您还未安装这个应用,是否现在去AppStore下载该应用?'))
{
document.location = 'https://itunes.apple.com/cn/app/qq-you-xiang/id473225145?mt=8';
}
}, 500);
}
</script>
<body>
<a href="#" onclick="startMyApp('hangge://article/A')">hangge://article/A</a>
<P>
<a href="#" onclick="startMyApp('hangge://article/B')">hangge://article/B</a>
<P>
<a href="#" onclick="startMyApp('hangge://article/C')">hangge://article/C</a>
<P>
</body>
</html>
三、从另一个APP中打开并跳转到这个App
1,跳转的实现
我们另外创建一个新的应用,在页面上添加一个跳转按钮,点击后通过 openURL 方法就可以打开前面那个APP。
(1)由于iOS9的安全策略的改变,如果直接通过openURL打开APP的话,会出现如下错误:
canOpenURL: failed for URL: "hangge://article/C" - error: "This app is not allowed to query for scheme hangge"
我们需要去 Info.plist 里面建立一个叫 LSApplicationQueriesSchemes 的 Array,把允许的 URL Scheme 添加进去:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>hangge</string>
</array>
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button:UIButton = UIButton(type:.system)
button.frame = CGRect(x:10, y:150, width:150, height:30)
button.setTitle("打开另一个APP", for:.normal)
button.addTarget(self, action:#selector(ViewController.tapped), for:.touchUpInside)
self.view.addSubview(button);
}
@objc func tapped(){
let urlString = "hangge://article/C"
let url = URL(string: urlString)
UIApplication.shared.open(url!)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
2,跳转前判断设备是否有这个App
(1)如果是从另一个 App 跳转过来的话,我们可以先使用 canOpenURL() 方法判断应用是否已在本机安装,没有的话打开对应的 App Store 页面。import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button:UIButton = UIButton(type:.system)
button.frame = CGRect(x:10, y:150, width:150, height:30)
button.setTitle("打开另一个APP", for: .normal)
button.addTarget(self,action:#selector(ViewController.tapped),for:.touchUpInside)
self.view.addSubview(button);
}
@objc func tapped(){
let urlString = "hangge://article/C"
let url = URL(string: urlString)
if UIApplication.shared.canOpenURL(url!) {
UIApplication.shared.open(url!)
}else{
let appString = "https://itunes.apple.com/cn/app/qq-you-xiang/id473225145?mt=8"
let appUrl = URL(string: appString)
UIApplication.shared.open(appUrl!)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
(2)同时由于 iOS 9 系统策略更新,限制了 http 协议的访问。我们还需在“Info.plist”(发起跳转的那个应用)中将要使用的 URL Schemes 列为白名单,才可正常检查其他应用是否安装。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>hangge</string>
</array>

航哥, 请问我的func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject])这个函数执行不进去。
航哥, 请问你这个跳转的URL Schemes “hangge” 是怎么得到的?
航哥能发下demo么 看起来还是有点不理解
真是学到很多东西啊,感谢航哥