需要開發(fā)一個特殊的app。所以需要用到networkExtension。但在使用過程中遇到了很多問題,在這里記錄一下。因為我自己也是新手在做這個的時候到處找不到資料很痛苦啊。如果中間有錯誤的地方還請大佬們指正。
1.為什么要用networkExtension
蘋果巴巴為了省電等需求在我們的app退到后臺后,是不會讓我們的app活多久的。但是要做一個代理全部手機上網(wǎng)絡流量的app就需要能夠在我們的app退出后依然能夠工作。networkExtension就是蘋果給我們的方案。
2.創(chuàng)建target
在我們是用networkExtension的時候,它已經(jīng)不是我們當前的app了而是一個獨立的app。所以就需要在當前項目中創(chuàng)建一個netwokrExtension的target。如截圖中箭頭指示的
第一步選擇添加一個target。
第二步選擇NetworExtension。然后輸入項目名稱就好了。

第三步 需要配置Netwokr Extensions 和 Personal XXX 這兩個權限在以前是需要去申請的,現(xiàn)在只要你的賬號是開發(fā)者賬號就可以直接選擇添加,選擇好了后是如p-2這樣的。但是有一點不要忘了就我們的主app和擴展app的target這里都需要添加這兩個權限。

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。我當時就被這個坑慘了。
打印
擴展的打印一直困擾了我很久。網(wǎng)上看到了很多方案,但是我都沒有跑通。我這里就說一下我使用的方案。就是利用系統(tǒng)日志。在console中輸出打印。打印的方法在iOS10以前可以用NSLog() 方法直接就能夠把打印輸出到console中,在iOS10以后需要使用os_log()方法,如果你找不到這個方法,可以試著引入 import os庫。當然os_log方法功能有限,這里推薦一個第三方庫CocoaLumberjack? OC和swift都支持。也是可以輸出到console中的。
4.擴展程序中添加橋接文件
在擴展程序中可能會用到OC/C/C++這些語言寫的類。我們就需要用到橋接文件了。和我們正常使用橋接文件是一樣的,你可以在擴展程序中新建一個橋接文件 然后在擴展程序的target中添加這個橋接文件。就可以正常引用C/C++/OC的方法了。
這里有一個建議就是在擴展程序中單獨建一個橋接文件,不和主app公用一個橋接文件。這樣橋接文件在引用頭文件時不會出現(xiàn)頭文件路徑不對,找不到的問題。

5.流量攔截及如何處理不希望攔截的流量
本身這個問題是和使用networkExtension沒有關系的,因為我自己腦子轉(zhuǎn)不過來在這個問題上卡了很久所以才拿出來說。當我們使用packetFlow.readPackets讀取到ip數(shù)據(jù)包后,我們把分析了數(shù)據(jù)后,一部分數(shù)據(jù)我們會代理,但是有一些數(shù)據(jù)我們不想處理怎么辦?我最后的解決方法是把這些數(shù)據(jù)在發(fā)到這些數(shù)據(jù)的目標服務器去,是tcp就建立tcp連接發(fā)送,是udp就建立udp連接發(fā)送。五元組的數(shù)據(jù)是能夠在ip數(shù)據(jù)包中拿到的。
6.一個可用的封裝的tun2socks ios庫
ios這邊我找了很久都沒有找到一個可以使用的tun2socks的庫,最后找到了這個庫。感覺很厲害
https://github.com/zapcannon87/ZPTCPIPStack