在北京時間 2018 年 8 月 7 日,Google 發佈的了 Android 9.0 (API 28),代號 「Pie」,其中一個新特性是:全部應用程序默認都使用 Https,這個會致使原 Http 請求無效。固然,開發人員能夠將 targetSdkVersion 設置成 26 ,但今年的 Google play store 要求新提交的應用必須將 targetSdkVersion 設置成 28,就是說應用必須適配 Https。java
俗話說:上有政策,下有對策。這裏將討論如何解決 Android 9.0(API 級別 28) Http 適配問題。目前有三種解決方案:android
APP 改用 Https 請求(須要服務器支持)安全
targetSdkVersion 降到 27 如下(包含 27)服務器
根據 Android的網絡安全性配置 自定義其網絡安全設置網絡
APP 將全部 Http 請求都換成 Https,這種是最完全的解決方式,也算是正規軍線路,但這個工做量可不小,還須要服務器支持,即服務器的全部 Http 請求接口也都換成 Https,不然也是無效的,在新項目或重要的項目,仍是建議這麼作。app
compileSdkVersion 26 defaultConfig { minSdkVersion 19 targetSdkVersion 26 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
targetSdkVersion 降到 27 如下(包含 27),雖然 Google play store 對新應用要求 API 28 (2019.08 開始),但國內的各大應用平臺,如 BAT 基本上只要求 API 26 便可,這一政策仍是去年末才生效,因此只作國內市場的話,將目標版本定爲 26 是還能夠持續一段時間的。gradle
若是項目是涉及海外市場,即必定要上 Google play store 又要使用 Http 接口,感受很矛盾的,固然了,也是有辦法處理,經過配置網絡安全設置可達到同樣的效果。ui
build.gradle 中的目標 API 設置:spa
compileSdkVersion 28 defaultConfig { minSdkVersion 19 targetSdkVersion 28 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
在清單文件 AndroidManifest.xml 的 application 標籤裏面設置 networkSecurityConfig 屬性以下:code
<application ... android:allowBackup="true" android:icon="${app_icon}" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" ...> </application>
在 res 目錄下新建 xml 文件夾,建立 xml 文件 network_security_config.xml 以下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"/> </network-security-config>
或
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>