最新的 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上页面无法滚动