废话开篇:iOS 下的导航器是基于 UINavigationController 的,由它负责对控制的跳转逻辑。vue下是依托的是路由 router,当然这只是在网页的环境下,那么,uniapp 在移动端下进行页面跳转是通过 navigateTo 进行的,这儿需求值得说一下的是:uniapp 在页面进行跳转的过程中是处理了控制器之间的联系的,也就是说,每一个vue或者nvue,都会挂载到一个新的 UIViewController。
一、完成作用
封装一个播映器组件,那么,这儿需求用到 uni 的组件开发工具,能够到 uni组件开发文档下载。
由于是要做 UI 原生组件,那么 HbuilderX 在创立前端文件到时候就必须使用 .nvue 文件进行代码编写;在 iOS 原生库中要用 DCUniComponent 类来进行组件开发。
说了这么多,先看一下作用。
这儿把过程拆开:
1、vue 界面中点击“进入视频概况” 由 vue 执行 uni.navigateTo 跳转到 iOS 原生播映器挂载的 nvue 界面。
gotoVideo(){
uni.navigateTo({
url:'./wslAVPlayer',
success: res => {},fail: (error) => {
},complete: () => {}
})
}
2、点击视频小屏播映功用按钮,uni 执行回退操作;并通过 iOS 原生将视频小屏展现在屏幕上,这儿放的是 keyWindow 上。
enterSmallScreen(){
uni.navigateBack({
delta:1,
success: res => {},fail: (error) => {
},complete: () => {
}
})
}
3、点击小屏放大浏览功用按钮,进行正常界面播映展现。
二、完成过程中存在的问题
这儿需求先说一下,iOS 组件扩展类 DCUniComponent 和 功用扩展类 DCUniModule 都是能够和 uni 组件进行通讯的。可是,像上面的案例,在通过 uni 进行回退的时候,退回消失页面里面的原生组件及前端目标就会毁掉,即便 iOS 原生部分强持有视频播映器,可是与视频播映器进行交互的前端组件目标或许毁掉了,无法再承受消息了,或者说,即便通过什么办法能够进行交互,那么,再推出之前的页面,或许也会导致前端路由混乱。所以如果再想通过uni 进行页面跳转,那么就需求一个常驻前端通讯目标,在 uni 前端代码初始化开端的当地就进行常驻前端通讯目标初始化。那么,在进行小屏转正常播映的时,就用这个常驻前端通讯目标进行页面入栈操作。
三、创立前端常驻通讯目标
创立 WSLBaseModule 类,承继自 DCUniModule。
iOS 代码:
#import "WSLBaseModule.h"
#import "WSLStaticCustomConfig.h"
@interface WSLBaseModule()
//保存前端的回调
@property(nonatomic,copy) UniModuleKeepAliveCallback pushPlayerCallBack;
@end
@implementation WSLBaseModule
UNI_EXPORT_METHOD( @selector(shouldPushPlayerViewFunc:callback:))
//跳转到正常播映状态事情
- (void)shouldPushPlayerViewFunc:(NSDictionary *)options callback:(UniModuleKeepAliveCallback)callback
{
[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(enterNormalScreenAction) name:enterNormalScreen object:nil];
if (callback) {
self.pushPlayerCallBack = callback;
}
}
//承受正常播映通知
- (void)enterNormalScreenAction
{
if (self.pushPlayerCallBack) {
self.pushPlayerCallBack(@{}, YES);
}
}
这儿别忘了在 info.plist 文件下添加对 iOS 原生目标和 uni 目标的映射联系
uni 代码:
onLoad() {
var baseModule = uni.requireNativePlugin("WSLBaseModule");
//推出正常播映界面
baseModule.shouldPushPlayerViewFunc(
{},
(ret) => {
uni.navigateTo({
url:'./wslAVPlayer',
success: res => {},fail: (error) => {
},complete: () => {}
})
}
)
}
解释一下:
1、在 uni 工程的初始化界面下比如 APP.vue 里进行 WSLBaseModule 目标的初始化。在页面的 onload 办法里进行执行 shouldPushPlayerViewFunc 的操作,目的就是将回调传给原生并进行属性持有。
2、当小屏播映器被要求进行正常页面播映时,那么,就发一个通知,让 iOS 原生的 WSLBaseModule 目标执行回调属性,那么,uni 前端映射目标在特定时机就会调用 callback 推出正常播映视频视图了。
3、优化当地。uniapp 当推出正常播映界面时,原生这儿其实是能够将原播映数据,比如播映进展等信息回传给前端的,那么,就完成了无缝巨细屏切换的功用。
四、总结考虑
vue 如果仅仅是PC端而不是移动端的话,它会有一个大局目标,来共享信息,也很好理解,就好比我们都在一个 JS 运转环境下,那么,有什么不能说的呢?可是移动端下,就必须进行各种通讯,当然也能够理解为:我们都在 iOS 系统下,又有啥获取不到的呢?
这儿仅仅是个人理解,uniapp 组件开发感兴趣的朋友能够到官网下一个体会体会,有啥新的思路,希望我们指教。代码低劣,大神勿笑。