IOS項目總結——夢享一鍵連接SDK。
1、項目背景夢享網絡公司第一代核心產品,用於給第三方App提供WiFi連接能力,給流量消耗量比較大的App提供WiFi連接,從而增加用戶在移動場景的使用率與用戶粘性。
本SDK在業務方主要實現以下功能:
賬號認證類型WiFi,如CMCC-WEB、Chin.net、ChinaUniom、百米生活、114 free等公共WiFi。Token認證類型WiFi,如i-wifi、0-wifi、修遠WiFi、連樂WiFi等公共WiFi。雲認證類型WiFi,如花生WiFi、禾連、貝聯、金安陸。眾包連接,通過夢享密碼庫實現WiFi連接。
2、項目業績
App
所屬公司
SDK描述
對接時間
cookTalk
中興通信
運營商WiFi
2015/8
萬能鑰匙
上海連尚網絡科技
運營商WiFi
2015/9
WiFi浏覽器 上海聚玩網絡科技
運營商WiFi
2015/9
快牙
鄰動網絡科技
運營商WiFi
2015/11
花生WiFi 南方銀谷集團
運營商、商業、眾包WiFi
2016/8
阿裡雲OS
阿裡巴巴
眾包WiFi,代碼對接方式
2016/10
3、模塊圖層
3.1、設計思路
項目遵從模塊化開發的原則,嚴格按照三種類型的模塊進行分類組合:
業務強邏輯層:通過調用業務弱邏輯模塊、若邏輯模塊完成直接的業務邏輯代碼,不可重用性最高。業務弱邏輯層:通過調用弱邏輯層的功能模塊,針對業務需要封裝的模塊,完成諸如網絡層、持久層這些依據項目不同而規范不同的模塊,在項目內可重用。弱邏輯層:一些通用的功能模塊,與業務沒有直接或者間接的關系,可以直接挪動到別的項目使用,如A.networking、FMDB等。
依據以上的分層,項目主負責人可以專心設計業務弱邏輯層以及弱邏輯層,給項目制定統一的規范,而業務工程師只需要完成最核心的代碼即可,從而提高整個項目的可維護性,平緩學習曲線。
3.2、各模塊具體實現功能
業務強邏輯層 賬號認證模塊:Token認證模塊:雲認證模塊:眾包認證模塊一鍵連接功能模塊: 業務弱邏輯層 網絡層:持久層:config: 若邏輯層 日志記錄:加密模塊:helper/tool:
PS:
1、模塊的定義?
模塊是為了完成特定功能而組合起來的相關類。
4、實現方案
4.1、賬號認證
4.1.1、思路&背景
中國移動、中國聯通、中國電信提供的公共WiFi是通過特殊的賬號進行登錄的,而這些賬號上網是通過計時收錢的。還有另外一種同樣是通過賬號登陸的免費公共WiFi,如
114free、百米生活,這些WiFi是通過手機號注冊上網的,而且上網不會計費,但會彈出廣告或者推送周邊商戶信息。為了實現以上兩大類的賬號類型WiFi的登陸認證,我
們需要建立一個賬號池,當用戶在移動端請求什麼類型的WiFi登陸就發放相對應的賬號完成登陸。
客戶端需要考慮的問題:
1、賬號池的建立
2、響應賬號請求的規范
3、通信安全
4、賬號回收
5、盜號問題
移動端需要考慮的問題:
1、公共WiFi的識別
2、通信安全
3、自動登陸過程 下面主要討論公共WiFi的識別與自動登陸的實現,而通信安全在4.6節中討論。
4.1.2、實現方案
具體實現的時序圖如下所示:
Q&A:
(1)交換秘鑰的思路?
客戶端保存著服務器的公鑰,並用其加密隨機生成的AES加密秘鑰,每個AES隨機秘鑰對應一次的請求,下次的請求需要重新經歷前面的過程再生成,具體詳見4.6。
(2)公共WiFi的識別?
每個App在使用前必須調用negotiate接口,該接口請求成功,會返回一個json數據包,其中有個字段對應白名單,白名單裡面保存著該App可用的賬號認證、Token認證、雲認證的公共WiFi的相關信息。結合白名單結合匹配算法,即可得知該WiFi熱點是否能連接。
(3)自動登陸過程的實現?
實際上就是通過程序模擬用戶使用賬號登陸過程來實現自動登陸。而用戶登陸手動登陸的過程如下:
打開浏覽器隨機訪問網頁-》彈出protal頁面-》輸入賬號密碼-》認證完成。
所以用程序實現的過程就如下:
訪問浏覽器並實現重定向-》用正則匹配解析重定向網頁,獲取與登陸相關的字段-》用獲取回來的url與字段、賬號密碼發起post請求-》完成登陸認證。具體實現見代碼。
4.2、Token認證
4.2.1、思路&背景
Token認證實際上就是參考了HTTP的基本認證機制與摘要認證機制,而這裡的token認證不同的是不是通過http的header字段來傳參,而是通過post來傳輸參數。其中主要還是通過生成摘要的方式來認證身份,所以都是md5、base64之類的摘要算法的混合使用。
但Token認證的最大優勢是不需要聯網夢享服務器,只需要在直接按照與第三方協商好的方式生成摘要發送post報文,第三方服務器驗證成功則登陸成功,所以是效率比較高的方式。但不好的地方就是每個廠商都自己定制摘要生成的方式,需要管理繁多的摘要生成,這一點在雲認證裡
進行了優化。
4.2.2、具體實現
Token認證的時序圖如下:
token認證的具體實現比較簡單,這裡就不詳細講解,具體可見代碼。
需要考慮的點是如何組織繁多的token認證接口,從而方便調用,這點將要4.4中詳細解答。
4.3、雲認證
4.3.1、思路&背景
因為Token認證會帶來以下的諸多麻煩:
需要管理一堆的Token認證類,導致大量文件,增加工程體積需要將所有Token認證文件都打包進SDK,盡管用戶可能並不需要若需要增加Token認證文件時,需要重新給客戶打包SDK
正因為以上的不便,讓我們想出一種新的方式去完成Token類型的認證任務,那就是雲認證。雲認證其實就是把認證任務部署在服務器端而不是移動端,只做了這個小小的改動,那麼移動端就只需要實現一個通用的雲認證功能模塊,給服務器提供目前需要連接的WiFi信息與設備信息
然後由服務器直接與對方服務器通信,完成接下來的摘要生成與發送的任務,最後再間接給移動端反饋狀態即可。
4.3.2、具體實現
雲認證的時序圖如下:
雲認證的具體實現與Token認證十分相似,本質上的差異就是把摘要認證的任務放置到服務器中,所以這裡不做詳細說明。
4.4、賬號認證、Token認證、雲認證接口的調用優化
4.4.1、思路&背景
尋找運營商認證、Token認證、雲認證三者的共同點,我們可以發現都是輸入目標的AP的ssid、bssid,然後得到認證的返回狀態。所以我們可以尋找一種方式去管理以上的所有的類,一遍開發者能更好的調用,就是隨便輸入一個AP的ssid與bssid即可完成相關認證過程,而不理是什
麼類型的公共WiFi。
這裡我使用的工廠方法來實現這個目的。
4.4.2、具體實現
首先,工廠方法的類圖如下:
根據工廠方法的概念,設計出如上類圖,AuthPortalManager等價於ConcreCreator也就是工廠,而AuthAccoutType、AuthTokenType是實際的創建者creator,而它們都實現AuthPortalInterface接口,以確保通過AuthPortalManager的login、logout方法能正確調用目標的對象實現
上下線。
通過以上方式來組織以上幾個模塊,可以實現方便添加新的認證模塊與便捷調用的一系列好處。
4.5、眾包認證
4.4.1、思路&背景
眾包WiFi本質就是普通WiFi的認證,這些WiFi的認證通常都是諸如WEP、WPA、WPA2等方式認證,也可以理解為平常的密碼認證。要實現這些WiFi的認證就是從服務器裡獲取WiFi的賬號密碼,然後根據iOS系統的不同,獲取系統WiFi列表的方式有所差異:
iOS9.0之前的系統
(1)定位:通過定位獲取附近可用的WiFi,並返回WiFi的信息與密碼,通過粘貼密碼可以實現連接。
(2)圖片識別:通過截屏系統WiFi列表,文字識別獲取ssid,再通過定位減少搜索范圍,去請求服務器,獲取到截屏內WiFi的有效密碼,通過粘貼實現連接。
iOS9.0以上的系統
通過NEHotspotHelper這個網絡擴展框架類,實現密碼的預設置,從而實現一點擊連接眾包WiFi的效果。
但這裡討論的著重點是拿到WiFi列表後的眾包WiFi查詢的實現過程,而要作用眾包WiFi連接要做好以下四點考慮。
過濾信號過弱的WiFi兼容賬號認證WiFi請求過濾已經查詢過的WiFi緩存已經查詢過的WiFi
4.4.2、具體實現
因為實現眾包認證的QAD接口,每次輸入的數據是一個WiFi列表,所以若不做優化考慮去請求會造成發送和接收大量的請求、也會造成很多重復數據的請求,給服務端的造成影響也浪費本地的流量和內存。所以從下面四個方面進行優化設計。
(1)過濾信號過弱的WiFi
先立即過濾掉信號較弱的WiFi,因為信號較弱的WiFi通常連接不上而且連接上體驗也十分糟糕,所以這裡設置signal低於6.5的WiFi一律過濾掉。
(2)兼容賬號認證WiFi請求
若請求列表中包含賬號認證類型WiFi,由於在一鍵連接的過程中,是無法預先知道移動端到底是需要連接哪個WiFi,所以這裡設計了一個引導號機制,就是默認請求列表中所有符合白名單的賬號認證的賬號密碼並持久化保存,但這批賬號密碼的改密周期會延長。
當列表所需的賬號類型WiFi都有與之對應的賬號密碼並且沒過期,則不需要請求,否則則只請求缺少的部分。
(3)過濾已經查詢過的WiFi
在正式發起請求到服務器查詢之前,會過濾掉已經查詢過的AP,若被過濾的AP在有效查詢列中則直接作為結果返回。
為了優化查詢過程,這裡使用NSDictionary來作為緩存的容器,而key是“ssid”+“bssid”的字符串拼接,而value是就是password。
(4)緩存有效查詢過的WiFi
緩存從服務器返回的有效查詢列表,並給她們貼上生命周期標簽,在每次發起QAD請求前,都會將“以查詢列表”和“有效查詢列表”中已經過期的記錄刪除掉。
這裡使用NSDictionary來作為緩存的容器,而key是“ssid”+“bssid”的字符串拼接,而value是就是password。
具體流程圖如下:
4.6、一鍵連接功能(warning:一鍵連接功能還沒實現以下設計)
4.6.1、思路&背景
一鍵連接本質上就是應用了設計模式裡面的外觀模式,通過將上面的所有功能模塊進行一種恰當的封裝,從而實現開發者可以調用一行制定即可完成一鍵連接功能的注冊,之後就可以結合NEHotspotHelper實現跳轉到系統列表,然後用戶點擊一下帶有“夢享一鍵連接。以上就是iOS項目總結夢享一鍵連接SDK的全文介紹,希望對您學習和使用iOS開發有所幫助.[db:作者簡介][db:原文翻譯及解析]
【iOS項目總結夢享一鍵連接SDK】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!