目前, 大多数 iOS 应用需要在某个时候显示一些第三方网页内容, 为此, 苹果提供了多种显示方式, 官方的方式是: 在 Safari 中启动 URL
在 Safari 中启动 URL
该方法就是使用应用切换器 (App Switch) 将用户的应用转移到后台, 这样, 用户就拥有了自己的浏览器 (比如 Safari), 会话和内容拦截器(Content blockers), 浏览器插件(例如 1Password) 等由于启动 Safari 后, 当前的应用程序就会被置于后台, 许多应用程序开发人员担心此举意在阻碍用户使用它们的产品
App Switch 是一个能够帮助我们在 Mac 平台下快速切换不同屏幕间的程序的辅助工具, 是为多显示器用户设计的一款应用切换工具
使用 SFSafariViewController
使用 SFSafariViewController 是另外一种方式, 许多第三方 iOS 应用程序都使用这种方法(例如 Tweetbot), 通过 SFSafariViewController, 你几乎可以使用所有 Safari 的一些便利特性, 而无需离开你当前的应用
应用内浏览器的使用
除了应用内浏览器的使用是目前使用最多的一种方式, 许多大型的 iOS 应用程序重新实现了在自己的应用程序内就可以浏览网页的功能, 虽然这很必要, 但那是在很多年以前了, 但现在程序内浏览网页的功能不仅不再需要, 而且实际上会给用户增加上网风险
这些定制的应用内浏览器通常会使用程序自己的 UI 元素, 比如:
1. 自定义地址栏;
2. 自定义 SSL 指标;
3. 自定义分享按钮;
4. 自定义重新加载按钮;
使用自定义应用内浏览器的风险
如果一个应用程序呈现自己的 WKwebView, 它们不仅给用户造成不便, 而且实际上还会在使用时面临严重的风险
用户会话
用户的登录会话不可用, 这意味着如果你获得了一个链接, 例如一件亚马逊产品的链接, 那么你现在必须登录并输入你的双因素身份验证代码才能购买产品
浏览器扩展
如果用户使用浏览器扩展(如密码管理器), 他们将无法在自定义应用内浏览器中访问它们
深度链接
深度链接本身在 iOS 平台上就有多个问题, 通过使用自定义的应用内浏览器, 它就会添加了一个额外的层, 而这对于深度链接不起作用当点击某个社交媒体应用程序中的亚马逊链接时, 它并没有打开亚马逊应用程序, 而是以普通的 WebView 打开展示的某个亚马逊的产品, 没有登录会话, 也无法在应用程序中打开该产品的介绍
内容拦截器
如果用户安装了内容拦截器, 则它们不会被自定义的应用内浏览器使用
书签
用户无法将当前网址存储在他们的书签中
网站分享
应用程序会利用分享网站的机会, 强制用户使用应用的某个功能
安全和隐私
使用自定义应用内浏览器, 应用开发人员可以将任何 JavaScript 代码注入用户访问的网站这意味着, 应用程序可以访问网站上显示或存储的任何内容, 数据
对用户进行分析
这基本上是应用内浏览器仍然存在的主要原因, 因为它的存在可以允许应用程序开发人员在不告知用户的情况下注入额外的分析代码这样, 应用程序的开发人员可以跟踪以下内容:
1. 用户访问该链接的时间;
2. 用户滚动的速度有多快;
3. 用户都打开哪些链接, 且在每个网站上呆了多长时间;
4. 利用 watch.user, 该应用程序可以在你浏览第三方网站时对你的浏览过程进行记录, 甚至可以使用 iPhone X 脸部传感器来对你进行识别;
5. 每一次点击, 滑动的信息;
6. 在应用程序处于前台使用时, 设备的位置移动变化, GPS 定位 (如果有的话) 和任何其他自带的 iOS 传感器都会开始工作
用户凭据
任何具有应用内浏览器的应用都可以轻松窃取用户的电子邮件地址, 密码和双因素验证码应用程序开发人员可以通过注入 JavaScript 代码将数据连接到应用程序或直接将数据发送到远程主机来, 基本上入 JavaScript 代码就类似于以下这样
- email = document.getElementById("email").value
- password = document.getElementById("password").value
应用程序开发人员只需将上面的代码注入到每个网站, 然后在每个用户的关键运行上运行它, 就会得到想要的电子邮件地址和密码列表
如果要在你自己的 WebView 中运行 JavaScript, 你可以使用下面这段代码
- NSString *script = @"document.getElementById('password').value";
- [self evaluateJavaScript:script completionHandler:^(id result, NSError *error) { ... }];
用户数据
一旦用户登录, 应用程序开发人员还可以访问完整的 html DOM + JavaScript 数据和事件, 这意味着他们可以完全访问用户所看到的任何内容其中就包括你的电子邮件, 你的亚马逊订单历史记录, 你的朋友列表或你从应用内浏览中访问的任何其他数据及网站的内容
HTTPs
目前市面上流行的网络浏览器都有一套通用的标准化的安全运行提示方式, 比如 URL 旁边的 SSL 证书但在在自定义应用内浏览器的情况下, 应用程序的开发者将要求用户手动同意添加 SSL 证书等安全标识, 这意味着你信任应用程序的开发人员, 但实际上它们毫无安全意义可言, 与普通浏览器 SSL 证书标识根本不是一回事
广告
自定义应用内的浏览器允许所有应用开发者将自己的广告系统注入到显示的任何网站中, 不仅如此, 他们还可以替换已在原有网站上显示的广告, 这样应用的收入就会大幅提高
以上只是应用内浏览器的缺陷中的一部分, 更多的缺陷还有待进一步发现
缓解措施
千万别使用 SFSafariViewController 的应用或直接启动应用程序内的第三方网站, 不过也有例外, 如果使用 webview 来显示部分界面或动态内容, 但使用 webview 显示链接或第三方网站应该是非法的
来源: http://jaq.alibaba.com/community/art/show?articleid=1552