angular实现单页面和native的交互小节

来源:互联网 发布:天谕男角色捏脸数据 编辑:程序博客网 时间:2024/04/29 20:50

        新的项目中,界面内容,90%全都是前端来实现。native负责开容器,创建webview,容器之间界面跳转,navigation bar的显示和bar上前端和native交互,新特性界面,登录页,菜单界面,设置界面。

       前端用的框架是angular 1.0,按照模块开发。每个模块对应native一个新容器。同一个模块用单页面(每个节点,对应一个界面。通过请求展现不同的节点(若没有缓存,上个节点被覆盖,每次展现时,都需要重新请求才可出现),实现界面的切换)实现,界面切换时,前端通过调用native方法更改navigation bar样式,不同模块间的跳转,native通过新开容器,webview加载对应的URL实现。

      前端调用native的方法,有两种方式,方式一:cordova框架,有第三方封装的native方法,可用cordova打点的方式调用。方式二:native自定义的方法,在前端通过约定的对象调。方式二需要维护一个方法的声明的js文件。此js文件可放在前端,也可放在客户端进行维护。各有利弊。我觉得,放在前端维护,更好。因为更利于扩展,不局限于版本作改变。

      native引入了一个cordova对应的第三方交互类。封装了前端和native之间的交互细节。每次只需在特定文件中添加交互方法的实现,更新方法声明的js文件即可。

     开发中,把一些遇到的小点,记录在此。

     1.无论是不是单界面,网页a对应的navigation title是A,网页b对应的navigation title是B,应将各自网页对应的修改title 的操作放在各自的网页中实现,即网页a的ttle A放在网页a中改变,网页b的title B方法网页b中改变。不可将网页b的title B,放在网页a中改变,当没网时,会出现网页b没有加载,仍是网页a的界面,而title却变成了网页b对应的title B了。

     2.前端网页没有版本的约束,永远是最新的。修改某个native版本中,和前端交互的问题时,应该考虑到向下兼容。不要改好了此版本,却改坏了较低的版本。

     3.单界面实现的网页,从网页a跳转到网页b时,前端通过调用native修改bar的方法,改变对应的bar样式。不是单界面实现的网页,可在web view did finish load中获取document.title更改bar的title。

    4.单界面表现在native端的特点:单界面的第一个网页加载时,会触发native的四个webview的协议方法。单界面第二个网页及之后的网页加载时,不会出发web view did finish load或did fail方法。且所有网页加载时的URL,都和加载第一个网页的URL一样。单界面实在一个webview上实现的,故获得的document.title也不会改变。所以切单界面时,需要调用native修改bar的方法来更改bar样式。

    5.单界面的缓存,是cordova框架实现的。缓存,会增加请求的带宽,不过一般数据量很小,增加的带宽也不大。例如。当单界面中,某个节点需要缓存(隐藏节点),那么,这个节点之后的界面数据的请求,都需要带上隐藏的节点,增加额外的带宽。

   6.在定义参数时,用于参数的分隔符,应选择方法定义和方法名的定义不会有冲突的,例如,用应为“|”。

   7.和帐号有关的数据,存在沙盒时,需要对应帐号存储,对应帐号取值。保持数据与帐号的一致。

   8.开发过程中,网络请求有错误。改正后重新打包。自测正常。但服务器,时有收到参数不正确的请求。原因:旧的版本,可能在使用中,造成了服务器采集到错误的请求。

   9.上传图片到服务器,之前功能正常,且同一份代码,在其他测试环境中功能也正常,现在不正常,报服务异常错误。可能原因之一是:服务器磁盘满了,需要清理。

   10.前端的强制升级,需要全版本的回归。测试时,版本从大到小,找到最低支持版本,那么低于此版本的此功能都不正常,既有效有可节约测试时间。

   11.string的URL中,若有“#”号,当string通过UTF8编码时,会将“#”号编码。前端拿到的URL,识别不出“#”号。会出错。故“#”若作为前端解析时的分隔符,则不能被编码。

   12.对于一些通过网络请求到的数据,且不经常改变的。可以设置一个有效期,例如一周。一周后,在发起请求更新数据。这样,可以很好的节省带宽。

   13.交互过程中,存在网页和native同时点击的问题,咱起个名叫“多点触控”,导致的界面不正常,根本原因是,用户错误的操作引起。若不容易解决,一般就当成问题,不解决了。

   14.iOS传入前端的字符串,字符串要加单引号。

   15.string的url中,带有汉子参数,需要UTF8编码,否则,string的url创建NSURL对象,此对象为nil。

   16.navigation 中的vc,展示table或者webview。此时的(0,0)点在navigation bar的左下方。若table的cell中有文本框,触发键盘。则当键盘弹起时,(0,0)点在屏幕的左上角。一般用于键盘弹起时,缩小table的高度,防止遮挡输入框用到。

   问题:

   native和前端可交互的时刻,是web view did finish load。开发时,遇到一个情况。网页a调用更改bar的方法前,关闭网页a所在的容器,打开网页b所在的容器。此时定义的更改navigation bar的交互方法,先传来网页a对应的bar样式,再传来网页b对应的bar样式,现象是,网页b的navigation bar先显示网页a的bar样式,再切换成网页b的bar样式,这个问题有待深究,若对此问题,有答案,请回复我。谢谢。

   

     

0 0