一、前言
我們?cè)趇OS開發(fā)的過(guò)程中,往往后端和前端都是并行的,當(dāng)后端的接口沒有完善的時(shí)候就會(huì)影響到我們的開發(fā),而我也在我編程的過(guò)程中也經(jīng)歷過(guò)很多方法去制造假數(shù)據(jù),下面我就一一說(shuō)一下吧。
一起學(xué)習(xí)iOS開發(fā),加群:681503716?加群邀請(qǐng)碼:【墨子】,一起來(lái)學(xué)習(xí)吧!
二、方法
下面我們以如下的JSON字段進(jìn)行一下說(shuō)明
{
"code": 0,
"message": "成功",
"data": {
"website":"https://www.ianisme.com",
"list": [
{
"day": "30",
"month": "10",
"year": "2017"
}
]
}
}
2.1 Dictionary假數(shù)據(jù)
這種方法應(yīng)該說(shuō)是最不建議使用的方法了。假設(shè)我們工程中使用的是JSModel進(jìn)行Model層轉(zhuǎn)換的。
我們需要這樣寫一個(gè)NSDictionary

如圖所示我們就可以這樣去寫假數(shù)據(jù)了。這種方法是每次都要去修改和編輯大量代碼,并且關(guān)于網(wǎng)絡(luò)請(qǐng)求的代碼還測(cè)試不了,不推薦使用。
2.2 搭建后臺(tái)假數(shù)據(jù)
我們可以本地用搭建一個(gè)網(wǎng)站環(huán)境或者使用遠(yuǎn)程服務(wù)器去請(qǐng)求。
我會(huì)保存一個(gè)json文件,然后用一個(gè)php文件去調(diào)用。
header("Content-type: text/html; charset=utf-8");
$test = $_POST["s"];
$json_string = file_get_contents($test . '.json');
echo $json_string;
這種情況下,我們可以直接把a(bǔ)pp端的網(wǎng)絡(luò)請(qǐng)求代碼全部寫好,就相當(dāng)于模仿后臺(tái)的接口一樣,到時(shí)候切換后臺(tái)接口我們只需要更換下接口地址就行了。
2.3?APP端修改服務(wù)器數(shù)據(jù)
這里我們以 AFNetworking2.x 為例使用 NSURLProtocol 攔截 HTTP 請(qǐng)求。
創(chuàng)建NSURLProtocol的一個(gè)子類,重寫里面的startLoading方法。
- (void)startLoading{
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
[NSURLProtocol setProperty:@YES forKey:hasInitKey inRequest:mutableReqeust];
if?([mutableReqeust.URL.description containsString:@"api.ianisme.com"]) {
NSDictionary *dic = @{
@"code": @0,
@"message": @"成功",
@"data": @{
@"website": @"https://www.ianisme.com",
@"list": @[
@{
@"day": @"30",
@"month": @"10",
@"year": @"2017"
}
]
}
};
NSData *tempData = [self toJSONData:dic];
NSString *jsonString = [[NSString alloc] initWithData:tempData
encoding:NSUTF8StringEncoding];
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:mutableReqeust.URL
MIMEType:@"text/html"
expectedContentLength:data.length
textEncodingName:nil];
[self.client URLProtocol:self
didReceiveResponse:response
cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[self.client URLProtocol:self didLoadData:data];
[self.client URLProtocolDidFinishLoading:self];
}
else?{
self.myConnection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
}
}
此方法我們可以把相關(guān)網(wǎng)絡(luò)請(qǐng)求寫好,然后本地代碼攔截后臺(tái)的網(wǎng)絡(luò)請(qǐng)求,用假數(shù)據(jù)修改就行了。以上只是一個(gè)原理的演示,實(shí)際開發(fā),推薦使用強(qiáng)大的開源庫(kù)OHHTTPStubs, 他可以偽造的網(wǎng)絡(luò)數(shù)據(jù)和模擬的緩慢網(wǎng)絡(luò)來(lái)進(jìn)行調(diào)試。
傳送門->OHHTTPStubs
2.4?代理攔截網(wǎng)絡(luò)請(qǐng)求
這個(gè)是我比較推薦的一個(gè)方案,不需要修改app端代碼。一切無(wú)損對(duì)接后臺(tái)。
這就是利用代理軟件的 Map Local 功能,將請(qǐng)求轉(zhuǎn)換為請(qǐng)求電腦本地的靜態(tài)json文件。
我們以Charles為例,我們把本地的接口寫好之后,我們使用Charles抓一下這個(gè)接口的請(qǐng)求,此時(shí)肯定是失敗的。
如圖:
我們?nèi)?Map Local 指向電腦中的一個(gè)json文件。
如圖:
這樣我們就將此接口指向了電腦本地的一個(gè)json文件,我們可以用此方法,將所有的接口都分別指向本地的各自的 json 文件,當(dāng)后臺(tái)接口完畢后,我們就可以關(guān)閉 Map Local 無(wú)縫銜接到真正的后臺(tái)。
本文涉及到的部分代碼 -> 點(diǎn)我下載
三、總結(jié)
以上四個(gè)方法,我的推薦程度是由小到大的。我認(rèn)為最好不要去動(dòng)APP的代碼,所以我推薦第四種,趕快去嘗試一下吧!你用的哪種呢?歡迎留言交流。
參考與延伸: