需要開發(fā)一個特殊的app劈猿。所以需要用到networkExtension。但在使用過程中遇到了很多問題,在這里記錄一下尚胞。因為我自己也是新手在做這個的時候到處找不到資料很痛苦啊签钩。如果中間有錯誤的地方還請大佬們指正掏呼。
1.為什么要用networkExtension
蘋果巴巴為了省電等需求在我們的app退到后臺后,是不會讓我們的app活多久的。但是要做一個代理全部手機上網(wǎng)絡(luò)流量的app就需要能夠在我們的app退出后依然能夠工作铅檩。networkExtension就是蘋果給我們的方案憎夷。
2.創(chuàng)建target
在我們是用networkExtension的時候,它已經(jīng)不是我們當(dāng)前的app了而是一個獨立的app昧旨。所以就需要在當(dāng)前項目中創(chuàng)建一個netwokrExtension的target拾给。如截圖中箭頭指示的
第一步選擇添加一個target。
第二步選擇NetworExtension兔沃。然后輸入項目名稱就好了蒋得。
第三步 需要配置Netwokr Extensions 和 Personal XXX 這兩個權(quán)限在以前是需要去申請的,現(xiàn)在只要你的賬號是開發(fā)者賬號就可以直接選擇添加乒疏,選擇好了后是如p-2這樣的额衙。但是有一點不要忘了就我們的主app和擴展app的target這里都需要添加這兩個權(quán)限。
3.擴展app的調(diào)試及打印
調(diào)試
擴展app的調(diào)試根據(jù)擴展app的類型來區(qū)分有2種方式怕吴。
*? 一種是普通類型的APP 直接運行擴展app就好了窍侧。
*? 另一種是通知類 需要啟動主工程,然后選擇Xcode -> Debug -> Attach to process by pID or name? ?這里有個坑就是你需要輸入的是擴展app的 Display Name 而不是Bundie Idetifier转绷。我當(dāng)時就被這個坑慘了伟件。
打印
擴展的打印一直困擾了我很久。網(wǎng)上看到了很多方案议经,但是我都沒有跑通斧账。我這里就說一下我使用的方案。就是利用系統(tǒng)日志爸业。在console中輸出打印其骄。打印的方法在iOS10以前可以用NSLog() 方法直接就能夠把打印輸出到console中,在iOS10以后需要使用os_log()方法扯旷,如果你找不到這個方法拯爽,可以試著引入 import os庫。當(dāng)然os_log方法功能有限钧忽,這里推薦一個第三方庫CocoaLumberjack? OC和swift都支持毯炮。也是可以輸出到console中的。
4.擴展程序中添加橋接文件
在擴展程序中可能會用到OC/C/C++這些語言寫的類耸黑。我們就需要用到橋接文件了桃煎。和我們正常使用橋接文件是一樣的,你可以在擴展程序中新建一個橋接文件 然后在擴展程序的target中添加這個橋接文件大刊。就可以正常引用C/C++/OC的方法了为迈。
這里有一個建議就是在擴展程序中單獨建一個橋接文件,不和主app公用一個橋接文件。這樣橋接文件在引用頭文件時不會出現(xiàn)頭文件路徑不對,找不到的問題葫辐。
5.流量攔截及如何處理不希望攔截的流量
本身這個問題是和使用networkExtension沒有關(guān)系的搜锰,因為我自己腦子轉(zhuǎn)不過來在這個問題上卡了很久所以才拿出來說。當(dāng)我們使用packetFlow.readPackets讀取到ip數(shù)據(jù)包后耿战,我們把分析了數(shù)據(jù)后蛋叼,一部分?jǐn)?shù)據(jù)我們會代理,但是有一些數(shù)據(jù)我們不想處理怎么辦剂陡?我最后的解決方法是把這些數(shù)據(jù)在發(fā)到這些數(shù)據(jù)的目標(biāo)服務(wù)器去狈涮,是tcp就建立tcp連接發(fā)送,是udp就建立udp連接發(fā)送鸭栖。五元組的數(shù)據(jù)是能夠在ip數(shù)據(jù)包中拿到的歌馍。
6.一個可用的封裝的tun2socks ios庫
ios這邊我找了很久都沒有找到一個可以使用的tun2socks的庫,最后找到了這個庫纤泵。感覺很厲害
https://github.com/zapcannon87/ZPTCPIPStack