iOS端设计文档

引言

  • APP采用object-c纯代码开发,未使用故事面板(storyboard),个别view采用xib(自定义cell可以是xib)。原因是:传送门

  • 布局我们采用Masonry布局。Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 。非常简单的使用纯代码实现autoLayout布局,是目前非常流行的手工布局框架 传送门

  • 使用MVC的设计模式,显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层

  • 使用AFNetworking为网络请求引擎,目前被95%以上的app所采用。 传送门

  • 使用cocoapods进行库的统一管理,使用方便,清晰明了(前期我一个人阔以不要)。传送门

项目版本管理

使用git管理代码,便于团队开发!

开发环境

操作系统:Mac os
开发软件:Xcode8.0
手机系统:iOS8.0~iOS10.3.3

安全策略

在涉及个人帐户信息有关网络请求,采用https方式,通过非对称密钥对请求串加解密,加密方式(MD5、AES )

框架目录结构

项目目录.png

工具箱

工具箱.png

工具箱:开发中用到的常用工具,让开发者的开发更加简易

  • XLBMacro:宏定义字段和方法、公用枚举
  • XLBCTool(工具类):loading框、浏览器、轮播图、扫码、自定义视图控件、常用方法工具类、定位、获取相册及相机、弹出菜单、第三方分享二次封装
  • XLBFoundation:Foundation类别
  • XLBUIKit:YNCUIKit类别

基类(XLBBase)

基类继承关系图
XLBBase.png
项目基类列表
  • ViewControllers
    • BaseViewController:所有控制器基类
    • BaseTabBarController:标签控制器基类
    • ListViewController:下拉刷新,上拉加载基类
    • WebViewController : 加载H5页面基类
  • BaseModel( 所有model的基类)
  • Views
    • BaseView:所有view的基类
    • BaseTableViewCell:所有自定义Cell基类
项目基类列表
  • BaseViewController
    <pre>
    -属性:
    -控制器推出类型
    -自定义导航条
    -导航条左侧按钮
    -导航条右侧按钮
    -导航条左侧按钮样式
    -方法:
    -显示重新加载视图
    -隐藏重新加载视图
    -没有网时,点击重新加载按钮(重新方法)
    -有网时的处理(重新方法)
    -无网络时的处理(重新方法)
    -创建没有数据时的视图
    -隐藏没有数据时的视图
    -设置导航条背景颜色
    -设置导航标题
    -导航条左侧按钮点击事件(重写方法)
    -导航条右侧按钮点击事件(重写方法)
    -推出模态视图
    -返回模态视图
    -推出导航视图
    -返回导航视图
    -返回到导航根视图
    </pre>

  • BaseViewModel

    • BaseModel.h
      <pre>#import <Foundation/Foundation.h>
      @interface BaseModel : NSObject <NSCoding>
      @end</pre>
  • BaseModel.mm
    <pre>#import "BaseModel.h
    #import <objc/runtime.h>
    #import <objc/message.h>
    @implementation BaseModel
    -(void)encodeWithCoder:(NSCoder *)aCoder {
    unsigned int outCount = 0;
    Ivar *vars = class_copyIvarList([self class], &outCount);
    for (int i = 0; i < outCount; i ++) {
    Ivar var = vars[i];
    const char *name = ivar_getName(var);
    NSString *key = [NSString stringWithUTF8String:name];
    id value = [self valueForKey:key];
    if (value) {
    [aCoder encodeObject:value forKey:key];
    }
    }
    }
    -(id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
    unsigned int outCount = 0;
    Ivar *vars = class_copyIvarList([self class], &outCount);
    for (int i = 0; i < outCount; i ++) {
    Ivar var = vars[i];
    const char *name = ivar_getName(var);
    NSString *key = [NSString stringWithUTF8String:name];
    id value = [aDecoder decodeObjectForKey:key];
    if (value) {
    [self setValue:value forKey:key];
    }
    }
    }
    return self;
    }
    @end
    </pre>

网络请求 (XLBNetwork)

采用AFNetworking,目前被95%以上的app所采用,并进行了二次封装,加入了缓存策略。采用block进行回调,返回成功、请求异常、请求失败。

项目基类列表
XLBNetWork.png
使用工具
  • AFnetworking网络框架
  • SQLite数据库
  • FMDB数据库操作工具
示例代码

<pre> WEAKSELF
[self showProgress];

[BaseHttpRequstManager loginu_name:u_name u_passwd:u_passwd type:type listener:^(NSString *error, NSDictionary *resultDic) {
    
    if ([CommonUtils IsOkNSDictionary:resultDic]>0) {
        
        if ([resultDic[@"code"] isEqualToString:@"CSD000"]) {
            
            [weakSelf HttpLoginResponse:resultDic];
        }
        else{
        
            [weakSelf hideProgress];
            
            NSString  *error=resultDic[@"msg"];
            NSString  *code=resultDic[@"code"];
            [self checkRetCode:code str:error];
        }
        
    }
    else{
        
        [weakSelf hideProgress];
    }
    
    
}];

</pre>

项目开发模块目录

项目开发模块.png
业务模块开发
  • 首页
  • 我的页面
  • 存管版(普通版)切换
业务模块开发
  • app启动:AppDelegate,启动广告,引导页,更新
  • 登录注册
  • 根视图控制器

开发模块设计模式

MVC设计框架
  • model:数据模型
  • view:视图显示
  • viewcontroller:视图控制器
基本流程

Model请求并对数据进行处理,将处理后的模型数据传递给viewcontroller,viewcontroller拿到数据后控制view的显示。
MVC 设计模式,显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度


MVC模型图.png

界面布局

使用Masnory工具,对Autolayerout和Size Classes的布局方式进行了封装,简单实用,节省了大量代码

数据存储方式

根据产品需要,数据从服务器下载和本地存储,本地数据分缓存和内存保留,经常读取的写入缓存,内存数据按大小,小的写入plist文件,大的写入数据库,用FMDB

地址信息:
plist文件写入。路径:(沙盒/Library/Caches)
用户数据本地化:
NSUserdefuat 本地存储。路径:(沙盒/Library/Preferences)
本地文件路径使用规范
1.Documents:
只有用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在<Application_Home>/Documents 目录下面,并将通过iCloud自动备份。
2.Library:
可以重新下载或者重新生成的数据应该保存在 <Application_Home>/Library/Caches 目录下面。举个例子,比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹。
3.tmp:
只是临时使用的数据应该保存到 <Application_Home>/tmp 文件夹。尽管 iCloud 不会备份这些文件,但在应用在使用完这些数据之后要注意随时删除,避免占用用户设备的空间

事件处理

有通知,代理和block(使用代理最多)

模型定义

使用MJExtension对请求数据进行model转化,是一套字典和模型之间互相转换的超轻量级框架,能对不同数据类型和不同数据结构进行处理。

网络图片加载

采用SDWebImage库进行处理,可以对图片进行异步加载并缓存

热补丁

ReactNative(跟王者荣耀一样)

支付功能

支付宝,微信,银行等支付功能严格按照文档开发,并做二次封装

地图

高德地图,百度地图(推荐使用百度,百度的定位准,开发简单)

代码规范

按照自己定制的代码开发规范进行开发,规范文档和代码要上传git,或者svn

统计

友盟统计,TalkingData

项目打包

通过蒲公英快速打包,生成二维码提供给出测试扫码下载

模块功能细分

由于整个APP都是我一个人做,我就是不细分了

总结

  • 合理的命名规则,推荐使用Class prefix name就是Class的前缀名,使用前缀名能够一定程度的避免你的Class和其他Framework / Library中的内容重名,也能够让你在Import或使用Class的时候比较方便寻找
  • 将一个大型Project其中的内容分组,不论Project的大小,我们都应该将View Controllers, Views, Objects, Frameworks, Resources,等等不同类型的文件,都按照他们的种类和具体用途进行了归类,这样在日后修改和添加内容时候都会同样的事半功倍
  • 常用代码的封装
  • 最后就是Comments(注释)的重要性

GitHub地址: https://github.com/jwh1650715313/app_demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容