作者:IT晴天
鏈接:https://www.jianshu.com/p/12ab6718e81c
來源:簡書
問題出現的原因是因為Android高版本(Android 6.0)以上默認使用TLS保護用戶信息,詳見以下文檔:
Transport Layer Security
摘錄關鍵信息如下:
Android致力於保證其用戶、設備和數據的安全。我們保證數據安全的一種方式是通過保護所有進入或離開使用TLS技術的Android設備數據。正如我們在Android P開發人員預覽版中所宣布的那樣,我們通過默認阻止Android P應用使用未加密連接通信來進一步提升安全性。
這是我們多年來為保護Android用戶所做的各種更改。為了防止意外的未加密連接,我們在Android Marshmallow(安卓6.0)中引入了android:usesCleartextTraffic 這樣一個manifest屬性。在Android Nougat(安卓7.0)中,我們通過創建網絡安全配置(Network Security Config)功能擴展了該屬性,該功能允許應用程序警告開發者在沒有加密的情況下發送網絡流量。在Android Nougat(安卓7.0)和Oreo(安卓8.0)中,我們仍然允許明文連接。
簡單地說,在Android高版本對非加密的明文傳輸有要求,也即默認啟用了TLS保護,使得該應用無法進行http網絡請求,而https則不會受影響,同樣地,如果應用嵌套了webview也會受這限制。
針對這種情況,有以下4種解決方案:
- 使用https。條件允許的話,建議使用,以增強安全性。
- Android編譯的targetSdkVersion改為27以下。因為是高版本才出現的,那可以降維處理;
- 在AnroidManifest.xml中的application添加設置項:
<application android:usesCleartextTraffic="true">
- 添加網絡安全配置。在res的xml目錄下,新建一個network_security_config.xml文件(名稱隨便取):
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然后在AnroidManifest.xml中的application添加指向該文件的設置項:
android:networkSecurityConfig="@xml/network_security_config"
其中,第1、2種方案都是有條件要求的,而第4種是第3種的擴展使用,可做更詳細的項配置。對於我們一般使用來說,其實也不需要用到特別的安全策略。
目前用方案:
綜合考量,第3種方案個人認為會好點,Cordova配合其使用也很簡單:
在config.xml文件中,在 <platform name="android"/>
節點內添加配置項即可
<edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application"> <activity android:usesCleartextTraffic="true" /> </edit-config>
這樣Cordova build的時候就會把上面配置合並到AnroidManifest.xml中。
