前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS定位的使用:地理/逆地理编码/判断目标经纬度是否在大陆

iOS定位的使用:地理/逆地理编码/判断目标经纬度是否在大陆

作者头像
公众号iOS逆向
发布于 2021-08-25 09:07:33
发布于 2021-08-25 09:07:33
2.4K00
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

前言

本文重点:

  • 定位
  • 地理编码
  • 判断目标经纬度是否在大陆 :https://kunnan.blog.csdn.net/article/details/119685526

通过经纬度进行判断。利用高德SDK进行判断。(如果是手动输入位置信息就进行逆地理编码获取经纬度

I、地理编码:geocode

  • 设置高德SDK apiKey
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [AMapServices sharedServices].apiKey = @"xxx";

1.1地理编码 API 服务地址

  • https://restapi.amap.com/v3/geocode/geo?parameters
  • get

1.2适用场景

  • 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。1、结构化地址举例:北京市朝阳区阜通东大街6号转换后经纬度:116.480881,39.989410 2、地标性建筑举例:天安门转换后经纬度:116.397499,39.908722
  • 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。1、例如:116.480881,39.989410 转换地址描述后:北京市朝阳区阜通东大街6号

1.3结构化地址信息address请求参数的要求

  • 规则遵循:国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦,如:北京市朝阳区阜通东大街6号。
  • 另外这个API的对地址的具体要求是:结构化地址的定义:首先,地址肯定是一串字符,内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意:针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略,但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息。
  • 需要对请求参数不准确,进行异常处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            CRMgeoDto *dto = [CRMgeoDto mj_objectWithKeyValues:responseObject];
            
            if(dto.status.integerValue == 1){
                // 获取经纬度 ,如果失败,提示【获取经纬度失败,请输入准确的经营地址!】
                
                
                
                
                
                
                void (^noLocationdataBlock)(void) = ^void(void) {
                    
                    [SVProgressHUD showInfoWithStatus:@"获取经纬度失败,请输入准确的经营地址!"];
                     

                };
                
//                responseObject:  {
//                    status = 1;
//                    info = OK;
//                    infocode = 10000;
//                    count = 0;
//                    geocodes = (
//                );
                if(dto.geocodes.count<=0){
                    
                    noLocationdataBlock();
                    return ;
                }
                
                CRMgeocodesDto *geocodesDto = dto.geocodes.firstObject;
                
                if([NSStringQCTtoll isBlankString:geocodesDto.location]){
                    noLocationdataBlock();

                    return ;

                    
                }

                NSArray *array = [responseObject[@"geocodes"][0][@"location"] componentsSeparatedByString:@","];
                
                if(array.count<=1){
                    noLocationdataBlock();

                    return;
                }

1.4接口返回的格式

  • 返回的dto模型定义
  • location
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            location = "114.468664,38.037057";

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-04-10 11:43:29.914038+0800 Housekeeper[943:136269] responseObject:  {
    count = 1;
    geocodes =     (
                {
            adcode = 350503;
            building =             {
                name =                 (
                );
                type =                 (
                );
            };
            city = "\U6cc9\U5dde\U5e02";
            citycode = 0595;
            country = "\U4e2d\U56fd";
            district = "\U4e30\U6cfd\U533a";
            "formatted_address" = "\U798f\U5efa\U7701\U6cc9\U5dde\U5e02\U4e30\U6cfd\U533a\U5bcc\U5927\U53a6";
            level = "\U5174\U8da3\U70b9";
            location = "118.620285,24.908597";
            neighborhood =             {
                name =                 (
                );
                type =                 (
                );
            };
            number =             (
            );
            province = "\U798f\U5efa\U7701";
            street =             (
            );
            township =             (
            );
        }
    );
    info = OK;
    infocode = 10000;
    status = 1;
}

1.5 通过逆地理编码进行判断是否在大陆

  • 判断目标经纬度是否在大陆 :https://kunnan.blog.csdn.net/article/details/119685526

通过经纬度进行判断。利用高德SDK进行判断。(如果是手动输入位置信息就进行逆地理编码获取经纬度

II、定位

2.1 获取定位信息

  • 使用方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [[ProjectMethod shareProjectMethod] SingleLocation:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
        
        [[QCT_Common getCurrentVC] hideHUD];
        
        // 定位失败
        if (error)
        {
            if (error.code == AMapLocationErrorLocateFailed)
            {
                return;
            }

            NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
            
            NSString *UserInfo = error.userInfo[@"NSLocalizedDescription"];
            
            [self showHUDMessage:UserInfo?UserInfo:@"定位失败请重新再试!"];
            
            
        }
        // 定位成功
        if (regeocode)
        {
            NSLog(@"reGeocode:%@", regeocode);
            
            
            if (regeocode)
            {
                
                
                if([ERPAMapLocationTool inChineseMainlandWithCLLocation:location regeocode:regeocode]){
                    
                    
                }else{
                    //如不在大陆,则不允许其修改定位,提示“您最新定位不在支持范围内!”。

                    [self showHUDMessage:@"您最新定位不在支持范围内!"];

                    
                    return;
                }
                
                
                NSString *text = [NSString stringWithFormat:@"%@%@%@",regeocode.street,regeocode.number,regeocode.POIName];
                
                
                self.address = regeocode.formattedAddress ?regeocode.formattedAddress :@"";
                
                
                /**
                 provinceName (string, optional): 省名称 ,
                 cityName (string, optional): 市名称 ,
                 areaName (string, optional): 区名称 ,
                 address (string, optional): 详细位置 ,
                 longitude1 (string, optional): 经度 ,
                 longitude2 (string, optional): 纬度 ,
                 nature (integer, optional): 客户类型 ,
                 */
                
                
                // 需要保存经纬度
                NSString*  lon = [NSString stringWithFormat:@"%f", location.coordinate.longitude];
                NSString*  lat = [NSString stringWithFormat:@"%f", location.coordinate.latitude];
                
                // 保持起来。更新TV
                
                weakSelf.longitude1 = lon;
                weakSelf.longitude2 = lat;
                
                
                
                [_tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:1]] withRowAnimation:UITableViewRowAnimationNone ];
                
                
                
                [weakSelf setupk_API_Account_Merchant_UpdateMerchantGeo];
                
                
                
                
            }
            
            
            
            
            
            
            
        }
    }];
  • SingleLocation的实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)SingleLocation:(AMapLocatingCompletionBlock)completionBlock{
    
    
    
    // 先判断状态,比如是否进行授权
    
    
    
    self.location = [[AMapLocationManager alloc]init];
    
//    判断用户是否授权应用获取定位权限
//    iOS开发检测是否开启定位: showAlert
    
    
    if (![QCTSession isHasLocationAuthorityWithisShowAlert:YES]) {
        return;
    }
    
//    [[QCT_Common getCurrentVC] showHUDProgressWithMessage:@"定位中..." style:MBPHUDProgressStyleAnnular];
    [[QCT_Common getCurrentVC] showHUDProgressWithMessage:@"定位中..." style:MBPHUDProgressStyleNormal];

    
    [self.location setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
    //   定位超时时间,最低2s,此处设置为2s
    self.location.locationTimeout = 2;
    //   逆地理请求超时时间,最低2s,此处设置为2s
    self.location.reGeocodeTimeout = 2;
    
//    [self showHUDProgressWithMessage:@"定位中..." style:MBPHUDProgressStyleAnnular];

    [self.location requestLocationWithReGeocode:YES completionBlock:completionBlock];
//    [self hideHUD];

}

  • 针对kCLAuthorizationStatusNotDetermined的处理【[AMapLocationKit] 要在iOS 11及以上版本使用后台定位服务, 需要实现amapLocationManager:doRequireLocationAuth: 代理方法问题及解决方案】
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 
 1、 限制境外定位  (优化定位权限检查的处理逻辑:主要针对iOS13访问位置信息信息新增的【下次询问】的场景):iOS 13新增App地理位置访问“仅允许一次”
 1.1):测试方法: 先设置【使用app时允许】,再去系统的设置修改定位信息的权限为:【下次询问】。回到app去更新定位信息。

 定位之前,先检测权限,如果是kCLAuthorizationStatusNotDetermined的时候,需要实现这个方法,来让用户进行选择。

     kCLAuthorizationStatusNotDetermined  //用户没有选择是否要使用定位服务(弹框没选择,或者根本没有弹框)

 */

- (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager
{
    [locationManager requestAlwaysAuthorization];
}


  • 监听定位状态
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)amapLocationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:

            break;
        case kCLAuthorizationStatusDenied:
        {
            [QCTSession setupkCLAuthorizationStatusDenied];

        }
            break;
        default:
            break;
    }
//    [[QCT_Common getCurrentVC] hideHUD];

}

  • 修改定位未开启的提示语 setupkCLAuthorizationStatusDenied
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+(void)setupkCLAuthorizationStatusDenied{
    
//    [[QCT_Common getCurrentVC] hideHUD];

    [LBAlertController showAlertTitle:@"定位服务未开启" content:@"请进入系统「设置」》「隐私」》「定位服务」\"中打开开关,并允许全城淘使用定位服务" cancelString:@"取消" cancleBlock:nil sureString:@"立即开启" sureBlock:^{

        
        // 需要在info.plist中添加 URL types 并设置一项URL Schemes为prefs  IOS10 以后不起作用
        if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]){
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
    } currentController:[QCT_Common getCurrentVC]];

    return;
    
    [LBAlertController showAlertTitle:@"无法使用定位" content:@"请在iPhone的\"设置-隐私-定位\"中允许访问地理位置。" cancelString:@"取消" cancleBlock:nil sureString:@"去设置" sureBlock:^{
        
        // 需要在info.plist中添加 URL types 并设置一项URL Schemes为prefs  IOS10 以后不起作用
        if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]){
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
    } currentController:[QCT_Common getCurrentVC]];

    
}


2.2 权限的判断: 判断用户是否授权应用获取定位权限

  • 使用方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if (![QCTSession isHasLocationAuthorityWithisShowAlert:YES]) {
        return;
    }

  • isHasLocationAuthorityWithisShowAlert
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//iOS 跳转系统设置打开定位页面


+(BOOL)isHasLocationAuthorityWithisShowAlert:(BOOL)showAlert{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    //应用程序的定位权限被限制
    //拒绝获取定位
    if (status == kCLAuthorizationStatusRestricted || status == kCLAuthorizationStatusDenied) {
        NSLog(@"NSLog 没有获取地理位置的权限");
        if (showAlert) {
            [LBAlertController showAlertTitle:@"无法使用定位" content:@"请在iPhone的\"设置-隐私-定位\"中允许访问地理位置。" cancelString:@"取消" cancleBlock:nil sureString:@"去设置" sureBlock:^{
                
                // 需要在info.plist中添加 URL types 并设置一项URL Schemes为prefs  IOS10 以后不起作用
                if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]){
                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
                }
            } currentController:[QCT_Common getCurrentVC]];
        }
        return NO;
        
    }else if (status == kCLAuthorizationStatusNotDetermined){//用户尚未对该应用程序作出选择,如果是采用高德的SDK定位可以不执行。只要实现amapLocationManager:doRequireLocationAuth: 代理方法即可
        CLLocationManager *manager = [[CLLocationManager alloc] init];
        if([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
            [manager requestWhenInUseAuthorization];
        };
    }
    
    NSLog(@" 获取位置权限正常==============");
    return YES;
}


2.3 处理【非首次安装允许定位权限弹框】

  • AppDelegate中检测定位权限

打开app提示定位权限弹框,针对iOS13 每次都要下次询问,为了用户体验去掉

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 非首次安装提示定位权限弹框
 {
     CLLocationManager *locationManager;
 }

 */
- (void) setupgetUserLocationAuth{
    
    NSLog(@"setupgetUserLocationAuth : 非首次安装提示定位权限弹框");
    
    if (![self getUserLocationAuth]) {//提示允许访问
        locationManager = [[CLLocationManager alloc] init];
        [locationManager requestAlwaysAuthorization];
        //创建CLLocationManager对象,在使用定位服务前调用requestWhenInUseAuthorization()。提示

        [locationManager requestWhenInUseAuthorization];
        
    }

}

- (BOOL)getUserLocationAuth {
    BOOL result = NO;
    switch ([CLLocationManager authorizationStatus]) {
        case kCLAuthorizationStatusNotDetermined:
            break;
        case kCLAuthorizationStatusRestricted:
            break;
        case kCLAuthorizationStatusDenied:
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            result = YES;
            break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            result = YES;
            break;
            
        default:
            break;
    }
    return result;
}



III、 判断新的定位地址是否在大陆范围内

  • 判断目标经纬度是否在大陆 :https://kunnan.blog.csdn.net/article/details/119685526

通过经纬度进行判断。利用高德SDK进行判断。(如果是手动输入位置信息就进行逆地理编码获取经纬度

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式
iOS提供了两个框架用来定位以及地图显示。CoreLocation框架包含的类可以帮助设备确定位置和航向以及使用基于位置的有效信息。MapKit框架未定位提供了户用页面的支持(地图显示),里面包含了地图视图、卫星地图视图以及2D、3D混合视图,并且能够让开发人员管理地图标注和地图覆盖层,前者 用于标注地点(常见的地图大头针),后者用来突出某区域或者路线等。
全栈程序员站长
2022/09/17
4.5K0
iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式
iOS开发之定位
在iOS开发中,定位是很多App都需要使用的功能。本文主要对iOS中的定位知识点进行介绍。本文代码环境为:Xcode 10.1 + Swift 4.2。
YungFan
2019/03/21
1.6K0
iOS开发之定位
地图相关 CoreLocation框架介绍请求用户授权方法CLLocationManager 属性和方法CLLocation 位置对象介绍三、地理编码的实现
介绍 1.导入主头文件 #import <CoreLocation/CoreLocation.h> 2.地图和定位功能基于2个框架进行开发: (1)Map Kit :用于地图展示 (2)CoreLocation:用于地理定位,有时只用定位,比如外卖,只有需要显示地图才用map kit 3.2个热门专业术语: (1)LBS :Location Based Service 位置服务,又称定位服务 LBS的服务归纳为四类:定位(个人位置定位)、导航(路径导航)、查询(查询某个人或某个对象)、识别(识别某个
用户2141756
2018/05/18
1.8K0
iOS小技能:地理编码(地址转坐标)
用户在高德地图官网申请Web服务API类型Key:https://lbs.amap.com/dev/
公众号iOS逆向
2022/08/22
1.4K0
iOS小技能:地理编码(地址转坐标)
iOS关于地图定位基础(二)[通俗易懂]
在前一篇文章 iOS关于地图定位基础(一) 中我们主要总结了 iOS 里面利用原生 CoreLocation 框架实现基本定位功能和一些注意点,侧重点主要是iOS8+之后的定位授权与授权状态的使用。接下来本篇文章主要是讲解如何利用 CoreLocation 框架实现地理定位、区域监听、地理编码的具体实现。(PS:下文涉及我自定义的指南针Demo请去我的GitHub仓库查看源码https://github.com/IMLoser/HWCompass,谢谢大家支持。)
全栈程序员站长
2022/09/17
1K0
iOS关于地图定位基础(二)[通俗易懂]
iOS设备限制境外定位(支付交易风险控制策略)
iOS定位、地理/逆地理编码的使用:https://kunnan.blog.csdn.net/article/details/119685612
公众号iOS逆向
2021/08/25
1.1K0
iOS设备限制境外定位(支付交易风险控制策略)
iOS小技能:封装定位SDK,统一数据模型和错误处理。
需求背景:收款页面需要请求IP定位API获取经纬度,由于高德的API的库不准确(没有实时更新),使用公司决定换腾讯API。
公众号iOS逆向
2022/08/22
9190
iOS小技能:封装定位SDK,统一数据模型和错误处理。
iOS-定位
-需要在info.plist配置NSLocationWhenInUseUsageDescription字段;
GuangdongQi
2021/11/24
1.4K0
iOS-定位
iOS小技能:授权检测(引导权限开启,监听权限变化执行回调事件。)
查看CLLocationManager的授权状态: [CLLocationManager authorizationStatus
公众号iOS逆向
2022/08/22
3.2K0
iOS小技能:授权检测(引导权限开启,监听权限变化执行回调事件。)
iOS开发中的这些权限,你搞懂了吗?
写在前面 APP开发避免不开系统权限的问题,如何在APP以更加友好的方式向用户展示系统权限,似乎也是开发过程中值得深思的一件事; 那如何提高APP获取iOS系统权限的通过率呢?有以下几种方式:1.在用户打开APP时就向用户请求权限;2.告知用户授权权限后能够获得好处之后,再向用户请求权限;3.在绝对必要的情况下才向用户请求权限,例如:用户访问照片库时请求访问系统相册权限;4.在展示系统权限的对话框前,先向用户显示自定义的对话框,若用户选择不允许,默认无操作,若用户选择允许,再展示系统对话框。 上述情况在开发
Jacklin
2018/05/15
1.2K0
iOS定位--CoreLocation框架
CoreLocation框架的使用 // 首先导入头文件 #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是CL CoreLocation中使用CLLocationManager对象来做用户定位 1.CLLocationManager的使用 CLLocationManager的常用操作 /** * 定位管理者,全局变量强引用,防止销毁 */ @property (nonatomic ,strong) CLLocationMa
用户1941540
2018/05/11
1.9K0
IOS定位服务的应用 原
在IOS8之后,IOS的定位服务做了优化,若要使用定位服务,必须先获取用户的授权。
珲少
2018/08/15
8850
IOS定位服务的应用
                                                                            原
iOS8新特性之基于地理位置的消息通知UILocalNotification
iOS8中更新和公开了非常多接口,当中有一项本地消息通知UILocalNotification,大家肯定都不陌生。
全栈程序员站长
2022/07/10
4200
iOS8新特性之基于地理位置的消息通知UILocalNotification
iOS-世界那么大,CoreLocation带你去看看
一. 简介 在我们日常生活中时常用到地图和定位功能,来导航去你想去的地方或者寻找周边的景点,餐厅,电影院等等,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发,有了这两个框架,想去哪就去哪。 CoreLocation :用于地理定位,地理编码,区域监听等(着重功能实现) MapKit :用于地图展示,例如大头针,路线、覆盖层展示等(着重界面展示) 二. CoreLocation框架的基本使用 1. CoreLocation使用步骤 导入CoreLocation框架。 创建CLLocation
xx_Cc
2018/05/10
1.4K0
iOS-CoreLocation框架的定位和逆地址解析详解
一、权限问题 在iOS8以后,应用定位需要获取用户授权,我们可以请求的定位权限有两种: 1.仅在使用时定位requestWhenInUseAuthorization(应用在前台才能定位); 2.始
用户2215591
2018/06/29
1.3K0
iOS 后台持续定位
在日常的工作开发中,有时会遇到需要在后台持续运行的需求。对于这个需求,安卓实现起来比较简单,而iOS来说就比较复杂了。我们公司就有后台持续定位并且上传上传地理坐标的需求, 现在总结一下
赵哥窟
2018/12/19
2K0
【node爬虫】通过高德接口爬取地址的经纬度
通过地址的经纬度在GIS中我们称之为地理编码,与之对应的就是通过经纬度获取地址,被称为逆地理编码。不论是地理编码还是逆地理编码,在我们实际的工作、学习中都会有很多的场景,本文讲述的在node环境下,通过高德API实现经纬度数据的获取。
牛老师讲GIS
2021/12/06
7820
【node爬虫】通过高德接口爬取地址的经纬度
iOS iOS 地图与定位开发系列教程
iPhone SDK提供了三个类来管理位置信息:CLLocation CLLocationManager 和 CLLHeading(不常用)。除了使用GPS来获取当前的位置信息外,iPhone也可以基于WiFi基站和无线发射塔来获得位置信息。GPS的精度最高,可以精确到米级别,但是也最耗电。
全栈程序员站长
2022/09/17
2.3K0
swift 定位封装一句话使用
git地址:https://github.com/RainManGO/LocationManager
星宇大前端
2019/01/15
1.4K0
地图| 高德地图源码级使用大全
高德地图提供包括:web前端、Android、iOS、服务器、小程序等平台的地图服务, 地图功能众多,本文记载的只是自己遇到的一些问题,绝大部分功能只要参照官方文档和Dome都可以实现出来。
進无尽
2018/09/12
4.5K0
地图| 高德地图源码级使用大全
推荐阅读
相关推荐
iOS开发-用户定位获取-CoreLocation的实际应用-CLLocationManger获取定位权限-CLLocation详细使用方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验