Weex系列(2) —— 页面跳转和通信

Hello World项目之后就在想着这个系列接下来该怎么写,那就先简单拟个目录吧,一方面督促自己能坚持下去,一方面如果大家有兴趣的话,也请多多关注我的专栏,顺手点个赞啊~~目录Weex系列(序) —— 总要知道原生的一点东东(iOS)Weex系列(序) —— 总要知道原生的一点东东(Android)Weex系列(1) —— Hello World项目Weex系列(2) —— 页面跳转和通信[Weex系列(3) —— 单页面还是多页面][Weex系列(4) —— 老生常谈的三端统一][Weex系列(5) —— 封装原生组件和模块][Weex系列(6) —— css相关小结][Weex系列(7) —— web组件和webview][Weex系列(8) —— 是时候简析一下流程原理了][Weex系列(9) —— 踩坑填坑的集锦][Weex系列(10) —— 先这么多吧想到在写。。。]大致就是这个顺序吧,可能会微调,那下面就开始这一章吧。入口标题上加了官网怎么集成Weex到已有应用的链接,里面提到了很重要的入口方法。iOSNSURL *URL = [self testURL: [self.url absoluteString]];NSString *randomURL = [NSString stringWithFormat:@"%@%@random=%d",URL.absoluteString,URL.query?@"&":@"?",arc4random()];[_instance renderWithURL:[NSURL URLWithString:randomURL] options:@{@“bundleUrl”:URL.absoluteString} data:nil];这是前一篇用weex脚手架初始化的helloworld项目,在WXDemoViewController.m的render方法里面可以看到这段代码。然后重点来了,weex.config.bundleUrl的值:1、取得是上面options的bundleUrl值2、如果这个值不填,取得就是我们赋给renderWithURL的url地址。所以如果我们加载服务器上的一个页面js,然后这个页面又想跳回到本地的一个页面js,那么在服务器页面取bundleUrl的时候取得就是http的一个地址,是取不到我们想要跳到本地页面js绝对前缀地址的,有点绕,最后就讲讲我们App的思路吧。我做的两个App页面全部都是用vue写的,所以首页、tab页肯定的页面js肯定是的打在包里面的,我们也有做过拉新的活动页,这个页面就可以放在服务器上,支持热更新啊,就遇到了上面的跳转问题,我是全局取了一个bundlejs的绝对地址,在服务器上的页面也就是我们的拉新活动页面里面直接用这个地址就跳回到本地的页面了- (void)renderWithURL:(NSURL *)url options:(NSDictionary )options data:(id)data{ if (!url) { WXLogError(@“Url must be passed if you use renderWithURL”); return; } self.needValidate = [[WXHandlerFactory handlerForProtocol:@protocol(WXValidateProtocol)] needValidate:url]; WXResourceRequest request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeMainBundle referrer:@"" cachePolicy:NSURLRequestUseProtocolCachePolicy]; [self _renderWithRequest:request options:options data:data]; [WXTracingManager startTracingWithInstanceId:self.instanceId ref:nil className:nil name:WXTNetworkHanding phase:WXTracingBegin functionName:@“renderWithURL” options:@{@“bundleUrl”:url?[url absoluteString]:@"",@“threadName”:WXTMainThread}];}Android可以在WXSDKInstance.java里面可以看到render(pageName,template,options,jsonInitData,flag);renderByUrl(pageName,url,options,jsonInitData,flag);安卓和iOS基本类似,但是这儿有两个方法,官网的文档是render,这一个render害死人啊,不过用weex脚手架初始化的项目用的是renderByUrl,所以如果官网直接用脚手架开发的,躲过一劫啊。可以看到这两个方法就差了第二个参数,下面是官网的代码,用render方法的时候,第二个参数里面得用WXFileUtils.loadFileContent这个方法,而且如果option不填的话bundleUrl是取不到js地址?后面我们加的参数的/ * WXSample 可以替换成自定义的字符串,针对埋点有效。 * template 是.we transform 后的 js文件。 * option 可以为空,或者通过option传入 js需要的参数。例如bundle js的地址等。 * jsonInitData 可以为空。 * width 为-1 默认全屏,可以自己定制。 * height =-1 默认全屏,可以自己定制。 */mWXSDKInstance.render(“WXSample”,WXFileUtils.loadFileContent(“hello.js”, this), null, null, -1, -1, WXRenderStrategy.APPEND_ASYNC);下面就来说说几种常见的跳转吧Native -> Weex也就是用开头我们提到的两个方法,然后把我们的bundlejs地址传入就可以打开Weex页面了Weex -> Native这个我这边用的很少,大概思路就是,拦截处理,iOS用Scheme、[[UIApplication sharedApplication] openURL:weburl];吧,Android用intent-filter吧。Weex -> Weex大家在我的helloworld那篇bundlejs小节里面有一个路径截图,可以对比代码参考一下,下面我也把iOS和Android的bundlejs路径图截出来了。const device = weex.config.env;getBaseUrl(url) { if (device.platform === ‘iOS’) { nativeBase = url.substring(0, bundleUrl.lastIndexOf(’/’) + 1); } else { nativeBase = ‘file://assets/dist/’; }}Weex页面A:Weex页面B的地址BUrl=getBaseUrl(weex.config.bundleUrl)+B.jsnavigator.push({url:BUrl}, function(e) {});webview -> Weex这也是比较常遇到的一个跳转,大概思路和Weex跳原生类似,也是一个拦截处理,这一块就放在后面Weex系列(7) —— web组件和webview这个章节讲吧。页面通信这块用的比较多的大概有三种。bundlejs路径地址传参就如标题描述的一样,weex.config.bundleUrl拿到类似A.js?a=1&b=2,和解析网页地址一样,拿到A传给B的a、b后面的值。BroadcastChannel我们在B页面操作完成之后,navigator.pop()之后回到A页面,希望A页面的button状态改变,因为页面是栈式操作,A页面不会自动刷新,可以用Weex提供的这个BroadcastChannel通道来解决,具体操作,大家点击标题就可以了解了。storage感觉这个大家应该非常熟悉,对,Weex也提供给我们了,我们可以愉快的在页面上使用了。globalevent最后还是提一下这个globalEvent,Weex和原生通过这个可以通信,这个我们用到的还是挺多的,大家也可以去官网了解一下呦。就这么多吧,欢迎大家关注我的专栏啊,如果有一点点喜欢,也请点个赞啊~ ...

November 14, 2018 · 1 min · jiezi

判断ios和Android及PC端

在做移动端时,想起用navigator.userAgent来对浏览器类型进行判断,查了点资料,在这里总结下还有一个就是移动端的缩放问题,在meta标签中进行设置,对部分浏览器进行强制性的限制1.navigator的一些常用属性navigator为window对象的一个属性,指向了一个包含浏览器相关信息的对象navigator.appVersion 浏览器的版本号 navigator.language 浏览器使用的语言 navigator.userAgent 浏览器的userAgent信息其中userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值。2.较常见的ios端、Android端及PC端的判断简单点的/* 判断浏览器类型 /let userAgent = navigator.userAgent;/ 判断手机型号 /let app = navigator.appVersion;/ Android 终端 /let isAndroid = userAgent.indexOf(‘Android’);/ ios终端 /let isMac = !!userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);封装性的/ 判断各类型方法 /const browser = { version: function() { const userAgent = navigator.userAgent; return { / 判断是否是ios / ios: !!userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), / 判断是否是Android / android: userAgent.indexOf(‘Android’) > -1 || userAgent.indexOf(‘Adr’) > -1, / 判断是否是移动端 / mobilePhone: !!userAgent.match(/AppleWebKit.Mobile./), / IE内核 / trident: userAgent.indexOf(‘Trident’) > -1, / opera内核 / presto: userAgent.indexOf(‘Presto’) > -1, / 苹果、谷歌内核 / webkit: userAgent.indexOf(‘AppleWebKit’) > -1, / 火狐内核 / gecko: userAgent.indexOf(‘Gecko’) > -1 && userAgent.indexOf(‘KHTML’) == -1, / 判断是否是IPone手机或者QQHD浏览器 / iphone: userAgent.indexOf(‘iPhone’) > -1, / 判断是否是iPad / iPad: userAgent.indexOf(‘iPad’) > -1, / 判断是否是web应用程序(能够让用户完成某些特定任务的网站),没有头部和底部 / webApp: userAgent.indexOf(‘Safari’), / 是否是微信 / weixin: userAgent.indexOf(‘MicroMessenger’), / QQ / QQ: userAgent.match(/\sQQ/i) == ’ qq’, } }(), / 判断浏览器使用的语言:navigator.language除IE浏览器外的浏览器使用的语言, * navigator.browserLanguageIE浏览器使用的语言 */ browserLanguage: (navigator.language || navigator.browserLanguage).toLowerCase()};if(browser.version.ios || browser.version.android || browser.version.mobilePhone) { console.log(‘是移动端’);}3.meta标签设置如对浏览器进行强制全屏的设置(UC全屏),webapp模式等<meta charset=“UTF-8”><!– 视图窗口,移动端特属的标签 –><meta name=“viewport” content=“width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no”><!– 避免IE使用兼容模式 –><meta http-equiv=“x-ua-compatible” content=“IE=edge”><!– uc强制竖屏 –><meta name=“screen-orientation” content=“portrait”><!– QQ强制竖屏 –><meta name=“x5-orientation” content=“portrait”><!– UC强制全屏 –><meta name=“full-screen” content=“yes”><!– QQ强制全屏 –><meta name=“x5-fullscreen” content=“true”><!– UC应用模式 –><meta name=“browsermode” content=“application”><!– QQ应用模式 –><meta name=“x5-page-mode” content=“app”><!– 是否启动webapp功能,会删除默认的苹果工具栏和菜单栏 –><meta name=“apple-mobile-web-app-capable” content=“yes”><!– 这个主要是根据实际的页面设计的主体色为搭配来进行设置 –><meta name=“apple-mobile-web-app-status-bar-style” content=“black”><!– 忽略页面中的数字识别为电话号码,email识别 –><meta name=“format-decoration” content=“telephone=no,email=no”><!– 启用360浏览器的极速模式(webkit) –><meta name=“renderer” content=“webkit”><!– 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 –><meta name=“HandheldFriendly” content=“true”><!– 微软的老式浏览器 –><meta name=“MobileOptimized” content=“320”><!– windows phone 点击无高光 –><meta name=“msapplication-tap-highlight” content=“no”>正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)往期好文推荐:webpack打包(有面试题)纯css实现瀑布流(multi-column多列及flex布局)画三角形 ...

September 28, 2018 · 2 min · jiezi