前言
在iOS平台上,经常有这样的需求,当用户在操作的时候需要唤醒或者说跳转到另外一个App中进行操作。 这其中的类型又分为:
- App -> App
- 浏览器web页面 -> App
第一种类型十分常见,比如你在某宝上买东西,支付的时候跳转到支付宝进行支付,然后再回来。 本文想要着重说明的是第二种类型。 这个业务场景往往是公司官网或者是宣传页面,用户操作如参加活动之类的,然后跳转至App,如果未安装App则跳转至App Store。
iOS 9之前的做法
在App中定义一个URLScheme
,当web页面跳转至定义好的URLScheme
时,手机会自动唤醒App。此方法的详细操作很多朋友已经分享过,有兴趣的可以上网查找。 此方法简单也方便,但iOS 9之后,Safari不再支持通过js,iframe等来触发scheme跳转,并且在唤醒App之前会有一个Aler提示用户确认操作,以往通过超时机制跳转至下载页面的方法同样也失去了效果。同时安卓端由于生态比较混乱,支持的机制也不太完善。 不推荐此方法。
Universal Links
iOS 9 之后,Apple推出了 。 Universal Link较URLScheme更优。如:避免了自定义的Scheme与他人重复的尴尬情况,web端无需知道手机端是否安装了App,避免无法打开的情况,同样适用于App与App之间的唤醒。
Universal Link的流程如图:
在项目中开启Universal Link
首先,需要在项目中开启Universal Link,并在其中添加一个目标地址。注意,目标地址应该以applinks:
为开头。
注意:这个地址必须支持Https,并且这个地址不能与跳转之前所在页面在同一个域之下。如:我在 a.com下展示活动页面,此时用户点击操作以后,需要抛出我们事先设置好的此目标地址,活动页面与目标地址不要在同一个域之下。
设置 apple-app-site-association
我们需要准备一个json文件,并将其命名为apple-app-site-association
,不要在文件后面拼上.json的后缀,必须严格按照此名字命名。 apple-app-site-association 文件的格式为:
{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] }}复制代码
appID : 你的TeamID.App的BundleID
paths:定义你的路径,支持通配符 *
。如你的目标页面是b.com
,如上json的写法,当用户点击b.com/wwdc/news/
时将会触发唤醒App。
配置完 apple-app-site-association 文件之后,将此json文件上传到目标地址。如: https://b.com/apple-app-site-association
or https://b.com/.well-known/apple-app-site-association
此时你可以通过访问Aapple准备的 来尝试验证你的 apple-app-site-association 是否有效。
apple-app-site-association 文件的作用是,当iOS第一次启动App时,会从设置好的目标网站中 如:https://b.com/apple-app-site-association
事先下载好json文件,并且放置在系统层级管理。
AppDelegate中处理
从外部唤醒App,在AppDelegate中处理跳转
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler { // NSUserActivityTypeBrowsingWeb 由Universal Links唤醒的APP if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *webpageURL = userActivity.webpageURL; NSString *host = webpageURL.host; if ([host isEqualToString:@"yourURL"]) { } else { [[UIApplication sharedApplication]openURL:webpageURL]; } } return YES;}复制代码
one more thing
事实上Apple提供了一种智能广告条的方式,但只在Safari上可用。并且指向的是App Store。 在页面Head
中增加如下meta
, 可以自动判断是否已安装应用,并展示出来。