iOS 9之SFSafariViewController
有时候需要在App内部打开一个网页,例如为了展示公司官网,产品列表信息,Facebook,微博等。以前都是使用 UIWebView,iOS 8引入了WKWebView。但他们都存在各自的一些问题。
UIWebView:
- 始祖级别,支持的iOS版本比较多
- 可支持打开URL,包括各种URL模式,例如 Https,FTP等
- 可支持打开各种不同文件格式,例如 txt,docx,ppt,,音视频文件等,很多文档阅读器会经常使用这个特性,感兴趣的可以查一下Apple的文档,支持的格式还是挺多,只是不同iOS 版本的支持程度不太一样,使用时请多留意测试确认~
- 占用内存比较多,尤其是网页中包含比较多CSS+DIV之类内容时,很容易出现内存警告(Memory Warning)
- 效率低,不灵活,尤其是和 JavaScript交互时
- 无法清除本地存储数据(Local Storage)
- 代理(delegate)之间的回调比较麻烦,提供的内容比较低级,尤其是UI部分。如果想自己定制一个类似 Safari 的内嵌浏览器(Browser),那就坑爹无极限了,例如我们PDF Reader系列中的内嵌Browser,自己手动模拟实现Tab切换,底部Tool及各种Menu等,说多了都是泪~~
WKWebView:
- iOS 8引入的,比较年轻
- 在内存和执行效率上要比UIWebView高很多
- 开放度较高但据说Bug成吨
- 类似UIWebView,UI定制比较麻烦···
- 没具体测试使用过,就不继续列举了 L~
好,终于轮到今天的主人公了,SFSafariViewController:
- iOS 9引入,更加年轻,意味着是Apple的新菜,总是有什么优势的
- 也是用来显示网页内容的
- 这是一个特殊的View Controller,而不是一个单独的 View,和前面两个的区别
- 在当前App中使用Safari的UI框架展现Web内容,包括相同的地址栏,工具栏等,类似一个内置于App的小型Safari
- 共享Safari的一些便利特性,包括:相似的用户体验,和Safari共享Cookie,iCloud Web表单数据,密码、证书自动填充,Safari阅读器(Safari Reader)
- 可定制性比较差,甚至连地址栏都是不可编辑的,只能在init的时候,传入一个URL来指定网页的地址
只能用来展示单个页面,并且有一个完成按钮用来退出

图1 SFSafariViewController演示截图
如果你的App需要显示网页,但是又不想自己去定制浏览器界面的话,可以考虑用SFSafariViewController来试试。从好的方面看,SFSafariViewController也去掉了从App中跳转到Safari的撕裂感,不同App之间切换总是让人感觉麻烦和不舒服。
代码例子:
- (IBAction)onButtonClick:(id)sender
{
NSString *urlString = @"http://www.kdanmobile.com";
SFSafariViewController *sfViewControllr = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:urlString]];
sfViewControllr.delegate = self;
[self presentViewController:sfViewControllr animated:YES completion:^{
//...
}];
}
// Done 按钮
- (void)safariViewControllerDidFinish:(nonnull SFSafariViewController *)controller
{
[controller dismissViewControllerAnimated:YES completion:nil];
}
SFSafariViewController 的接口比较少,就不再继续一一列举了。另外一个定制功能在于SFSafariViewControllerDelegate里面的一个方法:
-(NSArray<UIActivity *> *)safariViewController:(SFSafariViewController *)controller activityItemsForURL:(NSURL *)URL title:(nullable NSString *)title;
这个代理会在用户点击动作(Action)按钮(底部工具栏中间的按钮)的时候调用,可以传入UIActivity的数组,创建添加一些自定义的各类插件式的服务,比如分享到微信,微博什么的。

图2 SFSafariViewController演示截图
小细节:
- SFSafariViewController有保存Cookies的功能,但是貌似不能和Safari浏览器共享,也可能是Beta版的bug
iOS 9之SFSafariViewController的更多相关文章
- iOS 中的 Deferred Deep Linking(延迟深度链接)
http://www.cocoachina.com/ios/20160105/14871.html Deep Linking 其实 deep linking 并不是一个新名词,在 web 开发领域,区 ...
- Expo大作战(二十六)--expo sdk api之Video和WebBrowser
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 通过iOS 9 SFSafariViewController提供完整的Web浏览体验
http://www.cocoachina.com/ios/20150826/13157.html 本文由CocoaChina译者@涛声依旧-忆往昔翻译自tutsplus校对:BenBeng原文:iO ...
- iOS 开源项目
在 Github 上 Star 太多了,有时候很难找到自己想要的开源库,所以在此记录下来.便于自己开发使用,也顺便分享给大家. 动画 awesome-ios-animation收集了iOS平台下比较主 ...
- 关于 iOS 10 中 ATS 的问题
本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...
- iOS SDK Release Notes for iOS 9 iOS9 SDK 版本更新说明
Important: This is a preliminary document for an API or technology in development. Apple is supplyin ...
- 关于 iOS 10 中 ATS / HTTPS /2017 问题
本文于 2016 年 11 月 28 日按照 Apple 最新的文档和 Xcode 8 中的表现进行了部分更新. WWDC 15 提出的 ATS (App Transport Security) 是 ...
- iOS 9的新内容
https://www.hackingwithswift.com/ios9 Search extensibility Update: I wrote a tutorial on Core Spotli ...
- 第三十二篇、iOS 10开发
1.语音识别 苹果官方在文档中新增了API Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,spe ...
随机推荐
- Java组合与继承生成的类中构造函数的执行顺序
[程序实例] import java.util.*; class Meal{ Meal() { System.out.println("Meal Constructor"); } ...
- jqTransform——学习(1)
官网:http://www.dfc-e.com/metiers/multimedia/opensource/jqtransform/ 转载:http://www.helloweba.com/view- ...
- Django之路由系统
一.路由系统介绍 在django程序中,可以通过urls.py文件对所有的url进行任务的分配,根据路由规则的定义选择不同的业务处理函数进行处理 二.路由规则定义 1.路由规则代码如下,mysite/ ...
- DFBle.swift
//// DFBle.swift// DFBle//// Created by LeeYaping on 15/9/2.// Copyright (c) 2015年 lisper. All r ...
- DataTables 配置和使用
WEB后台开发,如果用的是Bootstrap框架,那这个表格神器你一定不要错过. 官方地址:https://datatables.net/ What?英文不好,没关系咱有中文的 http://data ...
- rpm包安装
RPM全称是“RedHatPackageManager”是由RedHat公司发发展起来的,本质是将软件源码包经过编译并且打包成rpm的格式,rpm文件包含的有二进制文件,配置文件,库文件等,同时RPM ...
- 解决操作过快导致ajax异常的办法
//控制点击过快ajax异常 var state = true; function test() { if (state) { state = false; var val = accMul((uCo ...
- INVALID_USER_SCODE问题的解决办法
在用高德地图API的时候,还会遇见一个为题,就是总是提示:INVALID_USER_SCODE.当遇见这个问题的时候,一般的问题都是,注册key之后没有十分钟就开始使用这个key值了.另外一种情况就是 ...
- SignalR2.0开发实例之——创建房间聊天
SignalR作为一个强大的集线器,已经在hub里面集成了Gorups,也就是分组管理,使用方法如下: //作用:将连接ID加入某个组 //Context.ConnectionId 连接ID,每个页面 ...
- 更好的使用chrome
Ctrl+tab 在标签页之间切换 Ctrl+1 到 Ctrl+8 切换到指定位置编号的标签页.您按下的数字代表标签页横条上的相应标签位置 Ctrl+9 ...