簡體   English   中英

Swift:位置權限彈出窗口保持關閉狀態

[英]Swift: Location permission popup keeps closing

在Swift中試圖獲得用戶的經度和緯度時,我遇到了一個問題。 我有一個按鈕,它運行一個函數來獲取用戶的坐標,第一次按下它時,它應該請求允許給應用程序你的位置。 但是,我遇到的問題是,在我按下獲取位置按鈕后,此彈出窗口將自動關閉。

這是發生的事情: http//imgur.com/a/0wdnm

這是我的代碼:

class location: NSObject, CLLocationManagerDelegate {
var locationManager = CLLocationManager()

internal func getLocation() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest

    if CLLocationManager.authorizationStatus() == .AuthorizedAlways {
        locationManager.startUpdatingLocation()
    } else if CLLocationManager.authorizationStatus() == .NotDetermined {
        locationManager.requestAlwaysAuthorization()
    } else if CLLocationManager.authorizationStatus() == .Denied {
        print("User denied location permissions.")
    }
}


// MARK : CLLocationManagerDelegate protocol
@objc
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location: CLLocationCoordinate2D = (locationManager.location?.coordinate)!
    print(location.latitude)
    print(location.longitude)
    }
}

這里有一些適合我的代碼。 有些事情需要注意:

  1. 只在實際需要使用它時才創建CLLocationManager 如果用戶尚未啟用CoreLocation,那么他們將在創建位置管理器時收到警報,這可能是您的應用啟動時(可能是您想要的,也可能不是)。
  2. requestAlwaysAuthorization需要Info.plist中的[NSLocationAlwaysUsageDescription][1]條目。
  3. 觀察locationManager:didChangeAuthorizationStatus:如果服務不可用,則停止位置管理器。

碼:

import UIKit
import CoreLocation

class LocationViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager?

    internal func getLocation() {

        if locationManager == nil {

            locationManager = CLLocationManager()
            locationManager?.delegate = self
            locationManager?.desiredAccuracy = kCLLocationAccuracyBest
        }

        if CLLocationManager.authorizationStatus() == .AuthorizedAlways {
            locationManager?.startUpdatingLocation()
        } else if CLLocationManager.authorizationStatus() == .NotDetermined {
            locationManager?.requestAlwaysAuthorization()
        } else if CLLocationManager.authorizationStatus() == .Denied {
            print("User denied location permissions.")
        }
    }


    // MARK : CLLocationManagerDelegate protocol

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {

        switch status {

        case .AuthorizedAlways, .AuthorizedWhenInUse:
            locationManager?.startUpdatingLocation()

        default:
            locationManager?.stopUpdatingLocation()
        }
    }

    @objc func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        guard let location = locationManager?.location?.coordinate else {
            return
        }

        print(location.latitude)
        print(location.longitude)
    }
}

extension LocationViewController {

    @IBAction internal func buttonTapped(sender: AnyObject) {

        getLocation()
    }
}

當出現位置權限彈出窗口時,您不應再訪問位置。您只需等待用戶權限,而不是繼續使用位置相關功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM