ZenTalk

Posted on By Vivian Sun

一、 项目简介

  1. 功能描述

    硕粉俱乐部 app 客户端

    • 登录ZenTalk
    • 浏览ZenTalk咨询
    • 搜索、浏览、发表、管理帖子
    • 管理个人信息
    • 好友发送信息
    • 三方登录
    • FAQ 接入
  2. Members

    • Abbi
    • Scott
    • Venjee
    • Vivian
  3. 开发时间:2016.1.29 ~ 2017.11 (开发结束)

二、 平台支持

Android已经上架

三、 开发方式和架构内容

  1. 混合开发,Android + H5
    • 首页、推荐、版块、组文章、帖子正文是H5开发
    • 搜索、我的、UI外层框架等是Android Native开发
  2. 使用Git作为版本管理
  3. 使用Android Studio,WebStorm开发客户端
  4. 使用原始Discuz服务器 和 Spring Hibernate框架(新功能)
  5. 使用CN Store和升级服务器作为升级方式
  6. 使用个推作为推送方案
  7. 使用Android官网,github,Stackoverflow和codekk作为主要的知识查找
  8. 使用Lint, FindBugs, Android atutotest, monkey test做app代码和quanlity检查
  9. 使用个推作为推送方案
    • app端在个推服务器注册Project
    • app启动时通过api把userid和clientid传送到ZenTalk服务器
    • ZenTalk服务器会依据userid,clientid实现全局推送,分组推送,单点推送(ZenTalk服务器依据userid确认分组)

四、 数据缓存机制

项目采用缓存:webview缓存和json数据/图片缓存

webview缓存

webview缓存跟服务器配置有关,一般webview设定后就可以支援断网后显示缓存数据

   private void addWebViewCacheEnable(WebView webView){
        WebSettings webSettings = webView.getSettings();
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//LOAD_DEFAULT
        webSettings.setDomStorageEnabled(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setAppCachePath(getContext().getCacheDir().getAbsolutePath());
        webSettings.setAppCacheEnabled(true);
   }

json数据缓存

非实时性的接口(对实时显示要求不高的模块)

  • splash 3s页面 - 页面加载ready后,更新json并保存。每次加载本地json - 页面加载ready后,获取user info并保存json数据
  • user info - 点击我的更新数据(先显示old data)

其他要求实时性的接口:(不需要数据缓存)

  • app update点击后,实时获取更新信息
  • 更多内容”
  • “收藏”,“提醒”,“消息”,“我的帖子”点击后,事实更新各自数据。

图片缓存

app端使用volley 库的图片缓存功能

五、 安全

服务器API加密机制 详见项目档案 : F:\Manager\ZenTalk\200-2 加密

六、 遇到的问题

  1. H5 banner和 Native ViewPager滑动冲突

    解决方案:上面H5 banner的上面区域禁止ViewPager滑动

  2. 推荐页面H5 “click to top” button 点击事件触发背景点击

    推荐页面的to top button点击后,事件会穿透到下面的listview. 导致点击to top后会进入帖子正文。

    解决方案:在image div后面叠加一个div,并在hide的时候延迟一下。css的touch会在300ms后出发click,因此这里400ms后再把遮挡div hide掉。

     .html----------------
     <div id="hide" class="float_icon">
     </div>
     <div id = "totop" class="float_icon">
         <img src="images/btn_top.png" width="100%" height="100%">
     </div>
    
     .js-----------------
        
     $(document).scroll(function(){
         if($(document).scrollTop()>0){
             hide.show();
             floatIcon.show();
         }else{
             setTimeout("hide.hide()",400);
             floatIcon.hide();
         }
     });
    
  3. Webview缓存机制,设定为default后不work

    详见:F:\Manager\ZenTalk\html缓存

  4. 账号整合问题

    ZenTalk需要整合XXX账号,因XXX跟之前的公司账号不同步。我们期望能够用SSO方案来实现:用户只需要登录一次就可以访问所有相互信任的应用系统。

    首先需要XXX提供统一接口,打通两个服务器间登录,注册,获取用户信息等环节。 app Client采用google规范的account manager接口来管理账号。

    PS: SSO: Single Sign On

  5. apk更新问题

    • apk更新的方案是:从服务器端load config档案,compare 版号后确定是否更新。
    • 考虑到后期有非技术人员来维护管理config,因此并未采用version code这个技术性的字段。
    • 早期开发时,版号中的特殊符号分隔是’.’. 前期测试没有问题。但是后期公司系统build出的apk包含了’_’. 导致前期比较方法出错

    做版本比较方案时应该考虑到后期正式版本的命名规则等因素。

  6. session过期问题

    ZenTalk遇到登录一段时间后无法发帖问题,经查证是session的问题。首先跟服务器端确认如下:

    • formsession相当于页面session, 只保存在 client 端。每次登陆都会生成一个formhash 值,只要webview 不关闭这个值将一直有效。
    • 如果apk 关闭,再重新打开,理论上会引起 formhash 值失效。需要调用zentalkApp_v1.2.8_SPEC.doc 文档中的init Api 重新获取 fromhash值。
    • 如果在asusaccount 页面做logout 操作,则formhash 会失效。

    解决方案: app每次启动后重新获取formsession

  7. H5存储数据问题

    android端只有捆绑的H5页面允许存储数据。例如ZenTalk的code中预载的offline页面。 webview加载的外部url没把发存储数据到本地。

    解决方案: app提供存储接口给H5使用

七、 项目优化

  • Splash页面3s时,后台开始加载“首页”,“推荐”等几个主要Fragment. user可以3s后看到已经加载ready的首页
  • 首页不使用wex5框架编写的H5. 绕过wex5框架大量JS加载的时间。提示首页加载效率
  • 首页,帖子正文下拉刷新采用部分刷新
    • 首页仅刷新列表和推荐版块
    • 帖子正文仅刷新回帖(目前帖子正文是动态生成页面)
  • webview采用不自动加载图片,等页面finish后再发起图片加载方案。提升webview的UX
  • ZenTalk模块化实践详见 F:\Manager\ZenTalk\600 ZenTalk 模块化实践.docx
  • 内存优化
    • 数据量不大,在千级以内用SparseArray和ArrayMap代替HashMap
  • webview加载效率优化
    • webview加载优化之Cache

      App端方案:加入webview cache方案。 实际测试效果:(通过抓包和图片文件分析)

      1) 图片不会重新load

      2) 网页相关的html, css, js等会重新下载

      不过这些文件加起来基本< 10k,对加载效率影响已经非常小。 设定cache方案后,为何这些文件会重新下载还待进一步研究。初步猜测可能跟服务器端配置有关。

    • webview加载优化之wex5加载效率优化

      对wex5部分加载做优化。 例如用native storage代替页面间切换获取数据;js加载优化等

    • webview加载优化之缩略图

      建议服务器支援多档图片,例如

      1) Thumbnail:小图,4848, 9292? 用于组文章,帖子正文等页面,加速帖子列表渲染和加载

      2) preview大图:512512, 1024768? 用于user点击后查看大图,加速大图页面的渲染和加载

      3) 原图:已经支援

八、 其他

项目档案

三方库

推送选择

推送:选用个推

Reference

‎- Android推送SDK哪家好?

MSC

  • 网络状态变动处理逻辑

    网络重新连接后,首页和推荐webview刷新

  • 小红点数据对比规则

    提醒,消息如果数据有变动,提示小红点。

    数据变动比对规则:last item time + length)

  • app中HTML,CSS,JS压缩节省空间

    可以使用在线工具或者WebStorm插件

九、 总结

  1. 项目采用混合开发,测试过运行时内存在可接受范围
  2. 混合开发在页面加载的用户体验上交Native弱一些
  3. app的首页webview加载优化非常重要。因为用户第一眼看到的就是首页。
    app中对于首页webview加载优化方案:在splash页面3s计数时开始后台加载webview. 以提升用户体验。

十、 Reference

Android_Data -> 其它资料收集

Android网络通信开发使用的常见第三方框架汇总

GitHub Android Libraries Top 100 简介

GitHub 优秀的 Android 开源项目

常用github项目类库

Android WebView开发问题及优化汇总

Android WebView 缓存处理

国内Top500Android应用分析报告