一些App动态化解决方案

文章持续更新

App动态化解决方案,说白了就是后台可以控制或更改App的行为。一些常见的做法如:

  1. App启动请求配置文件,配置文件中存放着一系列的参数,供App配置
  2. 使用一些第三方SDK提供的动态参数(跟第一种类似)
  3. 使用App触发与Socket的长连接,时时的调配或者修改应用程序信息
  4. 使用HTML

使用HTML作为动态界面的App我们又称为Hybrid App(混合性App),是指介于web-appnative-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。现在有半数以上的App都可以被称为这种类型的App。

热修复

程序出BUG了,服务端通过程序启动的配置文件或者Socket链接向App下发一段代码进行修复,业界出名的JSPatch使用范围极广。只需配置一段JS代码即可达到运行时替换或者增加方法等操作。是作为热修复的极好选择。还有一些热修复的方案就是通过HTML来替换当前的原生界面,这样的App通常是组件化App,所有界面的打开均通过服务器获取的Map进行路由,服务器只需动态的更新这张Map,替换到出问题的界面即可。但是这种方法仅仅对界面有用,如果某一类的功能出了问题,就无用了(App还是以界面为主的,BUG也多发生与界面,当然高级的BUG略过了)。

热更新

热更新与热修复本应该是出现在同一个位置的,热更新多为代码的修改与控制的变更,比如说微信经常在App发布的时候埋一些小功能在里边,然后到了节日通过控制打开等,Hybrid App常用的动态更新分2中,服务端直接更新,动态更新本地的资源Zip包。我之前的公司也有写过一套JSON->View的方法用于更新界面。

动态调试、实时调试

首先是与服务器建立链接的方式,一般都会以摇一摇等动作来触发,App与Socket建联之后,实时的监控这VC的didAppear等方法,每当App界面变化,都会为当页截图,处理之后通过长连接上传到服务器,服务器发给后台之后,后台根据一些空间的信息与截图进行绘制,一个同步的App界面就展示到了后台。当然,后台也可以动态的把这些空间的点击事件传回App。

日志的动态获取等完全是代码提前写好的,打开远程调试之后原有的Log组件输出在链路中,后台展示即可。通过socket我们可以做很多的操作。

动态化的实现步骤

热更新与热修复这2点业界使用比较广泛,知识点也比较基础,所以这里不做讲解;动态界面调试,实时日志可以略微讲解一下。

  • socket服务器的搭建
  • App.socket服务的编码,web.socket服务的编码
  • 数据格式的制定
  • 数据内容的编解码方式

为了方便期间,socket服务从socket.io与webSocket中选择一种即可,我们选择socket.io,应为有很多现成的解决方案与代码。

服务端作为数据的中转站,做好一些基础的日志记录与错误捕获即可,App、Web端的编解码数据的方式要统一,App、Web实时的发送心跳包到服务器维持在服务器的虚拟存活状态。

App:每一个界面根据类名生成唯一的ID,内部的控件使用界面类名+控件类名+控件某一约定的属性内容,获取到之后使用base64编码之后发送到服务器,服务器做路由。

Web:拿到界面之后进行数据解码,首先渲染App传来的界面截图,然后做空间的处理,根据控件ID+控件详细信息(frame,selector<可点击控件拥有>)等,渲染,并可以操作,touch事件知道点击的控件之后,将事件传回App,做的好的可以把手势全部的做进去。

一个完整的界面动态调试模块基本可以做到,所有的手势识别,控件均可挪动,事件可以共同响应等。

评论