爱玩iOS app基础框架解析
2015-07-23 12:01
543 查看
爱玩iOS app基础框架解析
一. Root模块
Root模块主要功能是创建navigationController,tabController,以及定义rootController等。
1.CTRootViewController里集成了一些方法,例如返回,view消失时cancelRequest,设置title,set navigationbar是否hidden,页面适配等。
2.CTDragNavigationController主要实现了push到下一个vc时往左边拉会显示上一个vc的截图的方法
3.CTHomeTabViewController里主要是对底部的tab bar点击事件的处理
4.由于drag时的效果不包括h5页面所以建一个CTH5RootViewController来过滤掉h5页面的此功能
5.由上述VC而引入了一些commonUI,包括CTRootWindow,CTRootView,CTAlertView,CTLoadingView,CTTableView,CTToastTipView,和一些UIView的扩展类。同时引入了一些基础的control,如CTNavigationBar,CTTelephone。
6.引用到一些基础的类如CtripTime和StringUtil
二. download模块
downloadBase文件夹里集成了携程的downloader方法,调用下载方法如下:
1.#import “CTDownloader.h"
2.调用[CTDownloader addDownloadTaskWithURL:[NSURL URLWithString:module.url] delegate:self];
3.实现download delegate 方法:
- (void)downloadDidFailWithOperation:(CTDownloadTaskOperation *)operation error:(NSError *)error
(void)downloadDidCompleteWithOperation:(CTDownloadTaskOperation *)operation data:(NSData *)data
三. 数据库模块
此应用设定两个数据库,一个存储用户数据,另一个存储其他内容。存储用户数据的可以在应用升级时先copy这些数据然后写入到新版本的数据库。引入了第三方库FMDB
在DB.m中初始化数据库把其从bundle目录拷贝到document目录下,如果是开发环境即 #ifdef InDev 发现app build版本变化就先把此数据库remove([fileManager removeItemAtPath:path error:NULL])再拷贝新的[fileManager copyItemAtPath:fromPath toPath:path error:NULL]。
在golf这个应用中我们实现了数据库的升级和对部分数据的备份,在InitDBUtil.m中实现,由此引入了一个CTDataBaseCopyBean model,这两部分的代码不放入基础框架中。
在调用时[[InitDBUtil alloc] initDB];即实现上述功能,在执行sql方法时首先根据不同功能创建DBUtil如H5DBUtil, OtherDBUtil,然后调用下述方法(sql的执行方法在DB.m里):
[[DbManager getInstance:DBType_CtripUserInfo]
excuteBySqlAndMapInTx:@"Other_setUserSetting"
bindParamsDic:bindParamDic
error:nil];
其中getInstance的参数定位了相应的数据库,excuteBySqlAndMapInTx的参数代表去Other_SqlMaps.plist中找setUserSetting这个key去找相对应的sql语句。InTx代表doInOneTx使用事务,还有NoTx则代表不使用事务。
数据库这边需要导入libsqlite3动态库
四.H5模块
H5这块包括
1.VC (CTH5ViewController CTH5TestViewController CTH5TestURLViewController)
所有的h5页面都是此创建CTH5ViewController,然后在其webview里load的。我们加入了CTH5TestViewController,这样方便测试,在CTH5TestViewController里定义了h5的log。
2.获取url的路径 (CTH5TravelURL CTH5URL)
要load一个html页面首先需要找到相对应的包。CTH5TravelURL的功能就是传入包名找到相对用的路径(调用[CTH5URL getHybridModulePath:H5ModuleName_Cpage])
3.CTH5URLCommand
对h5返回的url进行解析,然后分成_callbackTagName,_className,_methodName,_argumentsDict等。
4.CTH5PackageManager主要对webapp包进行操作,首先copy webapp.zip 从bundle到cache目录,然后解压到cache下的webapp文件夹下。然后下载h5增量包,下载成功将data写入到wb-download下的增量包.zip下,之后copy到webapp文件夹下然后解压。(这中间使用数据库记录了是否需要再次下载的逻辑:判断app升级的response,首先查找数据库中有无increasedata model的数据,没有的话就重新alloc这个model 赋值写入数据库(insert),有的话看这个model的dataversion与response的fullVersion是否相同,相同continue检查下一个包,不相同的话删除重写(delete and insert)此时isNeedUpdate写yes,直到download finish了再去数据库中把isNeedUpdate写成no(update))
5.h5这边的逻辑主要是获取command进行plugin分发,其中不乏native与js交互,获取json 字符串等动作,需要导入jsonkit包,压缩解压需要导入zip包和libz的动态库。
五.测试基础框架工程解析
1.基础框架静态库的生成与导入
将上述的模块加入静态库工程里,编译,运行时先选择ios device等待.a文件由红色变黑,选择模拟器设备如iphone5s运行,找到.a文件所在目录Debug-iphonesimulator(测试工程为模拟器运行对应的静态库也必须为相同模拟器device运行生成的,同样如果静态库为Debug-iphoneos下的,测试工程就需要在设备上运行)导入到测试工程。
鼠标选中静态库工程的target-build phases空白处,点击editor-add build phase-add headers build phase 把需要暴露的.h文件加入到public下,这样在编译运行之后.h会出现在include文件夹下,同.a文件一同拷贝出来才可以用。默认会放到Debug-iphoneos/usr/local/include下。
2.其中libsql和libz需要手动添加到测试工程中
3. 测试
1)新建一个TabViewController继承自CTHomeTabViewController,主要实现
-(void)initDataSourse:(NSInteger)numberOfBarButton normalImageNameArr:(NSMutableArray *)imageArr selectedImageNameArr:(NSMutableArray *)imageArr imageWdith:(NSInteger)wdith indexStrs_NavHidden:(NSMutableArray*)array indexStrs_LoginNeedLoad:(NSMutableArray *)array;方法来进行一些配置,并重写selectPageWithIndex方法,以便对判断是否需要弹出登录页面。
2)加入CTBaseSender,进行网络请求,包括baseUrl的设置,get,post,delete等网络请求的调用等。(需要导入afnetworking库)
3)测试h5增量升级功能
h5增量升级功能囊括了上述所有功能。首先app lunch时需要初始化基础页面,数据库,copyandunzip webapp包,然后发送app是否需要升级的request进行h5增量包的下载,数据库记录其版本操作。([H5DataDBUtil updateH5IncreaseData:[responseObject objectForKey:@"h5VersionList"]];
[[CTH5PackageManager sharedInstance] updateHybridModuleList];)
真正调h5页面是在CTH5ViewController loadURL时。此时会调用[[CTH5PackageManager sharedInstance] copyAndUnzipDownloadPackages];来把下载的增量包拷贝到webapp目录下并解压替换旧包。
一. Root模块
Root模块主要功能是创建navigationController,tabController,以及定义rootController等。
1.CTRootViewController里集成了一些方法,例如返回,view消失时cancelRequest,设置title,set navigationbar是否hidden,页面适配等。
2.CTDragNavigationController主要实现了push到下一个vc时往左边拉会显示上一个vc的截图的方法
3.CTHomeTabViewController里主要是对底部的tab bar点击事件的处理
4.由于drag时的效果不包括h5页面所以建一个CTH5RootViewController来过滤掉h5页面的此功能
5.由上述VC而引入了一些commonUI,包括CTRootWindow,CTRootView,CTAlertView,CTLoadingView,CTTableView,CTToastTipView,和一些UIView的扩展类。同时引入了一些基础的control,如CTNavigationBar,CTTelephone。
6.引用到一些基础的类如CtripTime和StringUtil
二. download模块
downloadBase文件夹里集成了携程的downloader方法,调用下载方法如下:
1.#import “CTDownloader.h"
2.调用[CTDownloader addDownloadTaskWithURL:[NSURL URLWithString:module.url] delegate:self];
3.实现download delegate 方法:
- (void)downloadDidFailWithOperation:(CTDownloadTaskOperation *)operation error:(NSError *)error
(void)downloadDidCompleteWithOperation:(CTDownloadTaskOperation *)operation data:(NSData *)data
三. 数据库模块
此应用设定两个数据库,一个存储用户数据,另一个存储其他内容。存储用户数据的可以在应用升级时先copy这些数据然后写入到新版本的数据库。引入了第三方库FMDB
在DB.m中初始化数据库把其从bundle目录拷贝到document目录下,如果是开发环境即 #ifdef InDev 发现app build版本变化就先把此数据库remove([fileManager removeItemAtPath:path error:NULL])再拷贝新的[fileManager copyItemAtPath:fromPath toPath:path error:NULL]。
在golf这个应用中我们实现了数据库的升级和对部分数据的备份,在InitDBUtil.m中实现,由此引入了一个CTDataBaseCopyBean model,这两部分的代码不放入基础框架中。
在调用时[[InitDBUtil alloc] initDB];即实现上述功能,在执行sql方法时首先根据不同功能创建DBUtil如H5DBUtil, OtherDBUtil,然后调用下述方法(sql的执行方法在DB.m里):
[[DbManager getInstance:DBType_CtripUserInfo]
excuteBySqlAndMapInTx:@"Other_setUserSetting"
bindParamsDic:bindParamDic
error:nil];
其中getInstance的参数定位了相应的数据库,excuteBySqlAndMapInTx的参数代表去Other_SqlMaps.plist中找setUserSetting这个key去找相对应的sql语句。InTx代表doInOneTx使用事务,还有NoTx则代表不使用事务。
数据库这边需要导入libsqlite3动态库
四.H5模块
H5这块包括
1.VC (CTH5ViewController CTH5TestViewController CTH5TestURLViewController)
所有的h5页面都是此创建CTH5ViewController,然后在其webview里load的。我们加入了CTH5TestViewController,这样方便测试,在CTH5TestViewController里定义了h5的log。
2.获取url的路径 (CTH5TravelURL CTH5URL)
要load一个html页面首先需要找到相对应的包。CTH5TravelURL的功能就是传入包名找到相对用的路径(调用[CTH5URL getHybridModulePath:H5ModuleName_Cpage])
3.CTH5URLCommand
对h5返回的url进行解析,然后分成_callbackTagName,_className,_methodName,_argumentsDict等。
4.CTH5PackageManager主要对webapp包进行操作,首先copy webapp.zip 从bundle到cache目录,然后解压到cache下的webapp文件夹下。然后下载h5增量包,下载成功将data写入到wb-download下的增量包.zip下,之后copy到webapp文件夹下然后解压。(这中间使用数据库记录了是否需要再次下载的逻辑:判断app升级的response,首先查找数据库中有无increasedata model的数据,没有的话就重新alloc这个model 赋值写入数据库(insert),有的话看这个model的dataversion与response的fullVersion是否相同,相同continue检查下一个包,不相同的话删除重写(delete and insert)此时isNeedUpdate写yes,直到download finish了再去数据库中把isNeedUpdate写成no(update))
5.h5这边的逻辑主要是获取command进行plugin分发,其中不乏native与js交互,获取json 字符串等动作,需要导入jsonkit包,压缩解压需要导入zip包和libz的动态库。
五.测试基础框架工程解析
1.基础框架静态库的生成与导入
将上述的模块加入静态库工程里,编译,运行时先选择ios device等待.a文件由红色变黑,选择模拟器设备如iphone5s运行,找到.a文件所在目录Debug-iphonesimulator(测试工程为模拟器运行对应的静态库也必须为相同模拟器device运行生成的,同样如果静态库为Debug-iphoneos下的,测试工程就需要在设备上运行)导入到测试工程。
鼠标选中静态库工程的target-build phases空白处,点击editor-add build phase-add headers build phase 把需要暴露的.h文件加入到public下,这样在编译运行之后.h会出现在include文件夹下,同.a文件一同拷贝出来才可以用。默认会放到Debug-iphoneos/usr/local/include下。
2.其中libsql和libz需要手动添加到测试工程中
3. 测试
1)新建一个TabViewController继承自CTHomeTabViewController,主要实现
-(void)initDataSourse:(NSInteger)numberOfBarButton normalImageNameArr:(NSMutableArray *)imageArr selectedImageNameArr:(NSMutableArray *)imageArr imageWdith:(NSInteger)wdith indexStrs_NavHidden:(NSMutableArray*)array indexStrs_LoginNeedLoad:(NSMutableArray *)array;方法来进行一些配置,并重写selectPageWithIndex方法,以便对判断是否需要弹出登录页面。
2)加入CTBaseSender,进行网络请求,包括baseUrl的设置,get,post,delete等网络请求的调用等。(需要导入afnetworking库)
3)测试h5增量升级功能
h5增量升级功能囊括了上述所有功能。首先app lunch时需要初始化基础页面,数据库,copyandunzip webapp包,然后发送app是否需要升级的request进行h5增量包的下载,数据库记录其版本操作。([H5DataDBUtil updateH5IncreaseData:[responseObject objectForKey:@"h5VersionList"]];
[[CTH5PackageManager sharedInstance] updateHybridModuleList];)
真正调h5页面是在CTH5ViewController loadURL时。此时会调用[[CTH5PackageManager sharedInstance] copyAndUnzipDownloadPackages];来把下载的增量包拷贝到webapp目录下并解压替换旧包。
相关文章推荐
- Android Studio 活动的最佳实践 知晓当前是在哪一个活动 随时随地地进入程序 启动活动的最佳写法 第一行代码
- 快捷方式连同程序一起卸载
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- Unity笔记 XML读写 防篡改MD5签名
- 新浪分享 Insufficient app permissions!
- GitHub上最火的40个iOS开源项目(二)
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
- GitHub上最火的40个iOS开源项目(一)
- GitHub上最火的74个Android开源项目(三)
- GitHub上最火的40个Android开源项目(二)
- 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台
- webview js alert出不来的问题
- 改变WebView字体大小
- GitHub上最火的40个Android开源项目(一)
- 配置Snappy压缩
- androidStudio自动黑盒测试
- Android APK反编译就这么简单 详解
- 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台
- swift 中UIColleCtion简单使用
- Android设置EditText中字体颜色不一致以及光标移至到字后边