iOS 禁用`URL Scheme`和`Universal Link`(通用链接)
为什么要禁用URL Scheme和Universal Link(通用链接)
通常我们APP中都会嵌套一些web页面,有时我们的web页面会被DNS劫持从而跳转到其他APP中;或者是某些APP的Universal Link(通用链接)设置的比较容易触发,当web跨域跳转就有可能跳转到这些APP。比如苏宁易购的Universal Link(通用链接)为*.m.suning.com,只要web进行跨域跳转*.m.suning.com就会拉起苏宁易购APP。在这种情况下的话我们就需要在我们的APP中对web做一些处理从而来禁止拉起这些APP。
在iOS 9.0之后如果需要使用URL Scheme唤起APP的话需要在info.plist中增加白名单,只有在白名单中的URL Scheme才可以使用,因此可以禁止跳转到意料之外的APP。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>openapp.jdmobile</string>
</array>
WKWebView
在iOS8.0后APP推出的WKWebView是现有大部分APP中常用的控件之一。
WKWebView中URL Scheme禁用和启用即使在info.plist中设置了白名单但是
WKWebView对URL Scheme默认是不支持的,如果要支持URL Scheme需要做一些处理- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL *url = navigationAction.request.URL;
// 调用电话
if ([url.scheme isEqualToString:@"tel"]) {
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}
WKWebView中Universal Link(通用链接)禁用对于
Universal Link(通用链接)的话因为该方式是通过系统层级来直接拉起APP的,在WKWebView也是可以无缝跳转的。如果需要禁用Universal Link(通用链接)的话只需要在WKNavigationDelegate的- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler中WKNavigationActionPolicyAllow替换成WKNavigationActionPolicyAllow+2:- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
decisionHandler(WKNavigationActionPolicyAllow+2);
}
UIWebView
虽然iOS8.0后提供了WKWebView,但是如果需要手动管理cookie的话(WKWebView在iOS11.0之后才可以手动管理cookie)或其他原因还是又很大一部分使用UIWebView的APP。
UIWebView中URL Scheme禁用
在iOS9.0之后对于UIWebView只有URL Scheme配置在info.plist中才可以正常使用,因此对URL Scheme不需要做特殊处理。
在iOS 9.0之前在UIWebView中禁用URL Scheme需要我们在- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;代理方法中做一些处理。
首先我们可以依然设置白名单列表,例如:self.whiteSchemes = @[@"http",@"https"];当跳转的Scheme不在我们的白名单中就禁止跳转:- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = request.URL;
if (![self.whiteSchemes containsObject:url.scheme]) {
return NO;
}
return YES;
}
UIWebView中Universal Link(通用链接)禁用
其实在APP中嵌套的web页面大部分都是自己家的页面,因此域名应该是固定的。因此在UIWebView中禁用Universal Link(通用链接)我只想到用最笨的方法和禁用URL Scheme方式一样。
设置白名单列表,但是和白名单列表中存放的是host(域名)而不是Scheme,例如:self.whiteHosts = @[@"http",@"https"];。当跳转的不是白名单中的话就直接禁止跳转。- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = request.URL;
if (![self.whiteHosts containsObject:url.host]) {
return NO;
}
return YES;
}
文章若有不对地方,欢迎批评指正
iOS 禁用`URL Scheme`和`Universal Link`(通用链接)的更多相关文章
- iOS 唤起APP之Universal Link(通用链接)
什么是Universal Link(通用链接) Universal Link(通用链接)是Apple在iOS9推出的一种能够方便的通过传统HTTPS链接来启动APP的功能,可以使用相同的网址打开网址和 ...
- iOS Universal Links(通用链接)
公司的运维,发现最近大量的请求 /.well-known/apple-app-site-association这个文件,造成了大量的404,可是这是谁请求的呢? 其实是苹果从iOS9.3开始更改了通用 ...
- iOS 自定义 URL Scheme 完全指南
http://www.cocoachina.com/industry/20140522/8514.html “” 阅读器 自定义URL Scheme 本文转自Migrant的博客,原文:<T ...
- iOS 9的 Universal Links 通用链接使用
前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...
- ios 自定义URL Scheme 设计
在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...
- iOS通过URL Scheme启动app(收集了常用的app的URL Scheme)
URL Scheme不仅可以打开其他的app,当然你也能为自己的app设置URL Scheme 1.如何设置给app设置URL Scheme 添加URL types字段数组 设置URL identif ...
- iOS app url scheme跳转到淘宝商品详情页 唤醒app
最近涉及的一个业务,在app内的一个广告,点击打开webView,加载的是一个淘宝商品详情页,效果是打开该webView自动跳转至淘宝对应的页面,同时在自己的app仍然加载页面,点击评论等也同样能跳转 ...
- iOS:URL Scheme(完结)(18-1-3更)
1.APP跳转 2.APP功能跳转 3.系统功能跳转 1.APP跳转 1.被打开方 设置APP的URL Types(设置位置在 “项目 - TARGETS - APP icon - info - (拉 ...
- iOS 9 的新功能 universal links
什么是 universal links: (通用链接) 一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开web page和 APP的方式. 第一点,链接打开网址 顾名思义 第 ...
随机推荐
- requeests模块响应体属性和方法重新整理
下面的属性方法都是基于response对象` import requests response = requests.get('url') 一.url 返回值的url 二. text 获得响应体文本信 ...
- javaWeb核心技术第四篇之Javascript第二篇事件和正则表达式
- 事件 - 表单提交(掌握) "onsubmit" - 单击事件(掌握) "onclick" - 页面加载成功事件(掌握) "onload" ...
- 看完这篇文章,我奶奶都知道什么是JVM中的内存模型与垃圾回收!
扩展阅读:JVM从入门开始深入每一个底层细节 六.内存模型 6.1.内存模型与运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同数据区域. Java内存模型的主要目 ...
- HTML5☞canvas
<canvas>便签用于绘制图像,图表.不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本JavaScript来完成实际的绘图任务.既然你 ...
- Java 正则初探
正则表达 初探* 走进沼泽 问题引出 问题:判断一个String字符串是否为数字字符串 将字符串转换为字符数组 判断每一个字符是否在"0~9"范围之间 public class T ...
- Linux 释放cache
sysc 将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node.已延迟的块 I/O 和读写映射文件 echo 3 > /proc/sys/vm/drop_caches To free p ...
- [转载] Java的四种引用关系
目录 1 强引用 (Final Reference) 2 软引用 (Soft Reference) 2.1 案例1: 软引用的垃圾回收 2.2 案例2: 软引用缓存的使用 2.3 软引用的应用场景 3 ...
- [20191108]内核参数tcp_keepalive与sqlnet.ora expire_time的一些总结.txt
[20191108]内核参数tcp_keepalive与sqlnet.ora expire_time的一些总结.txt --//前几天在做12c DCD SQLNET.EXPIRE_TIME相关测试时 ...
- Mac打开Finder快捷键
摘要:目前网络中较常见的打开Finder的方法有两种,要么是先进入桌面状态,再使用快捷键command + shift + c:要么是通过下载软件来设置打开Finder的快捷键.都过于繁琐,其实有很简 ...
- TED演讲积累。
Passion is not a job,a sport ,or a hobby,it is the full of force of your attention.and energy that y ...