iOS客户端React-Native增量更新实践
市場上現存方案:微軟的 CodePush 以及React-Native中文網的Pushy,大家可根據公司實際情況酌情選擇。
處于安全性的考慮,公司禁止向第三方平臺上傳源碼相關文件,所以要自己動手實現。
增量更新主要實現流程
1.使用react-native bundle 命令打包,壓縮打包文件
2.使用bsdiff生成新舊RN版本壓縮文件的差異化文件patchFile
3.客戶端舊RN版本壓縮文件合并下載的patchFile文件,校驗文件MD5值,解壓合并后的文件,重新加載jsbundle,完成更新
4.增加版本控制,腳本化1、2過程
常見問題:
一、bsdiff的使用
下載地址:http://www.daemonology.net/bsdiff/
1.解壓下載文件
2.修改makefile文件格式如下,原文件后三行縮進格式不對:
CFLAGS += -O3 -lbz2PREFIX ?= /usr/local INSTALL_PROGRAM ?= ${INSTALL} -c -s -m 555 INSTALL_MAN ?= ${INSTALL} -c -m 444all: bsdiff bspatch bsdiff: bsdiff.c bspatch: bspatch.cinstall:${INSTALL_PROGRAM} bsdiff bspatch ${PREFIX}/bin.ifndef WITHOUT_MAN${INSTALL_MAN} bsdiff.1 bspatch.1 ${PREFIX}/man/man1.endif3.在bspatch.c文件中加入頭文件
#include<sys/types.h>4.終端執行make命令,生成bsdiff、bspatch文件
$ make5.將bsdiff、bspatch文件拷貝到usr/local/bin 目錄下
6.使用方式:
二、客戶端合并文件,工程需要添加libbz2.tbd
1.bsdiff.h
2.bsdiff.c
#include "bsdiff.h" #include <stdio.h> #include <stdint.h> #include <bzlib.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include<sys/types.h>#define MIN(x,y) (((x)<(y)) ? (x) : (y))static off_t offtin(u_char *buf) {off_t y;y=buf[7]&0x7F;y=y*256;y+=buf[6];y=y*256;y+=buf[5];y=y*256;y+=buf[4];y=y*256;y+=buf[3];y=y*256;y+=buf[2];y=y*256;y+=buf[1];y=y*256;y+=buf[0];if(buf[7]&0x80) y=-y;return y; }#pragma mark - Publicint ff_patch(const char *oldf, const char *patchf, const char *newf) {FILE *f, *cpf, *dpf, *epf;BZFILE *cpfbz2, *dpfbz2, *epfbz2;int cbz2err, dbz2err, ebz2err;int fd;ssize_t oldsize, newsize;ssize_t bzctrllen, bzdatalen;uint8_t header[32], buf[8];uint8_t *old, *new;off_t oldpos, newpos;off_t ctrl[3];off_t lenread;off_t i;if ((f = fopen(patchf, "r")) == NULL){return LBD_ERR_OPEN;}/* Read header */if (fread(header, 1, 32, f) < 32){if (feof(f)){return LBD_ERR_CORRUPT;}return LBD_ERR_READ;}/* Check for appropriate magic */// had to change this to use patches created with command line bsdiff// if (memcmp(header, "LBDIFFXX", 8) != 0)if (memcmp(header, "BSDIFF40", 8) != 0){return LBD_ERR_CORRUPT;}/* Read lengths from header */bzctrllen = offtin(header + 8);bzdatalen = offtin(header + 16);newsize = offtin(header + 24);if ((bzctrllen < 0) || (bzdatalen < 0) || (newsize < 0)){return LBD_ERR_CORRUPT;}/* Close patch file and re-open it via libbzip2 at the right places */if (fclose(f)){return LBD_ERR_CLOSE;}if ((cpf = fopen(patchf, "r")) == NULL){return LBD_ERR_OPEN;}if (fseeko(cpf, 32, SEEK_SET)){return LBD_ERR_SEEK;}if ((cpfbz2 = BZ2_bzReadOpen(&cbz2err, cpf, 0, 0, NULL, 0)) == NULL){return LBD_ERR_BZ;}if ((dpf = fopen(patchf, "r")) == NULL){return LBD_ERR_OPEN;}if (fseeko(dpf, 32 + bzctrllen, SEEK_SET)){return LBD_ERR_SEEK;}if ((dpfbz2 = BZ2_bzReadOpen(&dbz2err, dpf, 0, 0, NULL, 0)) == NULL){return LBD_ERR_BZ;}if ((epf = fopen(patchf, "r")) == NULL){return LBD_ERR_OPEN;}if (fseeko(epf, 32 + bzctrllen + bzdatalen, SEEK_SET)){return LBD_ERR_SEEK;}if ((epfbz2 = BZ2_bzReadOpen(&ebz2err, epf, 0, 0, NULL, 0)) == NULL){return LBD_ERR_BZ;}if (((fd = open(oldf, O_RDONLY, 0)) < 0) ||((oldsize = lseek(fd, 0, SEEK_END)) == -1) ||((old = malloc(oldsize + 1)) == NULL) ||(lseek(fd, 0, SEEK_SET) != 0) ||(read(fd, old, oldsize) != oldsize) ||(close(fd) == -1)){return LBD_ERR_OPEN;}if ((new = malloc(newsize + 1)) == NULL)return LBD_ERR_MALLOC;oldpos = 0;newpos = 0;while (newpos < newsize){/* Read control data */for (i = 0;i <= 2; i++){lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8);if ((lenread < 8) || ((cbz2err != BZ_OK) &&(cbz2err != BZ_STREAM_END))){return LBD_ERR_CORRUPT;}ctrl[i] = offtin(buf);}/* Sanity-check */if (newpos + ctrl[0] > newsize){return LBD_ERR_CORRUPT;}/* Read diff string */lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]);if ((lenread < ctrl[0]) ||((dbz2err != BZ_OK) && (dbz2err != BZ_STREAM_END))){return LBD_ERR_CORRUPT;}/* Add old data to diff string */for (i=0; i < ctrl[0]; i++)if ((oldpos + i >= 0) && (oldpos + i < oldsize))new[newpos + i] += old[oldpos + i];/* Adjust pointers */newpos += ctrl[0];oldpos += ctrl[0];/* Sanity-check */if (newpos + ctrl[1] > newsize){return LBD_ERR_CORRUPT;}/* Read extra string */lenread = BZ2_bzRead(&ebz2err, epfbz2, new + newpos, ctrl[1]);if ((lenread < ctrl[1]) ||((ebz2err != BZ_OK) && (ebz2err != BZ_STREAM_END))){return LBD_ERR_CORRUPT;}/* Adjust pointers */newpos += ctrl[1];oldpos += ctrl[2];}/* Clean up the bzip2 reads */BZ2_bzReadClose(&cbz2err, cpfbz2);BZ2_bzReadClose(&dbz2err, dpfbz2);BZ2_bzReadClose(&ebz2err, epfbz2);if (fclose(cpf) || fclose(dpf) || fclose(epf)){return LBD_ERR_CLOSE;}/* Write the new file */if (((fd = open(newf, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0) ||(write(fd, new, newsize) != newsize) || (close(fd) == -1)){return LBD_ERR_OPEN;}free(new);free(old);return LBD_OK; }三、iOS客戶端解壓縮工具:SSZipArchive
四、參考項目react-native-pushy
五、版本管理腳本化 待更新
總結
以上是生活随笔為你收集整理的iOS客户端React-Native增量更新实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统中普通用户输入命令后出现“
- 下一篇: 樊登读书会终身成长读后感_《终身成长》读