在Android P上使用Http
前言
不少同學在適配Android P的時候會遇到not permitted by network security policy 問題:
//使用HttpUrlConnection時遇到的異常 W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted //使用OkHttp時遇到的異常 java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy
這是由於我們所使用的介面並非https導致的:
Google表示,為保證使用者資料和裝置的安全,針對下一代 Android 系統(Android P) 的應用程式,將要求預設使用加密連線,這意味著 Android P 將禁止 App 使用所有未加密的連線,因此執行 Android P 系統的安卓裝置無論是接收或者傳送流量,未來都不能明碼傳輸,需要使用下一代(Transport Layer Security)傳輸層安全協議,而 Android Nougat 和 Oreo 則不受影響。
在Android P系統的裝置上,如果應用使用的是非加密的明文流量的http網路請求,則會導致該應用無法進行網路請求,https則不會受影響,同樣地,如果應用嵌套了webview,webview也只能使用https請求。
解決問題
主要方案有三種
- 使用https
- target降低至27
-
允許使用http
第一種方案當然是最好的了,強烈建議使用該方案。第二種方案也可行,但並不是長久之計,和大應用商店會紛紛效仿Google+Play/">Google Play對應用target有限制,所以這只是緩兵之計。但現實往往並不能迅速將所有介面替換為https。所以我們可以採取第三種方案。採用第三種方案需要在res 下新增一個 xml 目錄,然後建立一個名為:network_security_config.xml 檔案(名字自定) ,內容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然後在AndroidManifest.xml檔案下的*application*標籤增加以下屬性: <application ... android:networkSecurityConfig="@xml/network_security_config" ... />
ofollow,noindex">參考連結