引言
APP采用object-c純代碼開發(fā)吧慢,未使用故事面板(storyboard),個(gè)別view采用xib(自定義cell可以是xib)。原因是:傳送門
布局我們采用Masonry布局。Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語法 采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布局 簡潔明了 并具有高可讀性 。非常簡單的使用純代碼實(shí)現(xiàn)autoLayout布局檐蚜,是目前非常流行的手工布局框架 傳送門
使用MVC的設(shè)計(jì)模式,顯示模塊與功能模塊的分離。提高了程序的可維護(hù)性沿侈、可移植性闯第、可擴(kuò)展性與可重用性,降低了程序的開發(fā)難度缀拭。它主要分模型咳短、視圖、控制器三層
使用AFNetworking為網(wǎng)絡(luò)請(qǐng)求引擎蛛淋,目前被95%以上的app所采用咙好。 傳送門
使用cocoapods進(jìn)行庫的統(tǒng)一管理,使用方便褐荷,清晰明了(前期我一個(gè)人闊以不要)勾效。傳送門
項(xiàng)目版本管理
使用git管理代碼,便于團(tuán)隊(duì)開發(fā)!
開發(fā)環(huán)境
操作系統(tǒng):Mac os
開發(fā)軟件:Xcode8.0
手機(jī)系統(tǒng):iOS8.0~iOS10.3.3
安全策略
在涉及個(gè)人帳戶信息有關(guān)網(wǎng)絡(luò)請(qǐng)求,采用https方式层宫,通過非對(duì)稱密鑰對(duì)請(qǐng)求串加解密,加密方式(MD5杨伙、AES )
框架目錄結(jié)構(gòu)
工具箱
工具箱:開發(fā)中用到的常用工具,讓開發(fā)者的開發(fā)更加簡易
- XLBMacro:宏定義字段和方法萌腿、公用枚舉
- XLBCTool(工具類):loading框限匣、瀏覽器、輪播圖毁菱、掃碼米死、自定義視圖控件、常用方法工具類贮庞、定位哲身、獲取相冊(cè)及相機(jī)、彈出菜單贸伐、第三方分享二次封裝
- XLBFoundation:Foundation類別
- XLBUIKit:YNCUIKit類別
基類(XLBBase)
基類繼承關(guān)系圖
項(xiàng)目基類列表
- ViewControllers
- BaseViewController:所有控制器基類
- BaseTabBarController:標(biāo)簽控制器基類
- ListViewController:下拉刷新,上拉加載基類
- WebViewController : 加載H5頁面基類
- BaseModel( 所有model的基類)
- Views
- BaseView:所有view的基類
- BaseTableViewCell:所有自定義Cell基類
項(xiàng)目基類列表
BaseViewController
<pre>
-屬性:
-控制器推出類型
-自定義導(dǎo)航條
-導(dǎo)航條左側(cè)按鈕
-導(dǎo)航條右側(cè)按鈕
-導(dǎo)航條左側(cè)按鈕樣式
-方法:
-顯示重新加載視圖
-隱藏重新加載視圖
-沒有網(wǎng)時(shí)怔揩,點(diǎn)擊重新加載按鈕(重新方法)
-有網(wǎng)時(shí)的處理(重新方法)
-無網(wǎng)絡(luò)時(shí)的處理(重新方法)
-創(chuàng)建沒有數(shù)據(jù)時(shí)的視圖
-隱藏沒有數(shù)據(jù)時(shí)的視圖
-設(shè)置導(dǎo)航條背景顏色
-設(shè)置導(dǎo)航標(biāo)題
-導(dǎo)航條左側(cè)按鈕點(diǎn)擊事件(重寫方法)
-導(dǎo)航條右側(cè)按鈕點(diǎn)擊事件(重寫方法)
-推出模態(tài)視圖
-返回模態(tài)視圖
-推出導(dǎo)航視圖
-返回導(dǎo)航視圖
-返回到導(dǎo)航根視圖
</pre>-
BaseViewModel
- BaseModel.h
<pre>#import <Foundation/Foundation.h>
@interface BaseModel : NSObject <NSCoding>
@end</pre>
- BaseModel.h
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>
網(wǎng)絡(luò)請(qǐng)求 (XLBNetwork)
采用AFNetworking捉邢,目前被95%以上的app所采用,并進(jìn)行了二次封裝商膊,加入了緩存策略伏伐。采用block進(jìn)行回調(diào),返回成功晕拆、請(qǐng)求異常藐翎、請(qǐng)求失敗。
項(xiàng)目基類列表
使用工具
- AFnetworking網(wǎng)絡(luò)框架
- SQLite數(shù)據(jù)庫
- FMDB數(shù)據(jù)庫操作工具
示例代碼
<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>
項(xiàng)目開發(fā)模塊目錄
業(yè)務(wù)模塊開發(fā)
- 首頁
- 我的頁面
- 存管版(普通版)切換
業(yè)務(wù)模塊開發(fā)
- app啟動(dòng):AppDelegate实幕,啟動(dòng)廣告吝镣,引導(dǎo)頁,更新
- 登錄注冊(cè)
- 根視圖控制器
開發(fā)模塊設(shè)計(jì)模式
MVC設(shè)計(jì)框架
- model:數(shù)據(jù)模型
- view:視圖顯示
- viewcontroller:視圖控制器
基本流程
Model請(qǐng)求并對(duì)數(shù)據(jù)進(jìn)行處理昆庇,將處理后的模型數(shù)據(jù)傳遞給viewcontroller,viewcontroller拿到數(shù)據(jù)后控制view的顯示末贾。
MVC 設(shè)計(jì)模式,顯示模塊與功能模塊的分離。提高了程序的可維護(hù)性整吆、可移植性拱撵、可擴(kuò)展性與可重用性,降低了程序的開發(fā)難度
界面布局
使用Masnory工具表蝙,對(duì)Autolayerout和Size Classes的布局方式進(jìn)行了封裝拴测,簡單實(shí)用,節(jié)省了大量代碼
數(shù)據(jù)存儲(chǔ)方式
根據(jù)產(chǎn)品需要府蛇,數(shù)據(jù)從服務(wù)器下載和本地存儲(chǔ)集索,本地?cái)?shù)據(jù)分緩存和內(nèi)存保留,經(jīng)常讀取的寫入緩存,內(nèi)存數(shù)據(jù)按大小抄谐,小的寫入plist文件渺鹦,大的寫入數(shù)據(jù)庫,用FMDB
地址信息:
plist文件寫入蛹含。路徑:(沙盒/Library/Caches)
用戶數(shù)據(jù)本地化:
NSUserdefuat 本地存儲(chǔ)毅厚。路徑:(沙盒/Library/Preferences)
本地文件路徑使用規(guī)范
1.Documents:
只有用戶生成的文件、其他數(shù)據(jù)及其他程序不能重新創(chuàng)建的文件浦箱,應(yīng)該保存在<Application_Home>/Documents 目錄下面吸耿,并將通過iCloud自動(dòng)備份。
2.Library:
可以重新下載或者重新生成的數(shù)據(jù)應(yīng)該保存在 <Application_Home>/Library/Caches 目錄下面酷窥。舉個(gè)例子咽安,比如雜志、新聞蓬推、地圖應(yīng)用使用的數(shù)據(jù)庫緩存文件和可下載內(nèi)容應(yīng)該保存到這個(gè)文件夾妆棒。
3.tmp:
只是臨時(shí)使用的數(shù)據(jù)應(yīng)該保存到 <Application_Home>/tmp 文件夾。盡管 iCloud 不會(huì)備份這些文件沸伏,但在應(yīng)用在使用完這些數(shù)據(jù)之后要注意隨時(shí)刪除糕珊,避免占用用戶設(shè)備的空間
事件處理
有通知,代理和block(使用代理最多)
模型定義
使用MJExtension對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行model轉(zhuǎn)化毅糟,是一套字典和模型之間互相轉(zhuǎn)換的超輕量級(jí)框架红选,能對(duì)不同數(shù)據(jù)類型和不同數(shù)據(jù)結(jié)構(gòu)進(jìn)行處理。
網(wǎng)絡(luò)圖片加載
采用SDWebImage庫進(jìn)行處理姆另,可以對(duì)圖片進(jìn)行異步加載并緩存
熱補(bǔ)丁
ReactNative(跟王者榮耀一樣)
支付功能
支付寶喇肋,微信,銀行等支付功能嚴(yán)格按照文檔開發(fā),并做二次封裝
地圖
高德地圖,百度地圖(推薦使用百度,百度的定位準(zhǔn),開發(fā)簡單)
代碼規(guī)范
按照自己定制的代碼開發(fā)規(guī)范進(jìn)行開發(fā),規(guī)范文檔和代碼要上傳git迹辐,或者svn
統(tǒng)計(jì)
友盟統(tǒng)計(jì),TalkingData
項(xiàng)目打包
通過蒲公英快速打包蝶防,生成二維碼提供給出測(cè)試掃碼下載
模塊功能細(xì)分
由于整個(gè)APP都是我一個(gè)人做,我就是不細(xì)分了
總結(jié)
- 合理的命名規(guī)則明吩,推薦使用Class prefix name就是Class的前綴名慧脱,使用前綴名能夠一定程度的避免你的Class和其他Framework / Library中的內(nèi)容重名,也能夠讓你在Import或使用Class的時(shí)候比較方便尋找
- 將一個(gè)大型Project其中的內(nèi)容分組,不論P(yáng)roject的大小贺喝,我們都應(yīng)該將View Controllers, Views, Objects, Frameworks, Resources,等等不同類型的文件菱鸥,都按照他們的種類和具體用途進(jìn)行了歸類,這樣在日后修改和添加內(nèi)容時(shí)候都會(huì)同樣的事半功倍
- 常用代碼的封裝
- 最后就是Comments(注釋)的重要性