在AndroidP上使用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對應用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"
...
/>
相關文章
- 在伺服器上使用 smart http 搭建 Git 伺服器伺服器HTTPGit
- 在 Mac 上使用 JavaMacJava
- 在 Windows 上使用 FFmpegWindows
- 在 Linux 上使用 MultitailLinuxAI
- 在FreeBSD上使用DockerDocker
- 在 Linux 上使用 tarballLinux
- 在Linux上使用CANLinux
- 在 Windows 上使用 scp 命令Windows
- 使用 HTTP2 做開發伺服器 (上)HTTP伺服器
- 開始在 CentOS 上使用 dockerCentOSDocker
- 教你在 Ubuntu 上使用 LXC 容器Ubuntu
- 在Mac 上如何使用替代文字?Mac
- git hub在windows上的使用GitWindows
- 在 .NET 中使用 Flurl 高效處理Http請求HTTP
- 如何使用axios發出高大上的HTTP請求iOSHTTP
- Linux上使用HAProxy配置HTTP負載均衡系統LinuxHTTP負載
- Http歷險記(上)HTTP
- Docker Desktop 現在可以在 Linux 上使用DockerLinux
- 在Java中,使用HttpUtils實現傳送HTTP請求JavaHTTP
- 在 Linux 上使用 Window Maker 桌面Linux
- 在 Fedora 上使用 SSH 埠轉發
- 在 SAP Kyma 上使用 Redis 服務Redis
- 在iOS上使用MVVM進行路由iOSMVVM路由
- 在Arch上使用Syslinux替代GRUBLinux
- 在Ubuntu上安裝OpenShift並使用Ubuntu
- 在 Azure 上使用 Docker 執行 MonoDockerMono
- 在LINUX5.8上使用vncLinuxVNC
- 在Linux上使用raw device方式Linuxdev
- 在Ubuntu上使用Jetty部署War包UbuntuJetty
- Node.js使用HTTP上傳G級的大檔案Node.jsHTTP
- HTTP檔案上傳原理HTTP
- 在.NET 6 中如何建立和使用 HTTP 客戶端 SDKHTTP客戶端
- 使用 HTTP 上傳 G 級的檔案之 Node.js 版本HTTPNode.js
- 在 Ubuntu 上使用原始碼安裝 OpenRestyUbuntu原始碼REST
- 在 Windows 上使用 IIS 部署 PHP 專案WindowsPHP
- [譯] 在 iOS 上使用 Carthage 建立依賴iOS
- 建木在 Rainbond 上使用實踐AI
- 在安卓上使用OpenCV的指南 - kdnuggets安卓OpenCV