越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过
挑战目录
什么是离线包
现如今的app大部分都不只是原生的了,一般都是原生加H5方式实现的。但是H5实现的网页要从服务端获取资源然后才能进行加载。用户体验收到多方面因素的影响。需要把web页面把静态资源生成zip包, 客户端在合适的时机拉去zip包并解压到本地。这个zip包就叫离线包。所以原生端开发离线包模块是很重要的一个模块。
一个离线包模块都需要实现哪些功能
一个离线包必备的功能包括:本地http服务、每次打开离线包时的md5验签、webview跨域解决、根据服务器接口判断离线包更新下载的情况、区分环境加载(现如今应用都有多套环境)、版本更新机制、白屏检测、预加载webview、访问离线包和远程网址的配置随意切换。
-
本地http服务
本地http服务有很多可选方案。为了简单起见选用AndroidAsync
public class 本地服务封装类 implements CompletedCallback{ private AsyncHttpServer server = new AsyncHttpServer(); private static 本地服务封装类 sInstance = new 本地服务封装类(); private ServerCallback serverCallback = new ServerCallback(); private 本地服务封装类() {} public static 本地服务封装类 getInstance() { return sInstance; } public void 启动本地服务() { if (最大尝试服务开启次数-- <= 0) { 外部调用Api管理器.get().error("-1111", "服务启动失败"); return; } 外部配置.get().resetPort(); server.addAction("OPTIONS", "[\\d\\D]*", serverCallback); server.get("/.*?", serverCallback); server.setErrorCallback(this); server.listen(外部配置.get().get端口()); } public void 停止本地服务() { AsyncServer.getDefault().stop(); server.stop(); } public boolean 判断服务是否允许中() { return AsyncServer.getDefault().isRunning(); } public String 根据配置拼接本地服务地址(String vhost, String packId, String path) { if (!path.startsWith("/")) { path = "/" + path; } if (TextUtils.isEmpty(vhost)) { vhost = "https://localhost/"; } if (!vhost.startsWith("http://") && !vhost.startsWith("https://")) { vhost = "https://" + vhost; } if (!vhost.endsWith("/")) { vhost = vhost + "/"; } if (packId.endsWith("/")) { packId = packId.substring(0, packId.length() - 1); } if (packId.startsWith("/")) { packId = packId.substring(1); } vhost = vhost + MD5Utils.md5Decode32(System.currentTimeMillis()+"")+"/"; 外部配置.get().addVHost(vhost); return vhost + packId + path; } public String 根据配置拼接远程服务地址(String remoteurl, String path) { if (!remoteurl.endsWith("/")) { remoteurl = remoteurl+"/"; } if (path.startsWith("/")) { path = path.substring(1); } return remoteurl + path; } private static final String TAG = "本地服务封装类"; @Override public void onCompleted(Exception ex) { OLog.e( ex.getMessage()); 启动本地服务(); } private int 最大尝试服务开启次数 = 100; }
-
每次打开离线包时的md5验签
网友评论