为什么要禁用URL SchemeUniversal 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中常用的控件之一。

  • WKWebViewURL Scheme禁用和启用

    即使在info.plist中设置了白名单但是WKWebViewURL 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);
    }
  • WKWebViewUniversal Link(通用链接)禁用

    对于Universal Link(通用链接)的话因为该方式是通过系统层级来直接拉起APP的,在WKWebView也是可以无缝跳转的。如果需要禁用Universal Link(通用链接)的话只需要在WKNavigationDelegate- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandlerWKNavigationActionPolicyAllow替换成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。

  • UIWebViewURL 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;
    }
  • UIWebViewUniversal 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`(通用链接)的更多相关文章

  1. iOS 唤起APP之Universal Link(通用链接)

    什么是Universal Link(通用链接) Universal Link(通用链接)是Apple在iOS9推出的一种能够方便的通过传统HTTPS链接来启动APP的功能,可以使用相同的网址打开网址和 ...

  2. iOS Universal Links(通用链接)

    公司的运维,发现最近大量的请求 /.well-known/apple-app-site-association这个文件,造成了大量的404,可是这是谁请求的呢? 其实是苹果从iOS9.3开始更改了通用 ...

  3. iOS 自定义 URL Scheme 完全指南

    http://www.cocoachina.com/industry/20140522/8514.html “”   阅读器 自定义URL Scheme 本文转自Migrant的博客,原文:<T ...

  4. iOS 9的 Universal Links 通用链接使用

    前段时间和朋友(@品味生活)一起搞 iOS9的通用链接,我主要做了前面官方文档翻译工作,后面的一些东西都是他在搞,整理也是他整理的. 他的博客原文地址:http://pinwei.blog.51cto ...

  5. ios 自定义URL Scheme 设计

    在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...

  6. iOS通过URL Scheme启动app(收集了常用的app的URL Scheme)

    URL Scheme不仅可以打开其他的app,当然你也能为自己的app设置URL Scheme 1.如何设置给app设置URL Scheme 添加URL types字段数组 设置URL identif ...

  7. iOS app url scheme跳转到淘宝商品详情页 唤醒app

    最近涉及的一个业务,在app内的一个广告,点击打开webView,加载的是一个淘宝商品详情页,效果是打开该webView自动跳转至淘宝对应的页面,同时在自己的app仍然加载页面,点击评论等也同样能跳转 ...

  8. iOS:URL Scheme(完结)(18-1-3更)

    1.APP跳转 2.APP功能跳转 3.系统功能跳转 1.APP跳转 1.被打开方 设置APP的URL Types(设置位置在 “项目 - TARGETS - APP icon - info - (拉 ...

  9. iOS 9 的新功能 universal links

    什么是 universal links: (通用链接) 一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开web page和 APP的方式. 第一点,链接打开网址 顾名思义 第 ...

随机推荐

  1. GO语言介绍以及开发环境配置

    一.介绍 GO语言是静态强类型语言 静态也就是编译型语言 二.安装 1.下载地址 下载地址 https://golang.google.cn/dl/ 2.安装 Linux安装 1.下载二进制包:go1 ...

  2. Unitest自动化测试基于HTMLTestRunner报告案例

    报告效果如下: HTMLTestRunner脚本代码如下: #coding=utf-8 # URL: http://tungwaiyip.info/software/HTMLTestRunner.ht ...

  3. 20180918 begin

    20180918-20190717 风 雅 颂(305,每天一首): 诗经鉴赏, 180918-1030 魔鬼经济学 <唐宋词十七讲>叶嘉莹<最美的宋词> 布谷鸟<诗境浅 ...

  4. js 记一次带时间的表单提交报400错误

    写一个功能的时候,表单里不填时间提交的时候,数据就正常传到后台了,一填上时间就报400错误,看了后台时间的处理也没问题,看了前端时间控件返回的格式也对,但是就是一直报错, 把提交的数据打印出来也没发现 ...

  5. MySQL数据篇(九)--存储过程实现定时每天清理过期数据

    需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录.现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标 ...

  6. pymysql增删改查操作

    表结构 CREATE TABLE `students` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFA ...

  7. 转载:关于STM32硬件I2C读写EEPROM代码实现原理的理解与总结

    http://home.eeworld.com.cn/my/space-uid-716241-blogid-655190.html 一.I2C协议简介 I2C是两线式串行总线,用于连接微控制器及其外围 ...

  8. CodeForces 1238C(思维+贪心)

    题意 https://vjudge.net/problem/CodeForces-1238C 您现在正在玩一个游戏,您初始在一个高度 h 的悬崖 悬崖沿壁高度为 1-h 的这些位置均有平台,平台有两种 ...

  9. python包matplotlib绘制图像

    使用matplotlib绘制图像 import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator impor ...

  10. Leetcode 90. 子集 II

    地址  https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...