最新的 iOS 版本 (12.4) 不推荐使用 didUpdateLocationsTo: from: 方法。如何用 didUpdateLocations 替换它?

Posted

技术标签:

【中文标题】最新的 iOS 版本 (12.4) 不推荐使用 didUpdateLocationsTo: from: 方法。如何用 didUpdateLocations 替换它?【英文标题】:didUpdateLocationsTo: from: method is deprecated for latest iOS versions(12.4). How to replace it with didUpdateLocations? 【发布时间】:2021-03-17 12:26:17 【问题描述】:

我正在尝试在我的示例应用中实现经度和纬度。我使用 iPhone 5s 设备进行测试。它不会对按钮操作上的纬度和经度标签产生任何影响。

在编译 Xcode 之前在 didUpdateToLocation: fromLocation: method as 行显示警告

“实现不推荐使用的方法”

请帮助我用合适的方法代替此方法以使应用程序顺利运行

使用 Xcode 12.4 和 ios 12.3 使用 Objective c 我正在尝试实现一个显示经度和纬度的简单位置演示应用程序。下面是我的 viewController.h 和 viewController.m 文件。我已经尝试了以下来自在线教程AppCoda的代码

viewController.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController :UIViewController<CLLocationManagerDelegate>

  IBOutlet UILabel *lattitudeLabel;
  IBOutlet UILabel *longitudeLabel;
  IBOutlet UILabel *addressLabel;

- (IBAction)getCurrentLocation:(UIButton *)sender;
@end

viewController.m

#import "ViewController.h"

@interface ViewController ()

  CLLocationManager *locationManager;
  CLGeocoder *geocoder;
  CLPlacemark *placemark;


@end

@implementation ViewController

- (void)viewDidLoad 
[super viewDidLoad];
  locationManager = [[CLLocationManager alloc]init];
  geocoder = [[CLGeocoder alloc] init];



- (IBAction)getCurrentLocation:(UIButton *)sender

  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBest;
  [locationManager startUpdatingLocation];

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

NSLog(@"didFailWithError: %@", error);
  NSLog(@"Error: Failed to get location");


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

NSLog(@"didUpdateToLocation: %@", newLocation);
CLLocation *currentLocation = newLocation;

if (currentLocation != nil) 
longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
lattitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];

  
  [locationManager stopUpdatingLocation];
  
  NSLog(@"Resolving the Address");
  [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) 
      NSLog(@"Found placemarks: %@, error: %@", placemarks, error);
      if (error == nil && [placemarks count] > 0) 
        self->placemark = [placemarks lastObject];
        self->addressLabel.text = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                       self->placemark.subThoroughfare, self->placemark.thoroughfare,
                       self->placemark.postalCode, self->placemark.locality,
                       self->placemark.administrativeArea,
                       self->placemark.country];
       else 
      NSLog(@"%@", error.debugDescription);
      
   ];

@end

点击按钮获取我的位置没有发生任何事情。它实际上应该更新除经度之外的坐标:和纬度:一些浮点值..但它没有这样做..我会问请建议我链接到任何教程网站或任何 GitHub 项目的链接,以便在 iOS 12.3 和以上目标c...感谢您的回复和建议的编辑。

【问题讨论】:

欢迎来到 SO。请edit您的问题并添加minimal reproducible example,显示您已经尝试过的内容以及哪些部分不起作用。另见How to Ask。 嗨@koen 感谢您的编辑建议。在为我接下来的所有问题提问之前,我会遵循所有指南。 【参考方案1】:

正如docs 所说,只需使用locationManager(_:didUpdateLocations:) 。

斯威夫特 5

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    // Stop updates if this is a one-time request
    manager.stopUpdatingLocation()
    
    // Pop the last location off if you just need current update
    guard let newLocation = locations.last else  return 
    
    <... Do something with the location ...>

Objective-C

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 
    [manager stopUpdatingLocation];

    CLLocation *newLocation = [locations lastObject];
    if (newLocation) 
        <... Do something with the location ...>
    

【讨论】:

亲爱的@Mark Thormann,我知道使用什么,但不知道如何使用。这就是为什么我问如何使用?你能解释一下如何使用示例和输出的 didUpdateLocations 方法吗? 到目前为止您尝试过哪些代码,您现有的代码是什么样的?您没有使用新方法的旧位置,但您应该已经从该函数的先前迭代中获得了该位置。我将在上面进行编辑以包含一个示例,但我真的不知道你在问什么。由于您是 SO 新手,您可能还没有看到关于如何提问的 guidelines。 感谢您提出的修改建议...我真的是新来的,所以不要介意我的错误。我将用一些代码更新我的问题。 亲爱的@Mark Thormann,感谢您花几分钟时间回答我的问题。如果我浪费你的时间问不正确的问题,我很抱歉。如果这对你来说不是问题,你能解释一下与 Objective-C 相同的过程吗? 当然,我已经更新了上面的内容。如果你在一个 100% 的 Objective C 商店,我肯定会建议你开始移动或看看 Swift。它只会帮助你前进。【参考方案2】:

我希望这个委托方法的实现对你有所帮助。 适用于 Mac 和 IOS。我用它来确定天气应用程序的当前位置。

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray<CLLocation *> *)locations

    if (locations.count > 0) 
        // Location manager has nonempty array of readings
        // We take the las one - the latest position determined
        CLLocation *last = locations[locations.count - 1];
        // Evaluate threshold distance to notice change
        CLLocationDistance distance = LOCATOR_SENSITIVITY + 1;
        if (previous) 
             // calculate distance from previous location
             distance = [last distanceFromLocation:previous];
        
        // update previous location
        previous = last;
        if (distance > LOCATOR_SENSITIVITY) 
            // If we moved far enough, update current position
            currentLat = last.coordinate.latitude;
            currentLon = last.coordinate.longitude;
            // and notify all observers 
            // You can use delegate here, dispatch_async wrapper etc.
            [[NSNotificationCenter defaultCenter] 
                 postNotificationName:LocationIsChanged object:nil];
        
    

【讨论】:

以上是关于最新的 iOS 版本 (12.4) 不推荐使用 didUpdateLocationsTo: from: 方法。如何用 didUpdateLocations 替换它?的主要内容,如果未能解决你的问题,请参考以下文章

最新 抖音 x-gorgon 0408 算法定位查找过程笔记 最新抖音12.4版本

如何在 Xcode 12.4 上运行 iOS 模拟器 10.3.1?

使用 Postgres 安装最新版本的 Rails 4 - 不推荐使用 PGconn、PGresult 和 PGError 常量

ionic3 在ios12.2 12.3 12.4上页面无法滚动

在 iOS 12.4 上使用 CoreML Word Tagger

Xcode 12.4 在 Ios 15 上是不是有解决方法?