iOS開發(fā)規(guī)范

【注意】

1赐稽、項目的基本配置以及權(quán)限的設(shè)置叫榕,杜絕私自做更改,若有需要更改請先聯(lián)系leaderf⒍妗N铩!
2括丁、項目中杜絕私自導(dǎo)入二進(jìn)制文件包括大文件寒匙;
3、項目新增圖片時躏将,應(yīng)先自行壓縮后,才可以導(dǎo)入到項目中使用考蕾;
4祸憋、在向relase分支發(fā)起merge request時,杜絕提交本地測試代碼以及測試入口肖卧;
5蚯窥、類名、屬性、函數(shù)拦赠、接口等命名時巍沙,命名及格式必須遵循開發(fā)規(guī)范;

前言
由于每個開發(fā)者的編碼習(xí)慣和風(fēng)格都不一樣荷鼠,為了保證開發(fā)效率句携,減輕代碼閱讀成本,隨著以后 APP 業(yè)務(wù)線越來越大允乐,代碼量越來越多時矮嫉,能保障代碼的可維護(hù)性,降低維護(hù)成本牍疏,方便高效定位解決問題蠢笋,所以從項目的細(xì)節(jié)到整體都希望根據(jù)此文檔來達(dá)到風(fēng)格統(tǒng)一,利于維護(hù)鳞陨。

約定
開發(fā)規(guī)范暫時劃分成兩個等級昨寞,分別是【必須】、【建議】厦滤。

  • 【必須】:必須遵守援岩。是不得不遵守的規(guī)范。
  • 【建議】:建議遵守馁害。有助于維護(hù)系統(tǒng)的穩(wěn)定和提高合作效率的規(guī)范窄俏。
    規(guī)范一旦實施,CodeReview的時候如果不符合碘菜,一定要重新修改后凹蜈,才可提交測試
    本文參考了蘋果官方編碼指南github上一些知名的編碼規(guī)范,主要由命名規(guī)范忍啸、編碼規(guī)范仰坦、安全開發(fā)構(gòu)成:

一、命名規(guī)范

1.1 通用命名規(guī)則
一般情況下计雌,通用命名規(guī)則適用于變量悄晃、常量、屬性凿滤、參數(shù)妈橄、方法、函數(shù)等翁脆。
【必須】自我描述性眷蚓。屬性/函數(shù)/參數(shù)/變量/常量/宏 的命名必須具有自我描述性。杜絕中文反番、拼音與英文混寫沙热、過度縮寫叉钥、或者無意義的命名方式。
【必須】駝峰命名方式篙贸。參數(shù)名投队、成員變量、局部變量爵川、屬性名都要采用首字母小寫的駝峰命名方式敷鸦。特殊情況除外。
【建議】一致性雁芙。屬性/函數(shù)/參數(shù)/變量/常量/宏 的命名應(yīng)該具有上下文或者全局的一致性轧膘,相同類型或者具有相同作用的變量的命名方式應(yīng)該相同或者類似。說明:具體來講兔甘,不同文件中或者不同類中具有相同功能或相似功能的屬性的命名應(yīng)該是相同的或者相似的谎碍。好處在于:方便后來的開發(fā)者減少代碼的閱讀量和提高對代碼的理解速度。比如:

// stockCode同時定義不同類中的洞焙,該屬性都代表同一個意思蟆淀,即合約代碼。
@property (readonly) NSUInteger stockCode;

【必須】清晰性澡匪。屬性/函數(shù)/參數(shù)/變量/常量/宏 的命名應(yīng)該保持清晰+簡潔熔任,如果魚和熊掌不能兼得炎疆,那么清晰更重要崭放。

命名 說明
removeObjectAtIndex: 規(guī)范的寫法
removeObject: 規(guī)范的寫法薪者,因為參數(shù)指明了要移除一個對象
remove: 不清晰断部,移除什么?

【建議】一般情況下第队,不要縮寫或省略單詞赌莺,建議拼寫出來泰讽,除非有共識的縮寫(btn,bgColor,VC)抢韭。當(dāng)然薪贫,在保證可讀性的同時,for循環(huán)中遍歷出來的對象或者某些方法的參數(shù)可以縮寫刻恭。

命名 說明
customButton 規(guī)范寫法
custBut 不清晰

1.2 縮寫規(guī)范
通常瞧省,我們都不應(yīng)該縮寫命名(參考General Principles)。然而鳍贾,下面所列舉的都是一些眾所周知的縮寫鞍匾,我們可以繼續(xù)使用這些古老的縮寫。在其他情況下骑科,我們需要遵循下面兩條縮寫建議:

  • 允許使用那些在C語言時代就已經(jīng)在使用的縮寫橡淑,比如allocgetc
  • 我們可以在命名參數(shù)的時候使用縮寫纵散。其他情況梳码,盡量不要使用縮寫。

1.3 Method命名規(guī)范
【必須】方法名也要采用小寫字母開頭的駝峰命名方式伍掀。特殊情況除外掰茶。
【建議】類、協(xié)議蜜笤、函數(shù)濒蒋、常量、枚舉等全局可見內(nèi)容需要添加三個字符作為前綴把兔。蘋果保留對任意兩個字符作為前綴的使用權(quán)沪伙。所以盡量不要使用兩個字符作為前綴。禁止使用的前綴包括但不限于:NS,UI,CG,CF,CA,WK,MK,CI,NC县好。
【必須】禁止在方法前面加下劃線“ _ ”围橡。Apple官網(wǎng)團(tuán)隊經(jīng)常在方法前面加下劃線"_"。為了避免方法覆蓋缕贡,導(dǎo)致不可預(yù)知的意外翁授,禁止在方法前面加下劃線。
【必須】自我描述性晾咪。方法的命名也應(yīng)該具有自我描述性收擦。杜絕中文拼音、過度縮寫谍倦、或者無意義的命名方式塞赂。
【必須】一致性。方法的命名也應(yīng)該具有上下文或者全局的一致性昼蛀,相同類型或者具有相同作用的方法的命名方式應(yīng)該相同或者類似宴猾。
【必須】所有參數(shù)前面都應(yīng)該添加關(guān)鍵字,參數(shù)之前的單詞盡量能描述參數(shù)的意義曹洽。
【必須】如果當(dāng)前子類創(chuàng)建的方法比從父類繼承來的方法更加具體明確鳍置。本身提供的方法更具有針對性。則不該重寫類本身提供的方法送淆。而是應(yīng)該單獨的提供一個方法税产,并在新的方法后面添加上必要的關(guān)鍵參數(shù)。

// UIView提供的方法
- (instancetype)initWithFrame:(CGRect)frame
// 更具針對性的方法
- (instancetype)initWithFrame:(CGRect)frame mode:(int)aMode cellClass:(Class)factory Id numberOfRows:(int)rows numberOfColumns:(int)cols;

1.4 Delegate方法命名規(guī)范
如果delegate對象實現(xiàn)了另一個對象的delegate方法偷崩,那么這個對象就可以在它自己某個指定的事件發(fā)生時調(diào)用delegate對象的delegate方法辟拷。delegate方法的命名有一些與眾不同的格式:【建議】以觸發(fā)消息的對象名開頭,省略類名前綴并且首字母小寫:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

1.5 Category命名規(guī)范
【必須】category中一般不要聲明屬性和成員變量阐斜。
【必須】避免category中的方法覆蓋系統(tǒng)方法衫冻。使用FFT前綴來區(qū)分系統(tǒng)方法和category方法。
1.6 Class命名規(guī)范
【必須】class的名稱應(yīng)該由兩部分組成谒出,F(xiàn)FT+className隅俘。即邻奠,class的名稱應(yīng)該包含一個前綴和一個名詞。
1.7 Notification命名規(guī)范
【必須】notification的命名使用全局的NSString字符串進(jìn)行標(biāo)識为居。命名方式如下:[相關(guān)類的名稱] + [Did | Will] + [可以標(biāo)識唯一的名稱] + Notification例如:

NSApplicationDidBecomeActiveNotification
NSWindowDidMiniaturizeNotification

【必須】object通常是指發(fā)出notification的對象碌宴,如果在發(fā)送notification的同時要傳遞一些額外的信息,請使用userInfo蒙畴,而不是object贰镣。

注:蘋果的初衷是通過這個object來限定哪些觀察者響應(yīng)通知的,意即object通常是指發(fā)出notification的對象膳凝,觀察者如果指定的object的內(nèi)存地址等于發(fā)送者的object碑隆,才會響應(yīng)通知(可以通過字符串測試推測出,蘋果的處理大概就是根據(jù)這個object內(nèi)存地址去判斷的)

1.8 常量命名規(guī)范
1.8.1 枚舉常量
【必須】使用枚舉類型來表示一組相關(guān)的整型常量。

typedef enum {
    /**首頁 1*/
    FFTTabTypeHome = 1蹬音,
    /**首頁 2*/
    FFTTabTypeHome2上煤,
    /**首頁 3*/
    FFTTabTypeHome3,
    /**首頁 4*/
    FFTTabTypeHome
} FFTTabType;

1.8.2 使用const關(guān)鍵字創(chuàng)建常量
【必須】使用const關(guān)鍵字創(chuàng)建浮點型常量祟绊。你也可以使用const來創(chuàng)建和其他常量不相關(guān)的整型常量楼入。否則,請使用枚舉類型來創(chuàng)建牧抽。即嘉熊,如果一個整型常量和其他常量不相關(guān),可以使用const來創(chuàng)建扬舒,否則阐肤,使用枚舉類型表示一組相關(guān)的整型常量,如項目中經(jīng)常有的協(xié)議ID讲坎、pageID孕惜、控件固定尺寸等:

#define PROTOCAL_ID  1232
#define VIEW_WIDTH  200

更換為:

typedef NS_ENUM(NSInteger,Count){
    PROTOCAL_ID  = 1232,
    VIEW_WIDTH  = 200};

1.8.3 字符串常量與宏定義
目前項目中埋點名稱等用的都是宏定義,需要優(yōu)化晨炕。
【必須】通常情況下衫画,不要使用#define預(yù)處理命令創(chuàng)建常量。正如上面所說瓮栗,對于整型常量削罩,使用枚舉創(chuàng)建;對于浮點型常量费奸,使用const修飾符創(chuàng)建弥激,字符串常量使用static修飾符創(chuàng)建。
【建議】通知的名字和字典的key愿阐,應(yīng)該使用字符串常量來定義微服。使用字符串常量編譯器可以進(jìn)行檢查,這樣可以避免拼寫錯誤
字符串常量應(yīng)該在.h頭文件中暴露給外部缨历,而字符串常量真正的賦值是在.m文件中以蕴。如下:

.h文件
extern NSString *const KReachablityChangedNotification;
.m文件
NSString * const KReachablityChangedNotification= @"KReachablityChangedNotification";

1.9 宏定義的使用及其命名規(guī)范

1.9.1 宏定義的使用
定義系統(tǒng)控件或屏幕尺寸糙麦、判斷系統(tǒng)版本、通知名稱丛肮、通用工具類喳资,沙盒等文件路徑等。

1.9.2 宏定義的命名規(guī)范
字母全大寫腾供,單詞直接用“_”連接。

1.9 圖標(biāo)命名規(guī)范
基本原則是把文件名分成四部分鲜滩,第一部分是圖片的邏輯歸屬分類(具體是可以體現(xiàn)圖標(biāo)位置)伴鳖,第二部分是圖標(biāo)的內(nèi)容的類型(具體為控件類型等),第三部分是圖片的表現(xiàn)內(nèi)容(具體可為功能徙硅、所代表意義)榜聂,第四部分是表示圖片表現(xiàn)的狀態(tài)。最好不要超過四部分嗓蘑,根據(jù)情況可做刪減须肆。
項目新增圖片時,應(yīng)先進(jìn)行圖片壓縮后桩皿,再進(jìn)行圖片導(dǎo)入豌汇,壓縮參考:https://tinypng.com或者https://imageoptim.com/mac

二、編碼規(guī)范

2.1 Init方法規(guī)范
Objective-C有designated Initializers和secondary Initializers的概念泄隔。designated Initializers叫做指定初始化方法或”全能初始化方法“拒贱。designated Initializers方法是指類中為對象提供必要信息以便其能完成工作的初始化方法。
【必須】所有secondary 初始化方法都應(yīng)該調(diào)用designated 初始化方法佛嬉。
【必須】所有子類的designated初始化方法都要調(diào)用父類的designated初始化方法逻澳。使這種調(diào)用關(guān)系沿著類的繼承體系形成一條鏈。
【必須】禁止子類的designated初始化方法調(diào)用父類的secondary初始化方法暖呕。否則容易陷入方法調(diào)用死循環(huán)斜做。如下:
【必須】另外禁止在init方法中使用self.xxx的方式訪問屬性。如果存在繼承的情況下湾揽,很有可能導(dǎo)致崩潰瓤逼。

2.2 dealloc規(guī)范
【必須】不要忘記在dealloc方法中移除通知和KVO。
【必須】在dealloc方法中钝腺,禁止將self作為參數(shù)傳遞出去抛姑,如果self被retain住,到下個runloop周期再釋放艳狐,則會造成多次釋放crash定硝。
【必須】和init方法一樣,禁止在dealloc方法中使用self.xxx的方式訪問屬性毫目。如果存在繼承的情況下蔬啡,很有可能導(dǎo)致崩潰诲侮。

2.3 Block規(guī)范
【必須】block的聲明copy
【必須】調(diào)用block時需要對block判空。
【必須】注意block潛在的引用循環(huán)箱蟆。

2.4 delegate規(guī)范
【必須】delegate的聲明weak

@property (nonatomic, weak) id<BannerCellDelegate> delegate;

2.5 代碼縮進(jìn)規(guī)范
不要在工程里使用默認(rèn) Tab 鍵沟绪,使用空格來進(jìn)行縮進(jìn)。在 Xcode > Preferences > Text Editing 將 Tab 和自動縮進(jìn)都設(shè)置為 4 個空格

2.6 空格規(guī)范
【必須】方法類型(-/ +符號)后應(yīng)有一個空格空猜;
【必須】參數(shù):符號前后不要有空格
【必須】運算符前后留空格绽慈;
【必須】方法大括號左邊留空格,不要另起一行辈毯;

2.7 UI規(guī)范
【必須】如果想要獲取window坝疼,不要使用view.window獲取。請使用[[UIApplication sharedApplication] keyWindow]谆沃。
【必須】在使用到 UIScrollView钝凶,UITableView,UICollectionView 的 Class 中唁影,需要在 dealloc 方法里手動的把對應(yīng)的 delegate, dataSouce 置為 nil耕陷。
【建議】當(dāng)訪問一個 CGRectxy据沈, width哟沫, height 時,應(yīng)該使用[CGGeometry 函數(shù)]锌介,推薦的寫法是這樣的:

CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);

不建議這樣的寫法:

CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;

2.8 IO規(guī)范
【建議】盡量少用NSUserDefaults南用。說明:[[NSUserDefaults standardUserDefaults] synchronize] 會block住當(dāng)前線程,知道所有的內(nèi)容都寫進(jìn)磁盤掏湾,如果內(nèi)容過多裹虫,重復(fù)調(diào)用的話會嚴(yán)重影響性能。
【建議】一些經(jīng)常被使用的文件建議做好緩存融击。避免重復(fù)的IO操作筑公。建議只有在合適的時候再進(jìn)行持久化操作。

2.9 數(shù)組尊浪、字典等集合類規(guī)范
【必須】不要用一個可能為nil的對象初始化集合對象匣屡,否則可能會導(dǎo)致crash。
【必須】同理拇涤,對插入到集合對象里面的對象也要進(jìn)行判空捣作。
【必須】注意在多線程環(huán)境下訪問可變集合對象的問題,必要時應(yīng)該加鎖保護(hù)鹅士。不可變集合(比如NSArray)類默認(rèn)是線程安全的券躁,而可變集合類(比如NSMutableArray)不是線程安全的。
【必須】禁止在多線程環(huán)境下直接訪問可變集合對象中的元素。應(yīng)該先對其進(jìn)行copy也拜,然后訪問不可變集合對象內(nèi)的元素以舒。

// 正確寫法
NSArray *array = [self.curveArray copy];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {//do something using obj}]; 
// 錯誤寫法
[self.curveArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    //do something using obj
    // 如果在enumerate過程中,其他線程對allItems這個可變集合進(jìn)行了變更操作慢哈,這里就有可能引發(fā)crash}]; 

【必須】注意使用enumerateObjectsUsingBlock遍歷集合對象中的對象時蔓钟,關(guān)鍵字return的作用域。block中的return代表的是使當(dāng)前的block返回卵贱,而非使當(dāng)前的整個函數(shù)體返回滥沫。
說明:其實block相當(dāng)于一個匿名函數(shù),在block中使用return返回键俱,僅是讓當(dāng)前這個匿名函數(shù)返回佣谐。
【建議】如果使用NSMutableDictionary作為緩存,建議使用NSCache代替方妖。
【建議】具有可變副本(例如NSString、NSArray罚攀、NSDictionary)的屬性聲明應(yīng)該選擇copy而不是strong党觅;

2.9 分支語句規(guī)范
【建議】if條件判斷語句后面必須要加大括號{}。不然隨著業(yè)務(wù)的發(fā)展和代碼迭代斋泄,極有可能引起邏輯問題杯瞻。
【必須】條件表達(dá)式多于3個必須用參數(shù)抽取成多個有意義的bool變量。
【建議】遵循gold path法則炫掐,不要把真正的邏輯寫到括號內(nèi)魁莉,避免多層嵌套。

// 不建議
- (void)someFuncWith:(NSString *)parameter {
    if (parameter) {
        // do something
        [self doSomething];
    }}
// 建議
- (void)someFuncWith:(NSString *)parameter {
    if (!parameter) {
        return;
    }
    // do something
    [self doSomething];}

【必須】使用switch...case...語句的時候募胃,不要丟掉default:旗唁。除非switch枚舉。
【必須】switch...case...語句的每個case都要添加break關(guān)鍵字痹束,避免出現(xiàn)fall-through检疫。

2.10 多線程規(guī)范
【必須】禁止使用GCD的dispatch_get_current_queue()函數(shù)獲取當(dāng)前線程信息。
【必須】對剪貼板的讀取必須要放在異步線程處理祷嘶,最新Mac和iOS里的剪貼板共享功能會導(dǎo)致有可能需要讀取大量的內(nèi)容屎媳,導(dǎo)致讀取線程被長時間阻塞。
【必須】禁止在非主線程中進(jìn)行UI元素的操作论巍。
【必須】在主線程中禁止進(jìn)行同步網(wǎng)絡(luò)資源讀取烛谊,使用NSURLSession進(jìn)行異步獲取。
【必須】如果需要進(jìn)行大文件或者多文件的IO操作嘉汰,禁止主線程使用丹禀,必須進(jìn)行異步處理。

2.11 內(nèi)存管理規(guī)范
【建議】函數(shù)體提前return時,要注意是否有對象沒有被釋放掉(常見于CF對象)湃崩,避免造成內(nèi)存泄露荧降。
【建議】請慎重使用單例,避免產(chǎn)生不必要的常駐內(nèi)存攒读。

內(nèi)存泄漏問題以及解決方案
(1) 控制器VC中代理的聲明出錯
代理的聲明使用weak關(guān)鍵字朵诫,如果用了retain、strong強引用聲明薄扁,有可能導(dǎo)致內(nèi)存泄漏剪返。
(2) 控制器VC中使用NSTimer出錯

[NSTimer scheduledTimerWithTimeInterval:1.0 
                                 target:self 
                               selector:@selector(todo:) 
                               userInfo:nil 
                                repeats:YES];

NSTimer創(chuàng)建時,關(guān)鍵在于timer對target(self)進(jìn)行了強引用邓梅,對象會進(jìn)行retain操作脱盲。既然是被強引用了就應(yīng)該使用__weak。并在離開頁面的時候停止定時器停止并把定時器置為nil就可以解決問題日缨。否則會導(dǎo)致對象不能釋放钱反,內(nèi)存泄漏!
補充:如果在非主線程的線程中只是創(chuàng)建一個NSTimer并啟動,該NSTimer是不會執(zhí)行的,除非將NSTimer加入到該線程的NSRunloop中,并啟動NSRunloop才行匣距。
(3) 控制器VC中Block使用錯誤
Block中直接使用成員變量(self.xxx)回造成循環(huán)引用面哥,導(dǎo)致?lián)碛性搶嵗膶ο蟛荒茚尫拧T贏RC下要 __weak注:Block一般用copy聲明毅待,這樣會把block從棧區(qū)移到堆區(qū)尚卫。這樣,在block中進(jìn)行回調(diào)或反向傳值到上個頁面時尸红,不會出現(xiàn)對象被釋放吱涉,內(nèi)存泄露問題。
(4) 由自定義封裝的控件使用錯誤
在控制器VC中自定義的控件View的使用中傳入了當(dāng)前VC或self外里,造成循環(huán)引用怎爵,這種情況下pop返回時,當(dāng)前頁面也不會被釋放盅蝗,dealloc也不會走疙咸。只有在離開頁面前,把該控件View先置為空nil风科。則可以撒轮。
(5) 避免野指針問題
僵尸對象:內(nèi)存已經(jīng)被回收的對象。
野指針:指向僵尸對象的指針贼穆,向野指針發(fā)送消息會導(dǎo)致崩潰题山。
(5) 檢測內(nèi)存泄漏、僵尸指針
XCode:scheme設(shè)置故痊,Instruments第三方庫:MLeaksFinder+FBRetainCycleDetector定位顶瞳。

2.12 延遲調(diào)用規(guī)范
【必須】performSelector:withObject:afterDelay:要在有Runloop的線程里調(diào)用,否則調(diào)用無法生效。說明:異步線程默認(rèn)是沒有runloop的慨菱,除非手動創(chuàng)建焰络;而主線程是系統(tǒng)會自動創(chuàng)建Runloop的。所以在異步線程調(diào)用是請先確保該線程是有Runloop的符喝。

2.13 注釋規(guī)范

  • 單行注釋使用 // 注釋單行代碼闪彼,最常見的使用場景是在方法內(nèi)注釋某個屬性或某塊區(qū)域的含義
  • 多行注釋使用 / 文本 / 的注釋格式(快捷鍵cmd+alt+/)可以對屬性和類以及方法進(jìn)行注釋,與//不同的是协饲,該注釋方式可以寫多行畏腕,一般使用在類的頭文件,多行介紹當(dāng)前類的含義
    【必須】如果方法茉稠、函數(shù)描馅、類、屬性等需要提供給外界或者他人使用而线,必須要加注釋說明铭污。
    【必須】如果你的代碼以SDK的形式提供給其他人使用,那么接口的注釋是必須的膀篮。必須對暴露給外界的所有方法嘹狞、屬性、參數(shù)加以注釋說明各拷。
    【建議】因為方法或?qū)傩员旧砭途哂凶晕颐枋鲂裕⑨寫?yīng)該簡明扼要闷营。

2.14 類的設(shè)計規(guī)范
【建議】盡量減少繼承烤黍,類的繼承關(guān)系不要超過3層∩得耍可以考慮使用category速蕊、protocol來代替繼承。
【建議】把一些穩(wěn)定的娘赴、公共的變量或者方法抽取到父類中规哲。子類盡量只維持父類所不具備的特性和功能。
【建議】.h文件中盡量不要聲明成員變量诽表。
【建議】.h文件中的屬性盡量聲明為只讀唉锌。
【建議】.h文件中只暴露出一些必要的類、公開的方法竿奏、只讀屬性袄简;私有類、私有方法和私有屬性以及成員變量泛啸,盡量寫在.m文件中绿语。

2.15 代碼組織規(guī)范

#pragma mark 
- Lifecycle
- (instancetype)init {}
#pragma mark 
- IBActions
- (IBAction)submitData:(id)sender {}
#pragma mark 
- Public
- (void)publicMethod {}
#pragma mark 
- Private
- (void)privateMethod {}
#pragma mark 
- ......Delegate
#pragma mark 
- setter&getter

2.16 工程結(jié)構(gòu)規(guī)范
【必須】為了避免文件雜亂,物理文件應(yīng)該保持和 Xcode 項目文件同步。
【建議】合理組織工程的內(nèi)的文件夾吕粹,工程中一般包括但不限于以下幾個文件夾category(分類)种柑、util/helper(工具類)、resource(資源)匹耕、const(常量)聚请、third(第三方)。
模塊目錄結(jié)構(gòu)遵循MVC:即業(yè)務(wù)名|Viewcontrolls控制器|Models數(shù)據(jù)|Views視圖

三泌神、安全開發(fā)規(guī)范

3.1 安全輸入
基本要求:
app應(yīng)提供客戶輸入銀行卡支付密碼的即時防護(hù)功能良漱,應(yīng)提供以下安全控制措施,或其他經(jīng)攻擊測試無法獲取明文的安全防護(hù)措施欢际。
a) 逐字符加密母市、字符加密。
b) 防范鍵盤竊聽患久。 防截屏|錄屏等

3.2 個人信息展示
基本要求:
a) app的輸入框應(yīng)默認(rèn)屏蔽顯示,屏蔽顯示時應(yīng)使用同一特殊字符(例如*)代 替浑槽。
b) app不應(yīng)明文顯示銀行卡密碼以及其他密碼蒋失。
c) app展示個人信息時,除銀行卡有效期外桐玻,用戶鑒別信息(如:卡片驗證碼篙挽、登錄密碼、支付密碼等)掩碼展示镊靴。

3.3 邏輯安全

3.4.1邏輯安全設(shè)計
基本要求:
a) 對于認(rèn)證铣卡、校驗等安全保證功能的流程設(shè)計應(yīng)充分考慮其合理性,避免邏輯漏洞的出現(xiàn)偏竟,確保認(rèn)證流程無法被繞過煮落。
b) 對于交易處理功能邏輯設(shè)計應(yīng)充分考慮其合理性,避免邏輯漏洞的出現(xiàn)踊谋,保證資金交易安全蝉仇。
c) app代碼實現(xiàn)應(yīng)盡量避免調(diào)用存在安全漏洞的函數(shù),避免敏感數(shù)據(jù)硬編碼殖蚕。

3.4.2 軟件權(quán)限控制
基本要求: app向移動終端操作系統(tǒng)申請權(quán)限時轿衔,應(yīng)遵循最小權(quán)限原則。

3.5 安全功能設(shè)計

3.5.1組件安全
基本要求:
a) app應(yīng)避免使用存在已知漏洞的系統(tǒng)組件與第三方組件睦疫。
b) app在使用第三方組件時呀枢,應(yīng)避免第三方組件未經(jīng)授權(quán)收集app信息 和個人信息。

3.5.2 抗攻擊能力
基本要求:
a) app應(yīng)具備基本的抗攻擊能力笼痛,能抵御靜態(tài)分析裙秋、動態(tài)調(diào)試等操作琅拌。
b) app代碼應(yīng)使用代碼加殼、代碼混淆摘刑、檢測調(diào)試器等手段對app進(jìn)行安全保護(hù)进宝。
c) app安裝、啟動枷恕、更新時應(yīng)對自身的完整性和真實性進(jìn)行校驗党晋,具備抵御篡改、 替換或劫持的能力徐块。
d)app如使用安全輸入控件未玻,該控件應(yīng)具備抵御一定程度攻擊的能力并采取適當(dāng) 的風(fēng)控措施,如:給予用戶風(fēng)險提示胡控。

3.6 數(shù)據(jù)安全

3.6.1數(shù)據(jù)防竊取
基本要求:
a) app應(yīng)保證內(nèi)存中不應(yīng)存在完整的銀行卡密碼和其他密碼扳剿。
b) app的臨時文件中不應(yīng)出現(xiàn)支付敏感信息,臨時文件包括但不限于 Cookies昼激、本地 臨時文件等庇绽。
c) app運行日志中不應(yīng)打印支付敏感信息,不應(yīng)打印完整的敏感數(shù)據(jù)原文橙困。
d) 應(yīng)采取技術(shù)手段防止內(nèi)存中加密的敏感數(shù)據(jù)被還原為明文瞧掺。
e) app應(yīng)實現(xiàn)身份認(rèn)證過程的防截屏、錄屏凡傅,如:輸入驗證碼辟狈、登錄密碼等。

3.6.2 數(shù)據(jù)防重放
基本要求: 通過app發(fā)起的身份認(rèn)證或資金類交易報文夏跷,應(yīng)能夠防止重放攻擊哼转。

3.6.3 個人信息存儲
基本要求:
a)app不應(yīng)以任何形式存儲用戶的敏感信息與支付相關(guān)的敏感信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拓春,一起剝皮案震驚了整個濱河市释簿,隨后出現(xiàn)的幾起案子亚隅,更是在濱河造成了極大的恐慌硼莽,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮纵,死亡現(xiàn)場離奇詭異懂鸵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)行疏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門匆光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酿联,你說我怎么就攤上這事终息《峁” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵周崭,是天一觀的道長柳譬。 經(jīng)常有香客問我,道長续镇,這世上最難降的妖魔是什么美澳? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮摸航,結(jié)果婚禮上制跟,老公的妹妹穿的比我還像新娘。我一直安慰自己酱虎,他們只是感情好雨膨,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逢净,像睡著了一般哥放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爹土,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天甥雕,我揣著相機(jī)與錄音,去河邊找鬼胀茵。 笑死社露,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琼娘。 我是一名探鬼主播峭弟,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脱拼!你這毒婦竟也來了瞒瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤熄浓,失蹤者是張志新(化名)和其女友劉穎情臭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赌蔑,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡俯在,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娃惯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跷乐。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趾浅,靈堂內(nèi)的尸體忽然破棺而出愕提,到底是詐尸還是另有隱情馒稍,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布浅侨,位于F島的核電站筷黔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仗颈。R本人自食惡果不足惜佛舱,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挨决。 院中可真熱鬧请祖,春花似錦、人聲如沸脖祈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖高。三九已至慎陵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喻奥,已是汗流浹背席纽。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留撞蚕,地道東北人润梯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像甥厦,于是被迫代替她去往敵國和親纺铭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 說是前言刀疙,其實也是本文誕生的目的舶赔。隨著公司業(yè)務(wù)的不斷增加,功能的快速迭代谦秧,app的業(yè)務(wù)線越來越多竟纳,代碼體積變...
    夢翔_d674閱讀 1,492評論 0 2
  • 前言說是前言,其實也是本文誕生的目的油够。隨著公司業(yè)務(wù)的不斷增加蚁袭,功能的快速迭代征懈,app的業(yè)務(wù)線越來越多石咬,代碼體積變得...
    Mr_yinwei閱讀 643評論 0 0
  • 前言 說是前言,其實也是本文誕生的目的卖哎。隨著公司業(yè)務(wù)的不斷增加鬼悠,功能的快速迭代删性,app的業(yè)務(wù)線越來越多,代碼體積變...
    隔墻送來秋千影閱讀 556評論 0 0
  • 前言 隨著公司業(yè)務(wù)的不斷增加焕窝,功能的快速迭代蹬挺,app的業(yè)務(wù)線越來越多,代碼體積變得越來越龐大它掂。同時巴帮,項目投入的開發(fā)...
    M_慕宸閱讀 859評論 1 5
  • 本規(guī)范原文來自Github.但是markdown格式有問題,我重新排了下虐秋。實際開發(fā)中根據(jù)具體情況決定如何取舍榕茧,但是...
    LeonXtp閱讀 465評論 0 0