仅显示一个位置权限警报

Posted

技术标签:

【中文标题】仅显示一个位置权限警报【英文标题】:Shows only one Location permission alert 【发布时间】:2017-04-11 09:36:47 【问题描述】:

我希望我的应用程序在活动和后台模式下获取位置(如果仅使用 NSLocationAlwaysUsageDescription 权限,则不显示 myLocationButton)。 我在 Info.plist 中设置:

<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location use</string>
<key>UIBackgroundModes</key>

并添加 MapViewController

self.locationManager.requestWhenInUseAuthorization()
self.locationManager.requestAlwaysAuthorization()

但应用启动时,只显示第一个Location权限提示,重新打开应用后出现第二个权限提示。

更新:

override func viewDidLoad() 
        super.viewDidLoad()
 ...    
 locationManager.delegate = self
 locationManager.requestWhenInUseAuthorization()
 viewMap.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil)
        self.startLocationUpdates()
 ...


func startLocationUpdates() 
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.activityType = CLActivityType.automotiveNavigation
    self.locationManager.distanceFilter = distanceFilterMetr
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startUpdatingLocation()


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 

        let myLocation: CLLocation = change?[NSKeyValueChangeKey.newKey] as! CLLocation
        viewMap.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: observeZoom)
        mapRoute.coordinateLatitude = myLocation.coordinate.latitude
        mapRoute.coordinateLongitude = myLocation.coordinate.longitude
        viewMap.delegate = self
        viewMap.settings.myLocationButton = true
        viewMap.settings.compassButton = true
        didFindMyLocation = true

【问题讨论】:

您只需要请求“始终”授权。这使您的应用可以在前台和后台使用位置。 @Paulw11 我写的是如果只使用 NSLocationAlwaysUsageDescription 权限然后 myLocationButton 不显示(位置更新但按钮不显示)ios 10.3 swift 3 您如何决定是否显示该按钮?我可以向您保证,前台和后台位置只需要始终进行身份验证。 @Paulw11 请更新我的代码。谢谢!!! 注意在教程中他们实现了didChangeAuthorizationStatus委托方法并使用它来启用mylocation按钮。您是否实施了该方法并针对您请求的“始终”授权进行了更改? 【参考方案1】:

在你的班级中添加这个委托:

CLLocationManagerDelegate

现在在你的课堂里:

var locationManager:CLLocationManager!
var map = GMSMapView()
var currentLatitude:Double!
var currentLongitude:Double!

然后在你的代码中添加这个:

override func loadView() 

    print("loadView called")

    // Enable some map settings

    map.isMyLocationEnabled = true
    map.settings.myLocationButton = true
    map.settings.compassButton = true
    map.settings.scrollGestures = true
    map.settings.zoomGestures = true
    map.delegate = self

    view = map


override func viewDidLoad() 

    super.viewDidLoad()

    print("ViewDidLoad called")

    // Configuring location manager.

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestAlwaysAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.startUpdatingLocation()
    locationManager.startMonitoringSignificantLocationChanges()


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 

    print("locationManager function called")

    // Fetch current location coordinates

    let locValue:CLLocationCoordinate2D = (locationManager.location?.coordinate)!
    currentLatitude = locValue.latitude
    currentLongitude = locValue.longitude
    print("Current Location = \(currentLatitude!), \(currentLongitude!)")

    // Zoom to current location

    let target = CLLocationCoordinate2D(latitude: currentLatitude!, longitude: currentLongitude!)
    map.camera = GMSCameraPosition.camera(withTarget: target, zoom: 17)

    locationManager.stopUpdatingLocation()


添加此代码后,右键单击您的 Info.plist 和“作为源代码打开”。将此添加到您的 Info.plist 中。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>googlechromes</string>
    <string>comgooglemaps</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSBluetoothPeripheralUsageDescription</key>
<string></string>
<key>NSCameraUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSMotionUsageDescription</key>
<string></string>
<key>NSPhotoLibraryUsageDescription</key>
<string></string>
<key>NSRemindersUsageDescription</key>
<string></string>
<key>NSSiriUsageDescription</key>
<string></string>
<key>NSSpeechRecognitionUsageDescription</key>
<string></string>
<key>NSVideoSubscriberAccountUsageDescription</key>
<string></string>

【讨论】:

以上是关于仅显示一个位置权限警报的主要内容,如果未能解决你的问题,请参考以下文章

给予不允许后当前位置权限警报视图未显示

向权限模式警报添加描述

位置服务权限警报消失

当前位置警报访问

显示相机和画廊权限的自定义警报 swift 3

单击链接(扩展器)后仅执行一次警报