Android系统内部自带网络安全策略,会对app的网络请求进行安全认证,默认会自动阻拦内网http访问方式,可通过修改脚本或引入http包进行内网穿透,绕开安全策略.改写脚本的方式比较麻烦,但权限极高,引入http包的方法实现起来非常简单,但会有意想不到的异常.最好两种方法一起用,彻底解锁系统安全锁,
(方法一),脚本改写方式绕开安全策略
一,新建一个测试工程
1. 将原来控件删除,装入一个image控件
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp2.Views.HomePage"
Title="HomePage">
<VerticalStackLayout>
<Image Source="https://media.interflora.co.uk/i/interflora/anthurium2" VerticalOptions="Center"/>
</VerticalStackLayout>
</ContentPage>
2. 通过谷歌浏览器搜索图片,可将一张图片的的地址复制到uri中,就是这个链接
"https://media.interflora.co.uk/i/interflora/anthurium2"
默认的app是禁止软件绕开安全策略进行http网络请求的,只能通过https请求,这对于开发来说非常麻烦
3. 设置项目的脚本,使软件绕开安全策略
3.1 在项目文件中找到这个安卓配置脚本,用记事本打开,加上http请求策略,找AndroidManifest文件,
android:usesCleartextTraffic="true" //关闭http安全锁

3.2找到<application>插入 android:usesCleartextTraffic="true"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:usesCleartextTraffic="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
4. 在ios文件夹下的info.plist文件右键”打开方式”

4.1 选择 xml文本编辑器打开代码
4.2在代码这个位置插入脚本代码,绕开安全策略(红色的是插入进去的脚本)
<array>
<string>arm64</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UISupportedInterfaceOrientations</key>
<array>
5.保存文件后,app就具有http明文访问权限了,目前只测试了图片的请求,还没有确定其他的有没有问题
⦁ 使用http明文获取不安全网址的图片,并成功请求到了
页面的image控件图片地址改用了http明文模式进行请求,测试能正常访问到了
<Image Source="http://media.interflora.co.uk/i/interflora/anthurium2" VerticalOptions="Center"></Image>

(方法二).引入http进行网络请求
一.安装这个http依赖包

二在按键事件中新建一个http客户端对象
private void btu1_Clicked(object sender, EventArgs e)
{
var httpClient = new HttpClient();//建立http客户端对象
}
上面这种函数会导致系统崩溃的,因为他是同步方法进行网络请求,系统只开辟了一个线程进行工作,处理多任务时就会卡死.需要对按键方法进行改写,使其利用异步的方法发起网络请求
1.异步发起网络请求(报文以text格式)
GetAsync()这种方法只能请求简易string接口,接收json数据的话会出错
完整代码如下:
private async void btu1_Clicked(object sender, EventArgs e)
{
var httpClient = new HttpClient();//建立http客户端对象
var response= await httpClient.GetAsync("http://159.75.139.159:80/api/esp32/1");//异步方法get括号内填想访问的网址 string类型请求
var data =await response.Content.ReadAsStringAsync();//读取响应内容
btu1.Text=data;//读取的内容赋值给按钮文本
}
当然,这个网址是我自己的做的后台服务器,他的内容正好和我的app匹配,如果是别的服务器,你可能会请求到乱七八糟,或者错误的数据(这个服务器是我自己测试用,随时可能被我删掉,你请求不到也正常)
成功GET到服务器api接口,并读取了data数据"ok"写到软件上了


860

被折叠的 条评论
为什么被折叠?



