【问题标题】:iOS8: Blue bar "is Using Your Location" appears shortly after exiting appiOS8:退出应用程序后不久出现蓝条“正在使用您的位置”
【发布时间】:2015-01-23 19:26:08
【问题描述】:

我想在后台跟踪时获得蓝条,但不是。

我的应用程序在活动时一直使用定位服务,所以在 iOS8 中我使用 CLLocationManager 上的 requestWhenInUseAuthorization。通常,当您关闭应用程序时,应用程序会停止跟踪您的位置,但用户可以选择让应用程序在后台跟踪他的位置的选项。因此,我在 Info.plist 文件中有UIBackgroundModeslocation 选项。这非常有效:当切换到后台时,应用程序会不断获取位置更新,并且会出现一个蓝条,提醒应用程序正在使用位置服务。一切都很完美。

但问题是,当用户没有选择在后台跟踪时,蓝条也会出现。在这种情况下,我只需在进入后台时停止来自 AppDelegate 的位置更新:

- (void) applicationDidEnterBackground:(UIApplication *)application
{
    if (!trackingInBackground) {
        [theLocationManager stopUpdatingLocation];
    }
}

蓝条在关闭应用程序后仅显示一秒钟,但看起来仍然很烦人。

我知道使用requestAlwaysAuthorization 而不是requestWhenInUseAuthorization 可以解决问题,但是我根本不会看到任何蓝条,在后台跟踪实际打开时也不会。

我已经在applicationWillResignActive: 方法中尝试过stopUpdatingLocation,但这没有区别。

有谁知道在后台跟踪时如何获得蓝条,但不知道时不知道?

【问题讨论】:

  • 我已经为这个错误提交了一个雷达openradar.me/20764660
  • Google 地图应用在后台运行时会执行相同的操作。我有一种强烈的感觉,这是一个 iOS 错误...
  • 您是否尝试将代码移至applicationWillEnterForeground

标签: ios objective-c core-location


【解决方案1】:

要显示蓝色通知,您需要在 Plist 文件中添加 Privacy - Location When In Use Usage Description(这很重要,使用 Always Location 时蓝条没有永远出现)

 self.locationManager.delegate = self;
 self.locationManager.requestWhenInUseAuthorization()
 self.locationManager.pausesLocationUpdatesAutomatically = true/false
 self.locationManager.allowsBackgroundLocationUpdates = true

然后给位置加星标:locationManager.startUpdatingLocation()

也覆盖方法:

 func locationManager(_ manager: CLLocationManager, didUpdateLocations
  locations: [CLLocation]) {
       print(manager.location?.coordinate.latitude ?? "No data")
 }


 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
     if status == .authorizedWhenInUse {
         if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
             if CLLocationManager.isRangingAvailable() {
                 // do stuff
                 print(manager.location?.coordinate.latitude ?? "No data")
                 locationManager.startUpdatingLocation()
             }
         }
     }
 }

记住导入!!:

 import CoreLocation

还要记住委托(CLLocationManagerDelegate)

 class ViewController: UIViewController, CLLocationManagerDelegate{

【讨论】:

    【解决方案2】:

    要在按主页按钮时在标题上显示您的应用正在使用位置的蓝色条,您必须设置 隐私 - Plist 文件中使用时的位置说明

     self.locationManager.delegate = self;
    
     locationManager.desiredAccuracy = kCLLocationAccuracyBest
    
     self.locationManager.requestWhenInUseAuthorization()
    
     self.locationManager.pausesLocationUpdatesAutomatically = true
    
     self.locationManager.allowsBackgroundLocationUpdates = true
    

    当你使用 self.locationManager.requestAlwaysAuthorization() 则不会显示蓝色标题

    你只需要使用 self.locationManager.requestWhenInUseAuthorization() 然后当您的应用程序在后台显示您的应用程序正在使用位置时,它将显示蓝色标题

    您还必须在目标位置的功能中设置背景模式

    【讨论】:

    • 请阅读一些关于如何使用标记语言进行正确格式化的内容。你的答案看起来,嗯,可怕。无需在你的地方大胆
    • 信息也不正确/多余。例如,设置“pausesLocationUpdatesAutomatically”是无关紧要的。其他信息已经在问题和接受的答案中。
    【解决方案3】:

    我们经常向 Apple 报告事情,有时他们实际上会采取行动。正如问题中所述,为了防止蓝条很快出现,Apple 在 iOS-9 中的CLLocationManager 上引入了一个新属性。在您知道您需要后台位置的那一刻设置它:

    theLocationManager.allowsBackgroundLocationUpdates = YES;
    

    或者,以向后兼容的方式:

    if ([theLocationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
        [theLocationManager setAllowsBackgroundLocationUpdates:YES];
    }
    

    在斯威夫特中:

    if #available(iOS 9.0, *) {
        theLocationManager.allowsBackgroundLocationUpdates = true 
    }
    

    如果未设置此属性,则退出应用时不会出现蓝条,并且您的应用无法使用用户位置。 请注意,在 iOS 9 中,您必须设置属性才能在后台使用位置信息。

    Apple 的解释见the WWDC video

    【讨论】:

    • 在 Swift 中执行以下操作:if #available(iOS 9.0, *) { locationManager.allowsBackgroundLocationUpdates = true }
    【解决方案4】:

    如果您按照以下步骤操作,蓝条将不会出现在后台模式中

    • 在 Info.plist 中设置 NSLocationAlwaysUsageDescription
    • 检查功能 > 后台模式 > 位置更新
    • 在代码 locationManager.requestAlwaysAuthorization() 中

    【讨论】:

    • 是的,这就是问题中已经写的内容,并不是我们想要的。当应用在后台模式下处于活动状态时,我们确实需要蓝色条。
    【解决方案5】:

    仅当您在 iOS 8 中启用 Background Location Updates 并请求 when-in-use authorization 时,才会显示蓝条。

    退出应用后不久出现蓝条“正在使用您的位置”

    听起来位置管理器无法立即停止。 所以蓝条会出现,直到位置管理器完全停止。 或者也许这只是基思所说的一个错误。

    【讨论】:

    • 是的,这就是正在发生的事情,这正是我们想知道如何解决的问题。
    【解决方案6】:

    这不是错误,您的应用程序中的某处仍然有一个活动的位置管理器。例如,您有带有showsUserLocation = YES 的地图视图吗?可能就是这样。

    我彻底检查了我的项目,当我停止所有位置管理器时,该栏消失了。

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多