多線程與網絡B

網絡基礎

  • 在網絡編程中,有幾個必須掌握的基本概念:
    • 客戶端(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" />
  • 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框架
  • 如果是大文件下載,建議使用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
      這裏寫圖片描述

檢測網絡狀態

  • 在網絡應用中,需要對用戶設備的網絡狀態進行實時監控,目的是
    • 讓用戶瞭解自己的網絡狀態,防止一些誤會(比如怪應用無能)
    • 根據用戶的網絡狀態進行智能處理,節省用戶流量,提高用戶體驗
      • 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

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方法即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章