Swift - 通用链接(Universal Links)的使用详解(链接打开app)
一、通用链接介绍
1,通用链接与URL Scheme的区别
- 在 iOS9 之前,对于从各种从浏览器(Safari、UIWebView、WKWebView)中唤醒(启动)App 的需求,我们通常只能使用 URL Scheme。我之前也写过不少相关文章(点击查看)。
- 使用时我们首先要在 App 中注册 Scheme,然后网页中使用特定格式的链接,比如:<a href="hangge://www.hangge.com/app">打开APP</a>
- 而且每当我们要唤醒某个 App 时,还需要提前判断系统中是否安装了能够响应此 Scheme 的 App。否则处理不好常常会造成空白页或者跳转不了问题。
- 如果设备中有这个 App,那么打开前还会弹出个提示框询问是否要使用该 App 打开。
- 通用链其实就是一条普通的 http 链接。比如:https://www.hangge.com/app
- 如果我们的 App 支持通用链接,且设备中安装了该 App。那么当用户点击链接,就会直接进入到我们的 App 中了。
- 如果设备中没有支持这个链接的 App,那么点击链接后还是继续进到链接对应的 html 页面中。完全不需要我们人为判断是去打开 App,还是打开 Web 页面。
- 同时通过通用链接进入到 App 这个过程是不会弹出提示框的,整个流程十分顺畅。(如果手机安装了“知乎”,我们随便在浏览器中搜索一个知乎页面点击就可以看到效果。)
2,通用链接的优点
- 唯一性:不像自定义的 scheme,因为它使用标准的 http/https 链接到你的 web 站点,所以它不会被其它的 app 所声明。另外,Custom URL scheme 因为是自定义的协议,所以在没有安装 app 的情况下是无法直接打开的,而 universal links 本身是一个 HTTP/HTTPS 链接,所以有更好的兼容性。
- 安全:当用户的手机上安装了你的 app,那么 iOS 将去你的网站上去下载你上传上去的说明文件(这个说明文件声明了你的 app 可以打开哪些类型的 http 链接)。因为只有你自己才能上传文件到你网站的根目录,所以你的网站和你的 app 之间的关联是安全的。
- 可变:当用户手机上没有安装你的 app 的时候,Universal Links 也能够工作。如果你愿意,在没有安装你的 app 的时候,用户点击链接,会在 safari 中展示你网站的内容。
- 简单:一个 URL 链接,可以同时作用于网站和 app。
- 私有:其它 app 可以在不需要知道你的 app 是否安装了的情况下和你的 app 相互通信。
3,使用条件
- 有一个注册的域名
- 通过 SSL 访问域名(即使用 HTTPS 请求)
- 支持上传一个 JSON 文件到你的域名
- 至少 iOS 9 beta 2 版本。
- 至少 Xcode 7 beta 2。
二、相关配置
1,创建apple-app-site-association文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{
"applinks"
: {
"apps"
: [],
"details"
: [
{
"appID"
:
"MNARL96.com.hangge.demo"
,
"paths"
: [
"NOT /blog/support/*"
,
"/blog/*"
,
"/app/"
]
},
{
"appID"
:
"ABCDEFG12.com.hangge.demo"
,
"paths"
: [
"*"
]
}
]
}
}
|
- appID:由 TeamID.BundleId 组成。TeamID 可以从苹果开发账号页面中查看,BundleId 就是 Bundle Identifier,可以直接在工程里查看。
- paths:其设定一个我们的 App 支持的路径列表,只有这些指定的路径的链接,才能被 App 所处理。
(注意:path 是大小写敏感。* 通配符表示任意路径。NOT 关键字表示禁止的部分。数组内优先级从左到右逐渐降低。)
2,上传apple-app-site-association文件
1
|
md .well-known
|
- 在 iOS9.3 以前,该文件需要上传到网站的根目录下。
- 从 iOS9.3 起,苹果更改了通用链接的请求文件的路径,变成了在 .well-known 目录下。
(2)如果使用的是 IIS 服务器,为了让 apple-app-site-association 文件能被访问到,需要 MIME 类型配置。否则会报 404 错误。
- 文件扩展名:.
- MIME类型:application/json
3,Xcode相关配置
三、测试使用
1,使用备忘录测试
2,使用邮件测试
3,使用浏览器测试
前面的样例中,我跳转前跳转后都是在 hangge.com 这个域名下,自然不会进入 App。如果我是使用百度搜索到 hangge.com 的页面,然后点击链接,由于前后域不一样则会自动进入到 App 中。
四、在App中添加相关的响应处理
在AppDelegate中实现相关的响应方法
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
30
31
32
33
34
35
36
37
38
39
|
import
UIKit
@UIApplicationMain
class
AppDelegate
:
UIResponder
,
UIApplicationDelegate
{
var
window:
UIWindow
?
func
application(_ application:
UIApplication
,
continue
userActivity:
NSUserActivity
,
restorationHandler:
@escaping
([
Any
]?) ->
Void
) ->
Bool
{
//判断是从Universal Links进来的链接
if
userActivity.activityType ==
NSUserActivityTypeBrowsingWeb
{
let
webpageURL = userActivity.webpageURL
print
(
"点击的链接是:\(webpageURL)"
)
//进行后续的处理
//......
}
return
true
}
func
application(_ application:
UIApplication
, didFinishLaunchingWithOptions
launchOptions: [
UIApplicationLaunchOptionsKey
:
Any
]?) ->
Bool
{
return
true
}
func
applicationWillResignActive(_ application:
UIApplication
) {
}
func
applicationDidEnterBackground(_ application:
UIApplication
) {
}
func
applicationWillEnterForeground(_ application:
UIApplication
) {
}
func
applicationDidBecomeActive(_ application:
UIApplication
) {
}
func
applicationWillTerminate(_ application:
UIApplication
) {
}
}
|
原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1554.html
wushenhaoyu: 救命恩人啊
xuhang513: 这篇文章代码格式显示感觉有问题,看着好难受。还是json香
governor_0708: 你的
TRexMan: good
_Jxyz: 打开怎么没有弹出app