最近最項目遇到個問題萧落,如下:
java.net.UnknownServiceException: CLEARTEXT communication to *** not permitted by network security policy
這玩意已經(jīng)看過 n 次,一直不知道是什么導(dǎo)致的辐真,今天剛好有空晒衩,就一探究竟吧。
在 Google 官網(wǎng)上,官方解釋道:
為保證用戶數(shù)據(jù)和設(shè)備的安全逃沿,Google針對下一代 Android 系統(tǒng)(Android P) 的應(yīng)用程序腾降,將要求默認使用加密連接,這意味著 Android P 將禁止 App 使用所有未加密的連接,因此運行 Android P 系統(tǒng)的安卓設(shè)備無論是接收或者發(fā)送流量臼予,未來都不能明碼傳輸。
需要使用下一代(Transport Layer Security)傳輸層安全協(xié)議梁剔,而 Android Nougat 和 Oreo 則不受影響怯晕。因此在Android P 使用HttpUrlConnection進行http請求會出現(xiàn)以下異常悠汽。
?W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
使用OKHttp請求則出現(xiàn)
?java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy
在Android P系統(tǒng)的設(shè)備上,如果應(yīng)用使用的是非加密的明文流量的http網(wǎng)絡(luò)請求芥驳,則會導(dǎo)致該應(yīng)用無法進行網(wǎng)絡(luò)請求柿冲,https則不會受影響,同樣地兆旬,如果應(yīng)用嵌套了webview假抄,webview也只能使用https請求。
總的來說丽猬,就是開發(fā)Android P系統(tǒng)及以上的App宿饱,禁止使用未加密的鏈接進行網(wǎng)絡(luò)請求,否則報錯脚祟。
針對這個問題谬以,有以下三種解決方法:
1、APP改用 https 請求
2由桌、targetSdkVersion 降到27以下
3为黎、更改網(wǎng)絡(luò)安全配置
前面兩個方法容易理解和實現(xiàn),具體說說第三種方法行您,更改網(wǎng)絡(luò)安全配置铭乾。
? ? 首先,在res文件夾下創(chuàng)建一個xml文件夾娃循,然后創(chuàng)建一個network_security_config.xml文件炕檩,文件內(nèi)容如下:
? <?xml version="1.0" encoding="utf-8"?>
? <network-security-config>
?????????????<base-config cleartextTrafficPermitted="true" />
? </network-security-config>
? ??接著,在AndroidManifest.xml文件下的application標(biāo)簽增加以下屬性
<application
?????...
?????android:networkSecurityConfig="@xml/network_security_config"
????... />
完成捌斧,這個時候App就可以訪問網(wǎng)絡(luò)了笛质。