SFSafariViewController 加载的网页与原生oc之间的交互
原文地址:https://zhanglei.blog.csdn.net/article/details/121352716
问题描述:
工作中碰到这样一种场景, WebApp 已经实现了IM即时通讯及基于WebRTC
实现的音视频会议,音视频聊天。 也是半路接手的项目,项目整体是使用WKWebView
套壳加载h5
页面实现(后期过审还有很多路要走) 。 h5与原生交互的方案使用的javascriptCore
(具体如何使用,不在本文之内)。 大部分的交互工作都是可以得到解决,唯独需要调起WebRTC引擎进行音视频会议,音视频聊天时,WKWebView就无法再提供支持了。
但在手机的Safari
浏览器中加载的WebApp在使用音视频这块是完全支持的。 所以首先想到的就是涉及到WebRTC这块的功能,我们能否放到Safari中去处理 ?
方案探索:
方案一:
点击h5
中的 发起视频会议通过javascriptCore
引擎与oc进行交互, oc拦截到并调起safari浏览器来打开h5封装的音视频会议功能。
//创建一个url
NSURL *url = [NSURL URLWithString:@"视频会议的地址"];
//打开url
[[UIApplication sharedApplication] openURL:url];
通过上面的代码调用, 在点击后,会跳出应用,跳转到safari浏览器来打开视频会议的地址。 通过尝试基本满足要求。 但在使用完成后,返回原生App的体验着实不太友好。 我们知道苹果在iOS9推出了一个SFSafariViewController
的控制器,它继承自UIViewController。 接下来的方案尝试用这个控制器来处理。
方案二:
同样, oc拦截h5过来的点击事件,约定一个类型或名称,用于区分是来自哪个事件,并处理逻辑
//创建一个url
NSURL *url = [NSURL URLWithString:@"视频会议的地址"];
//使用SFSafariViewController 打开url
SFSafariViewController *safariVc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:str]];
[vc presentViewController:safariVc animated:YES completion:nil];
通过测试,SFSafariViewController
可以完美支持WebRTC
引擎的调用,而且打开的这个页面也是在App内进行的,并没有跳出App,使用体验上有所增强。
视频会议的场景是创建一个room
,分享出去。其他用户可以通过room名称及密码来加入到房间。 这个功能非登录用户同样可以使用,本质和业务系统的登录授权没有太多关系,只需要知道room
名称及密码就可以加入到视频会议中来。
但在IM即时通讯的功能中,还有一个发起音视频聊天的功能,类似微信的音视频即时通讯。在这个业务场景中,需要用户登录授权,需要发起后,等待对方接听等流程处理。远不是视频会议的使用场景,所以这块就不能简单的通过单纯的SFSafariViewController
来处理,还需要解决如下两个问题 :
- 用户已登录状态与其他信息如何传递到新开的SFSafariViewController中?
- 用户在发起音视频界面,点击挂断,如何能监听到事件,与原生进行交互?
方案三:
更多方案内容详见: https://zhanglei.blog.csdn.net/article/details/121352716
本文来自博客园,作者:reyzhang,转载请注明原文链接:https://www.cnblogs.com/reyzhang/p/16199164.html