• iOS 9之SFSafariViewController


    金田github 示例源码

         有时候需要在App内部打开一个网页,例如为了展示公司官网,产品列表信息,Facebook,微博等。以前都是使用 UIWebView,iOS 8引入了WKWebView。但他们都存在各自的一些问题。

     

         UIWebView:

    1. 始祖级别,支持的iOS版本比较多
    2. 可支持打开URL,包括各种URL模式,例如 Https,FTP等
    3. 可支持打开各种不同文件格式,例如 txt,docx,ppt,,音视频文件等,很多文档阅读器会经常使用这个特性,感兴趣的可以查一下Apple的文档,支持的格式还是挺多,只是不同iOS 版本的支持程度不太一样,使用时请多留意测试确认~
    4. 占用内存比较多,尤其是网页中包含比较多CSS+DIV之类内容时,很容易出现内存警告(Memory Warning)
    5. 效率低,不灵活,尤其是和 JavaScript交互时
    6. 无法清除本地存储数据(Local Storage)
    7. 代理(delegate)之间的回调比较麻烦,提供的内容比较低级,尤其是UI部分。如果想自己定制一个类似 Safari 的内嵌浏览器(Browser),那就坑爹无极限了,例如我们PDF Reader系列中的内嵌Browser,自己手动模拟实现Tab切换,底部Tool及各种Menu等,说多了都是泪~~

     

    WKWebView:

    1. iOS 8引入的,比较年轻
    2. 在内存和执行效率上要比UIWebView高很多
    3. 开放度较高但据说Bug成吨
    4. 类似UIWebView,UI定制比较麻烦···
    5. 没具体测试使用过,就不继续列举了 L~

     

    好,终于轮到今天的主人公了,SFSafariViewController:

    1. iOS 9引入,更加年轻,意味着是Apple的新菜,总是有什么优势的
    2. 也是用来显示网页内容的
    3. 这是一个特殊的View Controller,而不是一个单独的 View,和前面两个的区别
    4. 在当前App中使用Safari的UI框架展现Web内容,包括相同的地址栏,工具栏等,类似一个内置于App的小型Safari
    5. 共享Safari的一些便利特性,包括:相似的用户体验,和Safari共享Cookie,iCloud Web表单数据,密码、证书自动填充,Safari阅读器(Safari Reader)
    6. 可定制性比较差,甚至连地址栏都是不可编辑的,只能在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演示截图

     

     

     

    小细节:

     

    1. SFSafariViewController有保存Cookies的功能,但是貌似不能和Safari浏览器共享,也可能是Beta版的bug

     

     

    版权所有,转载须浏览作者(金田)及原文出处(原文)。

  • 相关阅读:
    SpringBoot Maven项目 Helloworld 测试
    Oracle client安装教程
    quartz定时任务时间设置
    maven导出项目依赖的jar包
    Java 集合类
    Webservice客户端动态调用服务端功能方法
    使用Eclipse自带的Axis1插件生成Web Service服务端客户端
    SpringBatch Sample (五)(复合格式文件的读、多文件的写)
    Mysql性能分析
    设置nginx中文件上传的大小限制度
  • 原文地址:https://www.cnblogs.com/CocoonJin/p/4717074.html
Copyright © 2020-2023  润新知