在AndroidP上使用Http

jarvanmo發表於2018-10-11

前言

不少同學在適配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對應用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"
...
    />

參考連結


相關文章