該了解的iOS(三)之(WebService + JavaScriptCore)

該了解的iOS(三)之(WebService + JavaScriptCore)

WebService技術(shù)通過web協(xié)議提供服務(wù),保證不同平臺的應(yīng)用服務(wù)可以相互操作,為客戶端程序提供不同的服務(wù),這些服務(wù)大多都基于HTTP協(xié)議,HTTP協(xié)議基于請求和應(yīng)答,在需要的時候建立連接提供服務(wù),在不需要的時候斷開連接。

數(shù)據(jù)交換格式

數(shù)據(jù)交換格式主要分為純文本格式、XML格式和JSON格式,其中純文本格式是一種簡單的、無格式的數(shù)據(jù)交換格式,XML格式是一種字描述的數(shù)據(jù)交換格式,JSON格式是一種輕量級的數(shù)據(jù)交換格式。今天我主要整理下常用的XML和JSON。

  1. XML:是老牌的、經(jīng)典的、靈活的數(shù)據(jù)交換格式。XML文檔的基本框架可分為以下部分:
  • 聲明
  • 根元素
  • 子元素
  • 屬性
  • 命名空間
  • 限定名
<?xml version = "1.0" encoding = "UTF-8" ?>        <!--s聲明:定義了文件版本和使用的字符集-->
<soap:Body>                                        <!--它是由命名空間引出的概念,定義了元素和屬性合法標(biāo)識符-->
 <queryResponse xmlns = "http://tempuri.org/">     <!--命名空間,用于為XML提供名字唯一的元素和屬性-->
  <note id = "1">                                  <!--note是根元素的結(jié)束標(biāo)簽,id是屬性-->
   <to>XML</to>                                    <!--to,content,from,date都是子元素-->
    <content>是老牌的、經(jīng)典的、靈活的數(shù)據(jù)交換格式</content>
    <from>iOS小童</from>
    <date>2020-03-08</date>
  </note>
 </queryResponse>    
</soap:Body>

解析XML文件現(xiàn)在有兩種主流的,SAX和DOM

SAX-基于時間事件驅(qū)動,意思就是讀取的過程中,是由上往下的讀取xml文件,當(dāng)遇到節(jié)點的時候,觸發(fā)相應(yīng)的事件,使用上比較快,缺點是不能修改文件內(nèi)容。

DOM-以樹狀形式加載,加載后存放在內(nèi)存當(dāng)中,所以如果文件大,讀取的時間就會比較長,但是可修改文件。

  1. JSON:JSON與XML結(jié)構(gòu)相比,描述項目的字符少,那么傳輸速度就會提高,流量就會減少。構(gòu)成JSOn文檔的兩種結(jié)構(gòu)為對象和數(shù)組,對象是“名稱-值”,類似字典類型,而數(shù)組是一連串元素的集合。
<!--字典-->
{
  "Request" : {
    "body" : {
      "bIsInter" : false
      }
    }
}

<!--數(shù)組-->
{
  "ResultCode":0,"Record":[
     {"ID":"1","CDate":"2020-3-8","Name":"iOS小童"}
  ]
}
網(wǎng)絡(luò)協(xié)議

REST WebService是一個使用HTTP并遵循REST原則的WebService,使用URI來定位資源,webService數(shù)據(jù)交互使用JSON和XML等格式,WebService所支持的HTTP請求方法包括POST、GET、PUT、DELETE等。

  1. HTTP:超文本傳輸協(xié)議(Hypertext Transfer Protocol),網(wǎng)絡(luò)中使用的基本協(xié)議是TCP/IP,定義了8種請求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)。
  2. HTTPS:超文本傳輸安全協(xié)議(Hypertext Transfer Protocol Secure),是超文本傳輸協(xié)議和SSL的組合,用以提供加密通信及對網(wǎng)絡(luò)服務(wù)器身份的鑒定。
  3. TCP/IP:面向連接的協(xié)議,傳輸過程安全,有三次握手
  4. UDP:傳輸層協(xié)議,傳輸速度快,存在丟包
  5. Socket:Socket是一個套接字,封裝連接協(xié)議
  6. FTP:文件傳輸協(xié)議
  7. URL:統(tǒng)一資源定位符(Uniform Resource Locator)互聯(lián)網(wǎng)上的每個資源都有一個唯一的URL,通過這個個URL,能找到互聯(lián)網(wǎng)上唯一的一個資源。
  8. URI:通一資源標(biāo)志符(Uniform Resource Identifier)表示的是web上每一種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都由一個URI進行定位的。
  9. DNS:域名系統(tǒng)(Domain Name System)萬維網(wǎng)上作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP數(shù)串。

HTTPS是HTTP+SSL組合:

它們的區(qū)別有:HTTPS使用https://代替http://;HTTPS的端口號443,HTTP端口號80;SSL使用40位關(guān)鍵字作為RC4流加密算法;HTTPS和SSL支持使用X.509數(shù)字認(rèn)證;https協(xié)議需要到ca申請證書,一般免費證書很少,需要交費。

請求頭:                       <!--包含了對客戶端的環(huán)境描述、客戶端請求信息等-->
GET /minion.png HTTP/1.1      <!--包含了請求方法、請求資源路徑、HTTP協(xié)議版本--> 
Host: 120.25.226.186:32812    <!--客戶端想訪問的服務(wù)器主機地址-->
User-Agent: Mozilla/5.0       <!--客戶端的類型,客戶端的軟件環(huán)境-->
Accept: text/html             <!--客戶端所能接收的數(shù)據(jù)類型-->
Accept-Language: zh-cn        <!--客戶端的語言環(huán)境-->
Accept-Encoding: gzip         <!--客戶端支持的數(shù)據(jù)壓縮格式-->

TCP的三次握手:

客戶端向服務(wù)器發(fā)送消息(SYN),告訴服務(wù)器我將要發(fā)送數(shù)據(jù)。

服務(wù)器端接收到客戶端請求后,確認(rèn)自己準(zhǔn)備好接收數(shù)據(jù),并告知客戶端,我已經(jīng)準(zhǔn)備好,可以發(fā)送請求。(SYN +SCK)

客戶端接受到服務(wù)器端已準(zhǔn)備好接收的消息后,發(fā)送數(shù)據(jù)給服務(wù)器端。(ACK)

DNS劫持與防止

表現(xiàn):由惡意攻擊,攔截運營商的解析過程,把自己的非法東西嵌入其中。運營商為了利益或者一些其他的因素,允許一些第三方在自己的鏈接里打打廣告之類的。

防止:1. NSURLProtocol是蘋果提供給開發(fā)者的黑魔法之一,大部分的網(wǎng)絡(luò)請求都能被它攔截并且篡改,以此來改變URL的加載行為。這使得我們不必改動網(wǎng)絡(luò)請求的業(yè)務(wù)代碼,也能在需要的時候改變請求的細節(jié)。作為一個抽象類,我們必須繼承自NSURLProtocol才能實現(xiàn)中間攻擊的功能。2. 讓應(yīng)用每次啟動后從服務(wù)器下發(fā)對應(yīng)的DNS解析列表,直接從列表中獲取ip地址訪問。這種做法對比遞歸式的查詢,無疑效率要更高一些,需要注意的是在下發(fā)請求過程中如何避免解析列表被中間人篡改

加密與解密

加密技術(shù)利用一些技術(shù)手段,把重要的數(shù)據(jù)編程亂碼進行傳輸,到目的地后再進行解密和還原,防止數(shù)據(jù)被串改。數(shù)據(jù)加密分為對稱(私人密鑰加密)和非對稱加密(公開密鑰加密)。對稱加密以DES數(shù)據(jù)加密標(biāo)準(zhǔn)算法為代表,非對稱加密以RSA算法為代表。

  1. 對稱加密:對數(shù)據(jù)加密和解密使用相同的密鑰,其具有簡單快捷,密鑰較短,破譯困難等特點。
  2. 非對稱加密:對數(shù)據(jù)加密和解密使用不同的密鑰,一個公有密鑰,一個私有密鑰,如果使用公鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私鑰才能解密,相反亦之。

3DES加密 DES又叫數(shù)據(jù)加密標(biāo)準(zhǔn),3DES是三重數(shù)據(jù)加密算法的通稱,它相當(dāng)于對數(shù)據(jù)應(yīng)用三次DES加密算法,使得原版DES密碼的密鑰不容易被暴力破解,3DES提供一種增加密鑰長度來避免類似的攻擊。

SHA1 安全哈希算法,主要適用于數(shù)字簽名標(biāo)準(zhǔn)DSS里面定義的數(shù)字簽名算法DSA,對于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘要,當(dāng)接受消息時,這個摘要可以用來驗證數(shù)據(jù)的完整性,在傳輸?shù)倪^程中,數(shù)據(jù)很有可能會發(fā)生變化,那么這是就會產(chǎn)生不同的摘要。SHA1不可以從消息中復(fù)原信息,并且兩個不同的消息不會產(chǎn)生相同的摘要。

MD5 消息摘要算法第五版,是計算機安全領(lǐng)域廣泛使用的一種散列函數(shù),用于提供消息的完整性保護,經(jīng)有MD2,MD3,MD4發(fā)展而來。MD5可以將任意長度的字符串變成一個128bit的大整數(shù),并且它是一個不可逆的字符串變換算法,換句話說,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串。所以我們經(jīng)常對下載的軟件進行MD5校驗。

然而絕對安全是不存在的,各種針對iOS的攻擊依然存在,就是要開發(fā)者能夠通過加密技術(shù)對應(yīng)用中的敏感內(nèi)容進行保護,加強產(chǎn)品的防護能力。

JavaScriptCore

JavaScriptCore 為原生編程語言 Objective-C、Swift 提供調(diào)用 JavaScript 程序的動態(tài)能力,還能為 JavaScript 提供原生能力來彌補前端所缺能力。JavaScriptCore 框架主要由 JSVirtualMachine 、JSContext、JSValue 類組成。

JSVirturalMachine 的作用,是為 JavaScript 代碼的運行提供一個虛擬機環(huán)境。在同一時間內(nèi),JSVirtualMachine 只能執(zhí)行一個線程。如果想要多個線程執(zhí)行任務(wù),你可以創(chuàng)建多個 JSVirtualMachine。每個 JSVirtualMachine 都有自己的 GC(Garbage Collector,垃圾回收器),以便進行內(nèi)存管理,所以多個 JSVirtualMachine 之間的對象無法傳遞。JSContext 是 JavaScript 運行環(huán)境的上下文,負(fù)責(zé)原生和 JavaScript 的數(shù)據(jù)傳遞。JSValue 是 JavaScript 的值對象,用來記錄 JavaScript 的原始值,并提供進行原生值對象轉(zhuǎn)換的接口方法。

通過 JavaScriptCore 在原生代碼中調(diào)用 JavaScript 變量

// 創(chuàng)建 JSVirtualMachine 對象 jsvm
JSVirtualMachine *jsvm = [[JSVirtualMachine alloc] init];
// 使用 jsvm 的 JSContext 對象 ct
JSContext *ct = [[JSContext alloc] initWithVirtualMachine:jsvm];


JSContext *context  = [[JSContext alloc] init];
// 解析執(zhí)行 JavaScript 腳本
[context evaluateScript:@"var i = 4 + 8"];
// 轉(zhuǎn)換 i 變量為原生對象
NSNumber *number = [context[@"i"] toNumber];
NSLog(@"var i is %@, number is %@",context[@"i"], number);


// 解析執(zhí)行 JavaScript 腳本
[context evaluateScript:@"function addition(x, y) { return x + y}"];
// 獲得 addition 函數(shù)
JSValue *addition = context[@"addition"];
// 傳入?yún)?shù)執(zhí)行 addition 函數(shù)
JSValue *resultValue = [addition callWithArguments:@[@(4), @(8)]];
// 將 addition 函數(shù)執(zhí)行的結(jié)果轉(zhuǎn)成原生 NSNumber 來使用。
NSLog(@"function is %@; reslutValue is %@",addition, [resultValue toNumber]);




在原生代碼中調(diào)用 JavaScript 全局函數(shù),你需要使用 JSValue 的 invokeMethod:withArguments 方法

- (JSValue *)callJSMethod:(NSString *)method args:(NSArray *)args {
    WXLogDebug(@"Calling JS... method:%@, args:%@", method, args);
    return [[_jsContext globalObject] invokeMethod:method withArguments:args];
}

JavaScript調(diào)用原生代碼


// 在 JSContext 中使用原生 Block 設(shè)置一個減法 subtraction 函數(shù)
context[@"subtraction"] = ^(int x, int y) {
    return x - y;
};

// 在同一個 JSContext 里用 JavaScript 代碼來調(diào)用原生 subtraction 函數(shù)
JSValue *subValue = [context evaluateScript:@"subtraction(4,8);"];
NSLog(@"substraction(4,8) is %@",[subValue toNumber]);

JavaScriptCore 內(nèi)部是由 Parser(由 Parser 進行詞法分析、語法分析,生成字節(jié)碼)、Interpreter(由 Interpreter 進行解釋執(zhí)行,解釋執(zhí)行的過程是先由 LLInt(Low Level Interpreter)來執(zhí)行 Parser 生成的字節(jié)碼,JavaScriptCore 會對運行頻次高的函數(shù)或者循環(huán)進行優(yōu)化)、Compiler、GC 等部分組成,其中 Compiler 負(fù)責(zé)把字節(jié)碼翻譯成機器碼,并進行優(yōu)化

下次我主要針對《高性能iOS應(yīng)用》記錄一下如何優(yōu)化APP

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容