2018-09-27
1、需求说明
应用间跳转:通过一个AppA内的某一个操作打开另外一个一个AppB,AppB若下载则直接跳转过去,若未下载则跳到应用商店让用户下载;
网页跳转App:手机打开网页,通过网页上的某一个操作打开App,若已安装App则跳转App,若未安装App则跳到应用商店让用户下载;
2、使用方法
应用间跳转可以通过URL Scheme来实现,将参数配置在url scheme后面,唤醒app再进行页面跳转逻辑;
需要特别说明的微信和QQ分享内容url scheme和Universal Links方式统统被禁用了,除非你是腾讯系的加入他们的白名单;
网页跳转App可以通过meta 标签来实现;
下面我们对URL Scheme、meta 标签、Universal Links一一进行说明.
方法一: URL Scheme
URL Scheme是什么
由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。
URL Scheme有什么作用
那么app之间的跳转有什么作用呢?我们所使用的每一个app就相当于一个功能,app的跳转可以使得每个app就像一个功能组件一样,帮助我们完成需要做的事情,比如三方支付,搜索,导航,分享等等
URL Scheme怎么使用
要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,我们常见的跳转协议有下面这些:
1.打开email
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://info@icloud.com"]]
2.打开电话
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"tel://18688886666"]];
3.打开SMS
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"sms:18688886666"]];
所以,如果我们希望别人打开我们的app,只要在plist文件中配置一下你的跳转协议即可,如下图所示:
跳转协议配置.jpg
“emp601602://”就是我的跳转协议了,编译一下app,在safari中输入“emp601602:// ”就可以跳转到我的app中。
但是在Xcode 9 下,新建的工程,在plist文件中注册URL Schemes,是无法从safari启动app的。
需要在如下位置注册URL Schemes,
添加URL Schemes.jpg
“emp601602:// ”只能让用户跳转到我们的app,之后的处理是在appDelegate的代理中,代理方法如下:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
在这个方法里,可以获取到触发这个方法的 URL,可以通过对这个 URL 进行判断,例如根据不同的 Host,不同的 Query String 来执行不同的动作。
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSLog(@"%@", [url absoluteString]);
// 在 host 等于 item.taobao.com 时,说明一个宝贝详情的 url,
// 那么就使用本地的 TBItemDetailViewController 来显示
if ([[url host] isEqualToString:@"item.taobao.com"]) {
// 这里只是简单地假设 url 形式为 taobao://item.taobao.com/item.htm?id=12345678
// 先获取要查看的宝贝详情的 itemId
NSString *itemId = [[url query] substringFromIndex:[[url query] rangeOfString:@"id="].location+3];
// 使用本地 ViewController 来显示淘宝商品详情
TBItemDetailViewController *controller = [[TBItemDetailViewController alloc] initWithItemId:itemId];
[self.navigationController pushViewController:controller animated:YES];
}
}
在你的动作执行完成了之后,有可能时需要返回到原有app的,这样就需要你的app跳转协议的url里面应该能传入调用者app的跳转协议,这样用户跳转到你的app完成动作后就能跳转回去了。
方法二 :meta标签
现需要添加URL Scheme为 WideSchooliphoneApp,同时添加已上线的app-id以便于跳转AppStore
<!DOCTYPE html>
<html>
<head>
<title>IOS 通过浏览器打开App(小阔学堂)</title>
<meta charset="UTF-8" name="apple-itunes-app" content="app-id=xxxxxxx, affiliate-data=myAffiliateData, app-argument=WideSchooliphoneApp://">
</head>
<body>
<div class="back">
<p>
<font size="20px">
实时互动<br>
直播课堂<br>
<a href="WideSchooliphoneApp://courseId=1234" >打开小阔学堂PP</a><br>
大数据分析<br>
</font>
</p>
</div>
</body>
</html>
点击页面上的打开小阔学堂
网页显示.png
方法三 : Universal Links
什么是Universal Links
Universal Links就是一个通用链接,iOS9以上的用户,可以通过点击这个链接无缝的重定向到一个app应用,而不需要通过safari打开跳转。
如果用户没有安装这个app,则会在safari中打开这个链接指向的网页。
如何支持Universal Links
按照苹果官方文档来说,支持通用链接非常简单哟,只需要三步:
1.创建一个名字叫做apple-app-site-association,包含固定格式的json文件
2.将这个文件上传到你的服务器,可以将这个文件放到服务器的根目录下,也可以放到.well-known这个子目录下。
3.配置app,然后在app里面添加代理方法
如果已经配置过Universal Links,那么在用户第一次安装app时,苹果会发送一个请求,请求你服务器上的apple-app-site-association文件。
请求apple-app-site-association文件成功之后,用户就可以使用Universal Links唤醒app了。
详细的配置流程如下
(1) 关于apple-app-site-association文件的配置
"applinks": {
"apps": [],
"details": [
{
"appID": "C9ANJ7EAW8.com.codyy.iWideSchooliphone",
"paths": ["/h5/course.html*"]
}
]
}
}
创建一个包含上述格式的json文件,文件名字必须为apple-app-site-association,不能带后缀名,有的电脑设置的隐藏后缀名,这点需要注意。
appID
appID 的 格式为 teamID.bundleId形式。
如何获取teamID
登录开发者网站 ,找到Membership
选项卡。
譬如说我的teamID是xxxxxxxxxxx,bundleId是com.mytest.app
那么我的appID就是:xxxxxxxxxxx.com.mytest.app
path路径
paths配置,实际上就是限制哪些路径可以唤醒app,哪些路径不能唤醒app。格式如下:
"paths": [ "/wwdc/news/", "NOT /videos/wwdc/2010/", "/videos/wwdc/201?/"]
使用*配置,则整个网站都可以使用
使用特定的URL,例如/wwdc/news/来指定某一个特殊的链接
在特定URL后面添加,例如 /videos/wwdc/2015/, 来指定网站的某一部分
除了使用来匹配任意字符,你也可以使用 ?来匹配单个字符,你可以在路径当中结合这两个字符使用,例如 /foo//bar/201?/mypage
需要注意的是:配置的paths路径,是区分大小写的
验证apple-app-site-association文件
文件配置完成之后,将其上传到你的服务器根目录或者`.well-known`这个子目录下。
- 确保使用
https://yourdomain.com/apple-app-site-association
这个链接可以访问到,yourdomain.com
为你的服务器域名。 - 也可以使用苹果的验证网站,验证文件是否能被苹果请求到。如果是未上线的应用,使用验证网站时可能出现如下提示:
- 出现该提示为apple-app-site-association文件配置正确。
- 出现404错误码提示,则为apple-app-site-association文件未上传成功,或者使用https://yourdomain.com/apple-app-site-association路径无法访问。
(2) 建立web网页和app应用之间的关联 -> app IDs 配置 和 项目配置
app IDs 配置
进入开发者网站,找到你自己的bundleId
,可以点击edit
按钮,开启associate domains
,如下图:
项目配置:
在项目的Capablities中开启Associated domains,如下图:
appLinks.png
注意domains可以添加多个,前缀必须为applinks:,applinks:后为你的服务器的域名。
代码接收Universal Links唤醒
在appdelegate中实现上面这个方法,当使用Universal Links唤醒app时就执行这个方法。
-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
NSLog(@"userActivity : %@",userActivity.webpageURL.description);
return YES;
}
(3)验证以上配置
快捷验证,在备忘录中输入https://yourdomain.com/apple-app-site-association,长按这个链接,出现下图提示则配置成功
IMG_0100.png
目前知晓的就是以上三种方法,其中的坑还需要一个个踩踩.
参考文章:
iOS9 Universal Links踩坑之旅,移动应用之deeplink唤醒app