網絡基礎
- 在網絡編程中,有幾個必須掌握的基本概念:
- 客戶端(Client):移動應用(iOS、android等應用)
- 服務器(Server):爲客戶端提供服務、提供數據、提供資源的機器
- 請求(Request):客戶端向服務器索取數據的一種行爲
- 響應(Response):服務器對客戶端的請求做出的反應,一般指返回數據給客戶端
服務器
- 按照軟件開發階段來分,服務器可以大致分爲2種
- 遠程服務器
- 別名:外網服務器、正式服務器
- 使用階段:應用上線後使用的服務器
- 使用人羣:供全體用戶使用
- 速度:取決於服務器的性能、用戶的網速
- 本地服務器
- 別名:內網服務器、測試服務器
- 使用階段:應用處於開發、測試階段使用的服務器
- 使用人羣:僅供公司內部的開發人員、測試人員使用
- 速度:由於是局域網,所以速度飛快,有助於提高開發測試效率
- 遠程服務器
網絡HTTP
URL
- 什麼是URL
- URL的全稱是Uniform Resource Locator(統一資源定位符)
- 通過1個URL,能找到互聯網上唯一的1個資源
- URL就是資源的地址、位置,互聯網上的每個資源都有一個唯一的URL
- URL的基本格式 = 協議://主機地址/路徑
- 協議:不同的協議,代表着不同的資源查找方式、資源傳輸方式
- 主機地址:存放資源的主機(服務器)的IP地址(域名)
- 路徑:資源在主機(服務器)中的具體位置
URL中常見的協議
- HTTP
- 超文本傳輸協議,訪問的是遠程的網絡資源,格式是http://
- http協議是在網絡開發中最常用的協議
- file
- 訪問的是本地計算機上的資源,格式是file://(不用加主機地址)
- mailto
- 訪問的是電子郵件地址,格式是mailto:
- FTP
- 訪問的是共享主機的文件資源,格式是ftp://
HTTP
- HTTP協議的作用
- HTTP的全稱是Hypertext Transfer Protocol,超文本傳輸協議
- 規定客戶端和服務器之間的數據傳輸格式
- 讓客戶端和服務器能有效地進行數據溝通
HTTP的基本通信過程
完整的http通信可以分爲2大步驟
- 請求:客戶端向服務器索要數據
- 響應:服務器返回客戶端相應的數據
發送HTTP請求的方法
- 在HTTP/1.1協議中,定義了8種發送http請求的方法
- GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
- 根據HTTP協議的設計初衷,不同的方法對資源有不同的操作方式
- PUT :增
- DELETE :刪
- POST:改
- GET:查
- 最常用的是GET和POST(實際上GET和POST都能辦到增刪改查)
GET和POST對比
- GET
- 在請求URL後面以?的形式跟上發給服務器的參數,多個參數之間用&隔開,比如http://ww.test.com/login?username=123&pwd=234&type=JSON
- 由於瀏覽器和服務器對URL長度有限制,因此在URL後面附帶的參數是有限制的,通常不能超過1KB
POST
- 發給服務器的參數全部放在請求體中
- 理論上,POST傳遞的數據量沒有限制(具體還得看服務器的處理能力)
選擇GET和POST的建議
- 如果要傳遞大量數據,比如文件上傳,只能用POST請求
- GET的安全性比POST要差些,如果包含機密\敏感信息,建議用POST
- 如果僅僅是索取數據(數據查詢),建議使用GET
- 如果是增加、修改、刪除數據,建議使用POST
iOS中發送HTTP請求的方案
- 在iOS中,常見的發送HTTP請求的方案有
- 蘋果原生(自帶)
- NSURLConnection:用法簡單,最古老最經典最直接的一種方案【坑比較多】
- NSURLSession:功能比NSURLConnection更加強大,蘋果目前比較推薦使用這種技術【2013推出,iOS7開始出的技術】
- CFNetwork:NSURL*的底層,純C語言
- 第三方框架
- ASIHttpRequest:外號“HTTP終結者”,功能極其強大,可惜早已停止更新
- AFNetworking:簡單易用,提供了基本夠用的常用功能,維護和使用者多
- MKNetworkKit:簡單易用,產自三哥的故鄉印度,維護和使用者少
- 蘋果原生(自帶)
HTTP通信過程 - 請求
HTTP協議規定:1個完整的由客戶端發給服務器的HTTP請求中包含以下內容
請求頭:包含了對客戶端的環境描述、客戶端請求信息等
GET /minion.png HTTP/1.1 // 包含了請求方法、請求資源路徑、HTTP協議版本 Host: 120.25.226.186:32812 // 客戶端想訪問的服務器主機地址 User-Agent: Mozilla/5.0 // 客戶端的類型,客戶端的軟件環境 Accept: text/html, */* // 客戶端所能接收的數據類型 Accept-Language: zh-cn // 客戶端的語言環境 Accept-Encoding: gzip // 客戶端支持的數據壓縮格式
請求體:客戶端發給服務器的具體數據,比如文件數據(POST請求纔會有)
HTTP通信過程 - 響應
- 客戶端向服務器發送請求,服務器應當做出響應,即返回數據給客戶端
HTTP協議規定:1個完整的HTTP響應中包含以下內容
響應頭:包含了對服務器的描述、對返回數據的描述
HTTP/1.1 200 OK // 包含了HTTP協議版本、狀態碼、狀態英文名稱 Server: Apache-Coyote/1.1 // 服務器的類型 Content-Type: image/jpeg // 返回數據的類型 Content-Length: 56811 // 返回數據的長度 Date: Mon, 23 Jun 2014 12:54:52 GMT // 響應的時間
響應體:服務器返回給客戶端的具體數據,比如文件數據
HTTP通信過程
常見響應狀態碼
網絡NSURLConnection
- NSURLRequest:一個NSURLRequest對象就代表一個請求,它包含的信息有
- 一個NSURL對象
- 請求方法、請求頭、請求體
- 請求超時
- … …
- NSMutableURLRequest:NSURLRequest的子類
NSURLConnection
- 負責發送請求,建立客戶端和服務器的連接
- 發送數據給服務器,並收集來自服務器的響應數據
NSURLConnection的使用步驟
- 創建一個NSURL對象,設置請求路徑
- 傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體
- 使用NSURLConnection發送請求
NSURLConnection發送請求
NSURLConnection常見的發送請求方法有以下幾種
同步請求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
異步請求:根據對服務器返回數據的處理方式的不同,又可以分爲2種
block回調
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
代理
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate; + (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate; - (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately; // 在startImmediately = NO的情況下,需要調用start方法開始發送請求 - (void)start;
成爲NSURLConnection的代理,最好遵守NSURLConnectionDataDelegate協議
NSURLConnectionDelegate
NSURLConnectionDataDelegate協議中的代理方法
- 開始接收到服務器的響應時調用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- 接收到服務器返回的數據時調用(服務器返回的數據比較大時會調用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- 服務器返回的數據完全接收完畢後調用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- 請求出錯時調用(比如請求超時)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子類,常用方法有
- 設置請求超時等待時間(超過這個時間就算超時,請求失敗)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;
- 設置請求方法(比如GET和POST)
- (void)setHTTPMethod:(NSString *)method;
- 設置請求體
- (void)setHTTPBody:(NSData *)data;
- 設置請求頭
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
創建GET和POST請求
- 創建GET請
NSString *urlStr = [@"http://120.25.226.186:32812/login?username=123&pwd=123" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- 創建POST請求
NSString *urlStr = @"http://120.25.226.186:32812/login";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 請求體
NSString *bodyStr = @"username=123&pwd=123";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
網絡JSON和XML
JSON
- 什麼是JSON
- JSON是一種輕量級的數據格式,一般用於數據交互
- 服務器返回給客戶端的數據,一般都是JSON格式或者XML格式(文件下載除外)
- JSON的格式很像OC中的字典和數組
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
標準JSON格式的注意點:key必須用雙引號
- 要想從JSON中挖掘出具體數據,得對JSON進行解析
- JSON 轉換爲 OC數據類型
JSON – OC 轉換對照表
JSON | OC |
---|---|
大括號{ } | NSDictionary |
中括號[ ] | NSArray |
雙引號“ ” | NSString |
數字10、10.8 | NSNumber |
JSON解析方案
- 在iOS中,JSON的常見解析方案有4種
- 第三方框架:JSONKit、SBJson、TouchJSON(性能從左到右,越差)
- 蘋果原生(自帶):NSJSONSerialization(性能最好)
- NSJSONSerialization的常見方法
// JSON數據 → OC對象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
// OC對象 → JSON數據
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
XML
- 什麼是XML
- 全稱是Extensible Markup Language,譯作“可擴展標記語言”
- 跟JSON一樣,也是常用的一種用於交互的數據格式
- 一般也叫XML文檔(XML Document)
- XML舉例
<videos>
<video name="小黃人 第01部" length="30" />
<video name="小黃人 第02部" length="19" />
<video name="小黃人 第03部" length="33" />
</videos>
XML語法
- 一個常見的XML文檔一般由以下部分組成
- 文檔聲明
- 元素(Element)
- 屬性(Attribute)
XML語法 – 文檔聲明
- 在XML文檔的最前面,必須編寫一個文檔聲明,用來聲明XML文檔的類型
// 最簡單的聲明
<?xml version="1.0" ?>
// 用encoding屬性說明文檔的字符編碼
<?xml version="1.0" encoding="UTF-8" ?>
XML語法 – 元素(Element)
- 一個元素包括了開始標籤和結束標籤
- 擁有內容的元素:
<video>小黃人</video>
- 沒有內容的元素:
<video></video>
- 沒有內容的元素簡寫:
<video/>
- 擁有內容的元素:
- 一個元素可以嵌套若干個子元素(不能出現交叉嵌套)
- 規範的XML文檔最多隻有1個根元素,其他元素都是根元素的子孫元素
元素的注意:XML中的所有空格和換行,都會當做具體內容處理
XML語法 – 屬性(Attribute)
- 一個元素可以擁有多個屬性
<video name="小黃人 第01部" length="30" />
// video元素擁有name和length兩個屬性
// 屬性值必須用 雙引號"" 或者 單引號'' 括住
- 實際上,屬性表示的信息也可以用子元素來表示
XML解析
要想從XML中提取有用的信息,必須得學會解析XML
- 提取name元素裏面的內容
<name>小黃人 第01部</name>
- 提取video元素中name和length屬性的值
<video name="小黃人 第01部" length="30" />
- 提取name元素裏面的內容
XML的解析方式有2種
- DOM:一次性將整個XML文檔加載進內存,比較適合解析小文件
- SAX:從根元素開始,按順序一個元素一個元素往下解析,比較適合解析大文件
iOS中的XML解析
- 蘋果原生
- NSXMLParser:SAX方式解析,使用簡單
第三方框架
- libxml2:純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析
- GDataXML:DOM方式解析,由Google開發,基於libxml2
XML解析方式的選擇建議
- 大文件:NSXMLParser、libxml2
- 小文件:GDataXML、NSXMLParser、libxml2
NSXMLParser
- 使用步驟
// 傳入XML數據,創建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 設置代理,監聽解析過程
parser.delegate = self;
// 開始解析
[parser parse];
- NSXMLParser採取的是SAX方式解析,特點是事件驅動,下面情況都會通知代理
- 當掃描到文檔(Document)的開始與結束
- 當掃描到元素(Element)的開始與結束
NSXMLParserDelegate
- 當掃描到文檔的開始時調用(開始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
- 當掃描到文檔的結束時調用(解析完畢)
- (void)parserDidEndDocument:(NSXMLParser *)parser
- 當掃描到元素的開始時調用(attributeDict存放着元素的屬性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
- 當掃描到元素的結束時調用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
GDataXML
- GDataXML基於libxml2庫,得做以下配置
- 導入libxml2庫
- 設置libxml2的頭文件搜索路徑(爲了能找到libxml2庫的所有頭文件)
- 在Head Search Path中加入/usr/include/libxml2
- 設置鏈接參數(自動鏈接libxml2庫)
- 在Other Linker Flags中加入-lxml2
- 由於GDataXML是非ARC的,因此得設置編譯參數
GDataXML使用
- GDataXML中常用的類
- GDataXMLDocument:代表整個XML文檔
- GDataXMLElement
- 代表文檔中的每個元素
- 使用attributeForName:方法可以獲得屬性值
JSON和XML比較:
JSON的體積小於XML,所以服務器返回給移動端的數據格式以JSON居多
網絡文件下載上傳
第三方解壓縮框架——ZipArchive
- 需要引入libz.dylib框架
- 導入頭文件Main.h
- 創建壓縮文件
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths;
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
- 解壓
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination
小文件下載
- 如果文件比較小,下載方式會比較多
- 直接用NSData的
+ (id)dataWithContentsOfURL:(NSURL *)url;
- 利用NSURLConnection發送一個HTTP請求去下載
- 如果是下載圖片,還可以利用SDWebImage框架
- 直接用NSData的
- 如果是大文件下載,建議使用NSURLSession或者第三方框架
文件上傳的步驟
- 設置請求頭
[request setValue:@"multipart/form-data; boundary=分割線" forHTTPHeaderField:@"Content-Type"];
設置請求體
非文件參數
--分割線\r\n Content-Disposition: form-data; name="參數名"\r\n \r\n 參數值 \r\n
文件參數
--分割線\r\n Content-Disposition: form-data; name="參數名"; filename="文件名"\r\n Content-Type: 文件的MIMEType\r\n \r\n 文件數據 \r\n
參數結束的標記
--分割線--\r\n
部分文件的MIMEType
獲得文件的MIMEType
- 利用NSURLConnection
- (NSString *)MIMEType:(NSURL *)url
{
// 1.創建一個請求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.發送請求(返回響應)
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
// 3.獲得MIMEType
return response.MIMEType;
}
網絡數據安全
提交用戶的隱私數據
- 一定要使用POST請求提交用戶的隱私數據
- GET請求的所有參數都直接暴露在URL中
- 請求的URL一般會記錄在服務器的訪問日誌中
- 服務器的訪問日誌是黑客攻擊的重點對象之一
數據安全
- 僅僅用POST請求提交用戶的隱私數據,還是不能完全解決安全問題
- 可以利用軟件(比如Charles)設置代理服務器,攔截查看手機的請求數據
- 因此:提交用戶的隱私數據時,一定不要明文提交,要加密處理後再提交
- 常見的加密算法
- MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES
- 加密算法的選擇
- 一般公司都會有一套自己的加密方案,按照公司接口文檔的規定去加密
MD5
- 什麼是MD5
- 全稱是Message Digest Algorithm 5,譯爲“消息摘要算法第5版”
- 效果:對輸入信息生成唯一的128位散列值(32個字符)
- MD5的特點
- 輸入兩個不同的明文不會得到相同的輸出值
- 根據輸出值,不能得到原始的明文,即其過程不可逆
- MD5的應用
- 由於MD5加密算法具有較好的安全性,而且免費,因此該加密算法被廣泛使用
- 主要運用在數字簽名、文件完整性驗證以及口令加密等方面
- MD5解密網站:http://www.cmd5.com
MD5改進
- 現在的MD5已不再是絕對安全,對此,可以對MD5稍作改進,以增加解密的難度
- 加鹽(Salt):在明文的固定位置插入隨機串,然後再進行MD5
- 先加密,後亂序:先對明文進行MD5,然後對加密得到的MD5串的字符進行亂序
… …
Charles
- 什麼是Charles
- Charles是一款代理服務器軟件,可以用來攔截網絡請求
- 利用Charles能得知大部分公司app的數據來源和數據格式
- 下載地址:http://www.charlesproxy.com/download/
快速設置
手機設置
授權手機訪問
Charles中文亂碼解決
- 在VMOptions中加一項:-Dfile.encoding=UTF-8
- 在VMOptions中加一項:-Dfile.encoding=UTF-8
檢測網絡狀態
- 在網絡應用中,需要對用戶設備的網絡狀態進行實時監控,目的是
- 讓用戶瞭解自己的網絡狀態,防止一些誤會(比如怪應用無能)
- 根據用戶的網絡狀態進行智能處理,節省用戶流量,提高用戶體驗
- WIFI\3G網絡:自動下載高清圖片
- 低速網絡:只下載縮略圖
- 沒有網絡:只顯示離線的緩存數據
- 蘋果官方提供了一個叫Reachability的示例程序,便於開發者檢測網絡狀態
Reachability
- Reachability的使用步驟
- 添加框架SystemConfiguration.framework
- 添加源代碼
- 包含頭文件
#import "Reachability.h"
- 常見用法
// 是否WIFI
+ (BOOL) IsEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否3G
+ (BOOL) IsEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
網絡監控
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
self.netReachability = [Reachability reachabilityForInternetConnection];
[self.netReachability startNotifier];
- (void)dealloc
{
[self.netReachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}
網絡NSURLSession
- 使用步驟
- 使用NSURLSession對象創建Task,然後執行Task
- Task的類型
獲得NSURLSession
- 獲得共享的Session
+ (NSURLSession *)sharedSession;
- 自定義Session
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
NSURLSessionTask
- 常見方法
- (void)suspend; // 暫停
- (void)resume; // 恢復
- (void)cancel; // 取消
@property (readonly, copy) NSError *error; // 錯誤
@property (readonly, copy) NSURLResponse *response; // 響應
NSURLSessionDownloadTask
- 常見方法
- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler; // 取消任務
網絡AFN
- 什麼是AFN
- 全稱是AFNetworking,是對NSURLConnection的一層封裝
- 雖然運行效率沒有ASI高,但是使用比ASI簡單
- 在iOS開發中,使用比較廣泛
- AFN的github地址
AFHTTPSessionManager
- AFHTTPSessionManager
- 是AFN中最重要的對象之一
- 封裝了HTTP請求的常見處理
- GET\POST請求
- 解析服務器的響應數據
// 創建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
GET\POST請求
- GET請求
- (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
- POST請求
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
- 文件上傳
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
監控聯網狀態
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%d", status);
}];
提示:要監控網絡連接狀態,必須要先調用單例的startMonitoring方法
網絡UIWebView
- 什麼是UIWebView
- UIWebView是iOS內置的瀏覽器控件
- 系統自帶的Safari瀏覽器就是通過UIWebView實現的
- UIWebView不但能加載遠程的網頁資源,還能加載絕大部分的常見文件
- html\htm
- pdf、doc、ppt、txt
- mp4
… …
- UIWebView常用的加載資源的方法
- (void)loadRequest:(NSURLRequest *)request;
鍵盤工具條顯示中文
常用屬性和方法
// 重新加載(刷新)
- (void)reload;
// 停止加載
- (void)stopLoading;
// 回退
- (void)goBack;
// 前進
- (void)goForward;
// 需要進行檢測的數據類型
@property(nonatomic) UIDataDetectorTypes dataDetectorTypes
// 是否能回退
@property(nonatomic,readonly,getter=canGoBack) BOOL canGoBack;
// 是否能前進
@property(nonatomic,readonly,getter=canGoForward) BOOL canGoForward;
// 是否正在加載中
@property(nonatomic,readonly,getter=isLoading) BOOL loading;
// 是否伸縮內容至適應屏幕當前尺寸
@property(nonatomic) BOOL scalesPageToFit;
監聽UIWebView的加載過程
- 成爲UIWebView的代理,遵守UIWebViewDelegate協議,就能監聽UIWebView的加載過程
// 開始發送請求(加載數據)時調用這個方法
- (void)webViewDidStartLoad:(UIWebView *)webView;
// 請求完畢(加載數據完畢)時調用這個方法
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// 請求錯誤時調用這個方法
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
// UIWebView在發送請求之前,都會調用這個方法,如果返回NO,代表停止加載請求,返回YES,代表允許加載請求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
JavaScript
什麼是JavaScript
- JavaScript是一門腳本語言,簡稱JS
- JS的常見作用有
- 給HTML網頁添加動態功能,比如響應用戶的各種操作
- 操縱HTML元素,比如添加、刪除、修改網頁元素
如何在OC中調用JavaScript代碼
- 使用UIWebView的stringByEvaluatingJavaScriptFromString方法即可