当前位置: 首页 > 知识库问答 >
问题:

应用程序是否应该启动位置跟踪,以便从CLLocationManager获取任何最后已知的位置?

诸葛煜
2023-03-14

目前,正在开发一个应用程序,该应用程序需要从CLLocationManager获取最后一个位置(无任何常规跟踪)。不管它有多老,它都是准确的。我不需要也不想开始跟踪——我只需要从缓存中抓取最后一个位置,就这样。在iOS中,CLLocationManager是一个共享组件,如果某个应用程序使用位置跟踪,那么另一个应用程序应该能够使用CLLocationManager中的最新位置。地方只需alloc/init CLLocationManager并获取其位置就足够了。但事实并非如此。我在iPhone4上进行了测试,启动了谷歌地图,查看了我的当前位置,然后转到了我的应用程序,但在[[CLLocationManager alloc]init]之后,location属性为零。

UPDATE:尝试了[locationManager开始更新位置];和[locationManager停止更新位置];但结果是相同的。我想,唯一的解决办法就是开始定期跟踪?

UPDATE2:奇怪,但在CLLocationManager的alloc/init之后,没有“应用程序想要使用位置服务”的警报。这是我的代码片段:

CLLocationManager *locationManager = [[CLLocationManager alloc] init];

[locationManager startUpdatingLocation];
[locationManager stopUpdatingLocation];
NSLog(@"%@", locationManager.location); //prints nil

共有2个答案

熊朝
2023-03-14

要使用CLLocationManager,您需要在某处实现CLLocationManagerDelegate

-[CLLocationManager startUpdatingLocation]启动异步进程。如果在同一个运行循环中停止该进程,则该进程将永远不会启动,这就是您从未看到“权限”对话框的原因。

它是这样的:

@interface MyClass : NSObject <CLLocationManagerDelegate> {
    CLLocationManager *manager;
    CLLocation *lastLocation;
}

@end

@implementation

- (id)init {
    self = [super init];
    if (self) {
        manager = [[CLLocationManager alloc] init];
        manager.delegate = self;
        [manager startUpdatingLocation];
    }
    return self;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;
{   
    lastLocation = newLocation;
    [manager stopUpdatingLocation];
}

// in your real implementation be sure to handle the error cases as well.
@end
米俊晤
2023-03-14

首先,您应该检查您的locationManager是否预先保存了一个,比如说,“静态”位置。

如果是,你就完了。

如果没有,您应该startUpdatingLocation,然后在DidUpdateLocation:fromLocation:回调中,在获得位置后,StopUpdateLocation

根据我的经验,这是只找到一个地点的最好方法。

更新以匹配作者更新:

您不应该在startUpdatingLocation之后立即停止更新位置startUpdatingLocation在后台启动服务,因此您应该等到获得位置后再调用回调方法。

 类似资料:
  • 我意识到这个问题以前被问过很多次,但我现在问这个问题是因为答案很旧(与新的API相比)。 我以前使用过Location Manager,但我发现它非常不可靠。例如,在我的应用程序中,使用getLastKnownLocation和/或current location,它会立即将相机加载到用户的当前位置。但是,如果我在启动应用程序之前打开设备上的位置,它就不会把摄像头放在用户的当前位置,而是放在Nig

  • 我已经为IntelliJ安装了Camel插件。 要开始调试,我们必须创建一个临时应用程序 您如何确切地知道本地加载的端口应用程序是什么?我怎样才能改变它?我没有找到关于。。。

  • 所以我让全球定位系统从我“按下播放”开始持续跟踪和记录我的位置。我想显示所行驶的距离、平均速度、所花费时间的上升和下降。 我正在用我的“LocationsService.java”类记录我的位置,这个类使用startLocationService(),它通过LocationCallback循环(我想)。我使用从@TDIScott获得的代码创建了一个hashmap,并将其放入列表中。 更新问题:如何

  • 我想我找遍了所有地方,但我找不到任何图表或报告与参考交通数据。我使用的是在预览Azure门户中存储数据的最新版本。在旧的应用程序中,insights(在VS Online中)就有这个数据。 有没有人知道在新门户中是否可以找到它,以及在哪里可以找到它? 提前道谢!

  • 我正致力于通过为我的Nexus 5创建我自己的定制ROM来更好地理解Android内部。我想,首先,我应该尝试制作一个ROM,删除Nexus 5 Lollipop factory映像中我不使用的许多应用程序。 我想摆脱的一些应用程序:适合电子邮件(此应用程序仅指向gmail)播放书籍(我是老派,我仍然喜欢纸质书籍)玩游戏玩新台 有各种.mk文件将使用PRODUCT_PACKAGES来选择要构建包含

  • 问题内容: 我正在尝试通过“典型”权限框来获取用户的实际位置: 如果有人知道如何制作,请回答。 问题答案: 在运行时要求使用设备当前位置的权限如下: