Ios 为什么self.locationManager停止更新位置不';t停止位置更新

Ios 为什么self.locationManager停止更新位置不';t停止位置更新,ios,mapkit,core-location,cllocationmanager,Ios,Mapkit,Core Location,Cllocationmanager,问题:我似乎无法阻止核心位置向我的应用程序/跟踪发送更新 我在做什么:在我的视图中将出现我调用self.locationManager并将其传递给一个方法,以在地图上显示用户的位置(一个MKMapView的实例)。重写getter以检查serive的可用性,查看其是否已授权。如果是,它allocs/inits和startMonitoringSignificantLocationChanges和返回 在视图中,我调用[self.locationManager stopUpdatengLocatio

问题:我似乎无法阻止
核心位置
向我的应用程序/跟踪发送更新

我在做什么:在我的
视图中将出现
我调用
self.locationManager
并将其传递给一个方法,以在地图上显示用户的位置(一个
MKMapView
的实例)。重写getter以检查serive的可用性,查看其是否已授权。如果是,它
allocs/inits
startMonitoringSignificantLocationChanges
返回

视图中,我调用
[self.locationManager stopUpdatengLocation]
。但我仍然可以在状态栏中看到位置图标。即使我通过双击home按钮并关闭它来终止应用程序,图标仍然存在。。。即使在延长时间后(10分钟以上)。当我转到设置应用程序时,它告诉我我的应用程序仍在使用位置服务(紫色图标)

问题:我在这里遗漏了什么?为什么位置更新不停止


提前感谢。

开始监视重要位置更改相反的不是
停止更新位置
,而是
停止监视重要位置更改

您可能希望将
startMonitoringSignificantLocationChanges
替换为
startdatatinglocation
,以便进行更定期的更新,除非您有特定的原因只监视重要的位置更改


查看以了解更多详细信息。

我也遇到了与Canopus相同的问题。如果启用了showUserLocation,则即使调用了StopUpdatengLocation,导航指针仍然驻留在状态栏上。也许这是一个错误?这可能是因为我正在使用iOS 4.2.1运行和测试,这个问题可能已在以后的SDK中修复

我认为如果调用stopUserLocation,它也会停止显示用户位置,因为我在其中使用它的视图已经消失,并且随后被释放

在停止用户位置更新之前,似乎必须将showUserLocation设置为NO

无论如何,在我的viewDidLoad方法中,我有以下代码:

self.mapView.showsUserLocation = YES;
更多代码

- (void)viewWillDisappear:(BOOL)animated
{    
    if (locationManager)
    {
        mapView.showsUserLocation = NO;
        [locationManager stopUpdatingLocation];
    }

    [super viewWillDisappear:animated];
}

- (void)dealloc
{
    if (locationManager)
    {
        [locationManager release];
        locationManager = nil;
    }

    (other code)
}

我解决了委托后locationManager属性设置nil的问题

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    // Your code getting coordinates 
    //Here set nil
    locationManager = nil;

}
我的应用程序请求“始终”身份验证。只有应用程序中的特定功能需要这样做。如果用户关闭该功能,则在应用程序关闭时,我们可以停止位置更新(目的是节省电池并从状态栏中删除位置图标)。我也认为停止不起作用,因为在应用程序关闭后,状态栏中的位置图标仍然存在,即使我的应用程序是我手机上运行的唯一具有位置访问权限的应用程序,“应用程序关闭”我只是告诉它停止更新位置


对我来说,解决方案是耐心一点,然后我意识到关闭位置硬件和更新状态栏大约需要10-15秒。我不必关闭我的位置管理器或任何特别的东西,只需在应用程序关闭时停止更新,等待15秒,然后观察iOS从状态栏中删除位置图标。希望这能帮助别人

我在Swift中使用了
CLLocationManager
,我认为这与Swift或Objective-C相关,但我刚刚创建了一个布尔值,每当我收到位置更新时,我都会将其更新为true。因为在我的情况下,我只需要在发布时使用一次。。例如

// my boolean to stop location updates
var alreadyUpdatedLocation = Bool()
另外,在我的例子中,我创建了一个helper函数,每当我获得用户的数据/位置时,我都会像这样调用我自己的
stopdationlocation

// helper function to stop updates
func stopUpdationgLocation() {

    // since I received my data within a block, I don't want to just return whenever it wants to :)    
    dispatch_async(dispatch_get_main_queue()) {

        // the building stop updating location function call
        self.locationManager.stopUpdatingLocation()

        // my own trick to avoid keep getting updates
        self.alreadyUpdatedLocation = true

    }
}
然后,无论你在哪里使用你收到的位置更新,你都可以这样做

// avoiding multiple calls after I have received user location
if(self.alreadyUpdatedLocation) {
        return
}
我希望有帮助

试试这个

    if ([CLLocationManager significantLocationChangeMonitoringAvailable])
            {
                [self.locationManager startMonitoringSignificantLocationChanges];


            }

 [[self locationManager] stopUpdatingLocation];

Swift:

您的地图和位置管理器都需要停止:

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        locationManager.stopMonitoringSignificantLocationChanges()            
        locationManager.stopUpdatingLocation()
        mapView.showsUserLocation = false

    }

您可以在Xcode中的“能源影响”下的“调试导航器”中调试/检查位置服务的使用情况。

如果您使用的是用于iOS的GoogleMaps SDK,我发现如果您调用

locationManager.stopUpdatingLocation() 
还有

mapView.isMyLocationEnabled = true
然后gps图标保持不变

我选择做的是首先在地图上显示用户的位置,然后在8秒钟后关闭它。这对我使用谷歌地图SDK很有效。我在ViewDidLoad中添加了以下内容:

DispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {
            self.locationManager.stopUpdatingLocation()
            self.mapView.isMyLocationEnabled = false
        }) 
如果您不希望切换到其他视图时gps图标出现在状态栏中,则可以在视图中放置相同的代码

问题: 在我的例子中,我同时使用开始监视重要位置更改启动数据位置。 即使在通过locationManager.stopMonitoringSignificantLocationChanges()停止位置之后& 位置管理器。停止更新位置()。 我的位置不断被呼叫

解决方案: 1.检查您是否已使计时器失效。 2.初始化locationManager.delegate=nil


这些肯定会解决你的问题。

如果你有两个问题(即使它们是相关的),你应该问两个独立的问题。不要问问题的第二部分。我把它拿了出来。我找到了答案。谢谢,我两个都试过了。事实上,当我第一次编写代码时,它是stopmoningsignificantlocationchanges,但由于它没有停止更新,所以我将其更改为stopdationlocation。我试图在地图上显示特定类型企业的位置,所以我只需要用户的位置一次。我不需要跟踪它。我仍然主张在您的场景中使用
startUpdatingLocation
,在您的
CLLocationManagerDelegate
中调用
stopdatinglocation
,只要您有足够准确的位置满足您的需要。我认为这个答案是正确的。jnic