iOS——定位与地图

这篇具有很好参考价值的文章主要介绍了iOS——定位与地图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

平时在写项目的时候可能会遇到需要使用定位服务的地方,比如说获取位置和导航等。因此这里我会使用OC自带的库以及苹果系统的地图来获取定位以及显示在地图上。

开始前的设置

在获取定位前,需要在项目文件的info中添加两个关键字,用于向用户请求定位服务。在请求定位服务的弹窗中会显示我们添加的字段

<key>Privacy - Location When In Use Usage Description
<value>使用程序的时候获取本机位置

<key>Privacy - Location Always Usage Description
<value>总是获取本机位置

iOS——定位与地图,ios,objective-c,xcode

运行效果:
iOS——定位与地图,ios,objective-c,xcode

获取当前位置的经纬度

  • 在写代码前需要添加对应的库以及设置相关的属性:

#import <UIKit/UIKit.h>
// 关于定位以及地图的库
#import <MapKit/MKMapView.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate>

//设置一个定位管理者的属性
@property (nonatomic, strong) CLLocationManager *locationManager;
//存储推算出当前的地理位置信息,这个属性用于获取当前位置信息推算出的信息,比如有了经纬度而推算出的省、市、区等
@property (nonatomic, strong) CLGeocoder *geoCoder;

//定义属性获取存储到的位置信息
@property (nonatomic, retain) CLLocation *myLocation;

//MKMapView是iOS中MapKit框架中的一个类,用于显示地图,并提供与地图相关的交互功能
@property (nonatomic, strong) MKMapView *mapView;

@end

  • 开始定位:

//开始定位
- (void)dingWei {
    self.locationManager = [[CLLocationManager alloc] init];
    //desiredAccuracy用于指定定位服务精度, kCLLocationAccuracyBest表示最高精度,这个设置的优势是提供了最准确的位置信息,但代价是更高的能耗。其他定位精度设置,例如 kCLLocationAccuracyNearestTenMeters 或 kCLLocationAccuracyHundredMeters,它们提供了较低的精度但更节能。
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    //distanceFilter 属性用于设置设备移动的距离,当设备移动超过这个距离时,会触发位置更新。distanceFilter 被设置为 10.0 米。这意味着只有当设备移动超过 10.0 米时,才会触发新的位置更新。
    self.locationManager.distanceFilter = 10.0f;
    //检查设备的系统版本是否可以进行定位
    if ([CLLocationManager locationServicesEnabled]) {
        self.locationManager.delegate = self;
        //如果是,则调用 requestWhenInUseAuthorization 方法请求用户在应用处于前台时获取位置信息的授权。
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self.locationManager requestWhenInUseAuthorization];
        });
        self.geoCoder = [[CLGeocoder alloc] init];
    } else {
        NSLog(@"ERROR");
    }
}

CLLocationManager其相关的属性:

desiredAccuracy位置的精度属性,取值有如下几种:
kCLLocationAccuracyBest:精确度最佳
kCLLocationAccuracynearestTenMeters:精确度10m以内
kCLLocationAccuracyHundredMeters:精确度100m以内
kCLLocationAccuracyKilometer:精确度1000m以内
kCLLocationAccuracyThree:精确度3000m以内

  • 在代理方法中获取需要的位置信息
//在代理方法中获取需要的位置信息
//下面的方法中,locations是一个数组类型,其最后一个元素就是我们的经纬度坐标,类型为CLLocation,如果想将它设置为属性,修饰符一定要是retain
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    NSLog(@"%lu", locations.count);
    self.myLocation = locations.lastObject;
    NSLog(@"经度: %f, 纬度: %f", self.myLocation.coordinate.longitude, self.myLocation.coordinate.latitude);
    
    // 获取到位置后再进行反地理编码
    [self reverseGeocodeLocation:self.myLocation];
}

- (void)reverseGeocodeLocation:(CLLocation *)location {
    [self.geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count > 0) {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            NSLog(@"%@", placemark.name);
            NSString *city = placemark.locality;
            if (!city) {
                city = placemark.administrativeArea;
            }
            NSLog(@"位置名:%@", placemark.name);
            NSLog(@"街道:%@", placemark.thoroughfare);
            NSLog(@"子街道:%@", placemark.subThoroughfare);
            NSLog(@"市:%@", placemark.locality);
            NSLog(@"区:%@", placemark.subLocality);
            NSLog(@"国家:%@", placemark.country);
            
            // 在这里调用显示地图的方法
            [self showLocationOnMapWithLatitude:location.coordinate.latitude longitude:location.coordinate.longitude];
        }
    }];
}

  • 改变定位权限

// 在此回调中处理定位权限的改变
- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager {
    CLAuthorizationStatus status = manager.authorizationStatus;
    
    dispatch_async(dispatch_get_main_queue(), ^{
        if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
            // 在这里执行需要权限的操作,例如启动定位服务
            //设置允许在应用在后台运行时继续获取位置更新
            self.locationManager.allowsBackgroundLocationUpdates = NO;
            
            //开始获取设备的当前位置信息
            [self.locationManager startUpdatingLocation];
            self.geoCoder = [[CLGeocoder alloc] init];
            [self jiSuanDistance];
            self.mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
            self.mapView.delegate = self;
            [self.view addSubview:self.mapView];
        } else {
            NSLog(@"ERROR");
        }
    });
}

  • 获取定位出错时调用如下方法:

//获取位置出错的时候调用下面的协议方法
- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    if (error) {
        NSLog(@"ERROR");
    }
}

运行结果:
iOS——定位与地图,ios,objective-c,xcode

测算两个经纬度之间的距离


//测算两个经纬度坐标之间的距离
- (void) jiSuanDistance {
    CLLocation *before = [[CLLocation alloc] initWithLatitude:11.111 longitude:222.222];
    CLLocationDistance meters = [self.myLocation distanceFromLocation:before];
    NSLog(@"相距: %f米", meters);
}

运行结果:
iOS——定位与地图,ios,objective-c,xcode

将位置定位在地图上

这里使用的是苹果自带的地图


- (void)showLocationOnMapWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude {
    //创建坐标点
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
    //以指定的坐标为中心,设置地图显示范围。这里的参数 1000 表示地图的纬度和经度跨度都为 1000 米。
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coordinate, 1000, 1000);
    //调整地图显示区域,region 是一个 MKCoordinateRegion 结构体,表示地图的中心点和跨度,这里 region 代表指定的坐标点为中心
    [self.mapView setRegion:region animated:YES];
    
    // 添加标注
    //MKPointAnnotation是 MapKit 框架中的一部分,用于表示地图上的点标注
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    //将coordinate属性设置为当前经纬度坐标
    annotation.coordinate = coordinate;
    //为地图添加标记
    [self.mapView addAnnotation:annotation];
}

运行结果:
iOS——定位与地图,ios,objective-c,xcode文章来源地址https://www.toymoban.com/news/detail-755951.html

到了这里,关于iOS——定位与地图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS —— xcode14兼容 iOS9~iOS10系统

    xcode14兼容 iOS9~iOS10系统 在Xcode升级到Xcode14以后,系统的支持版本升级到了iOS11.0。但是我们项目需要支持iOS9,脚本打包错误提示: The iOS deployment target \\\'IPHONEOS_DEPLOYMENT_TARGET\\\' is set to 9.0, but the range of supported deployment target versions is 11.0 to 16.2.99. 下面记录适配过程。 适配过程同

    2024年02月09日
    浏览(42)
  • 【IOS】Xcode 15.2版本下载 iOS_17 Simulator失败

    Xcode更新15.2自身不带iOS_17 Simulator模拟器的,然而在使用自带的get下载安装会一直在40进度左右出现因为网络问题安装失败的情况,一般这种情况在断点处重试安装也还好,但是每次重试都是需要重新下载,因为本身下载又很慢,又总是在40左右出现此问题,所以只能尝试自行

    2024年02月20日
    浏览(61)
  • xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

    工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的iosRunnerAssets.xcassetsAppIcon.appiconset目录下,如下图

    2024年01月23日
    浏览(60)
  • iOS问题记录 - Xcode 14安装低版本iOS模拟器(持续更新)

    最近客服跟我反馈说,有一个用户打开老项目的iOS App闪退,我回顾了下这项目上次发布改了啥,发现就改了一些文本和链接,这就很奇怪。到后台查了下这个用户的设备信息和应用版本,用的是手机型号是iPhone X,系统版本是iOS 11.2,以及最新版的应用。 很长时间都忙着Flu

    2024年02月15日
    浏览(47)
  • iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)

    最近新需求很多,项目改动很大,开发完成后想测一遍在低版本iOS系统上的兼容性,没想到低版本的iOS模拟器设备突然无法创建了。 在去年年底我研究过这个问题,写下了这篇文章iOS问题记录 - Xcode 14安装低版本iOS模拟器(持续更新),虽然当时没有完全解决,但暂时也够用

    2024年02月13日
    浏览(46)
  • mac电脑 安装 ios开发工具xcode步骤 以及新建ios项目

            在Mac电脑上安装Xcode,苹果公司的官方iOS开发工具,以及新建iOS项目,以下是详细步骤:         安装Xcode 1. 打开Mac上的App Store。 2. 在搜索栏中输入“Xcode”。 3. 从搜索结果中找到Xcode,点击“获取”按钮。 4. 输入您的Apple ID和密码,然后点击“安装”按钮。

    2024年02月20日
    浏览(41)
  • xcode15启动IOS远程调试

    1.用数据线连接IPhone到macOS 2.打开xcode15,然后点击Window-Devices and Simulators  3.选中左边的Devices可看到已连接的IPhone,然后点击Connect via network使其选中. 选择后,左边的IPhone设备的右边出现一个地球图标,表示成功通过网络连接到IPhone 现在可断开数据线的连接,至此可以对IPhone设备进行

    2024年02月16日
    浏览(38)
  • iOS 17 适配 Xcode 15 问题

    在适配 iOS 17 + xcode 15时遇到的问题,记录一下。 1、 Could not build module ‘WebKit’ 解决方案: 选中不能编译的库的xcodeproj,在 Build Phrases - Compile Sources ,选中所有文件, Complier Flags 里删除 -DOS_OBJECT_USE_OBJC=0 可能是三方库的目标版本比较低,cocoapods兼容低版本自动加上了 - DOS_

    2024年02月08日
    浏览(55)
  • XCODE IOS 静态链接库替换升级

    XCODE 版本15.2.  一个很久需求没更新的IOS 应用,近来有新需求要开发。 拉下代码运行,出现了个BAD_ACCESS错误。出错的位置位于一个调用的第三方的.a静态库内部。因为调用代码并没有修改,很容易想到可能XCODE相关升级,导致的问题。 由于是第三方的一个.a静态库,兼容问题

    2024年02月02日
    浏览(42)
  • Xcode iOS app启用文件共享

    在info.plist中添加如下两个配置 Supports opening documents in place  Application supports iTunes file sharing 结果都为YES,如下图所示: 然后,iOS设备查看,文件-我的iPhone列表中有一个和你工程名相同的文件夹出现,如下图所示:

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包