2017-03-18 19 views
1

Location ManagerメソッドのrequestWhenInUseAuthorization()またはstartUpdatingLocation()が呼び出されていない場合でも、アプリケーションが最初に実行されるたびに位置マネージャ(_:変更を変更しました)が呼び出されますか?locationManager(_:変更を承認しました:)は、アプリを最初に実行すると実行されますか?

extension ViewController: CLLocationManagerDelegate { 
     
    // Called from findOutPressed to get location when button is clicked 
    func getLocation() { 
        let status = CLLocationManager.authorizationStatus() 
        handleLocationAuthorizationStatus(status: status) 
    } 
     
    // Respond to the result of the location manager authorization status 
    func handleLocationAuthorizationStatus(status: CLAuthorizationStatus) { 
        switch status { 
        case .notDetermined: 
            locationManager.requestWhenInUseAuthorization() 
        case .authorizedWhenInUse, .authorizedAlways: 
            locationManager.startUpdatingLocation() 
        case .denied: 
            print("I'm sorry - I can't show location. User has not authorized it") 
        case .restricted: 
            print("Access denied - likely parental controls are restricting use in this app.") 
        } 
    } 
     
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
        handleLocationAuthorizationStatus(status: status) 
    } 
     
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
         
        let currentLocation = locations.last 
         
        let labelText = "My location is: latitude = \((currentLocation?.coordinate.latitude)!), longitude = \((currentLocation?.coordinate.longitude)!)" 
         
        resultLabel.text = labelText 
         
        locationManager.stopUpdatingLocation() 
    } 
     
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
        print("Dang, there was an error! Error: \(error)") 
    } 
} 

私は場所を見つけることだ:

@IBAction func findOutPressed(_ sender: UIButton) { 
    getLocation() 
} 

マイCoreLocationコードは、下記の拡張である:私は、私は以下の@IBActionに呼び出しボタンをクリックするだけで位置を報告しようとしています@IBActionのfindOutPressedがクリックで起動されていなくても、ユーザーがボタンをクリックする前に最初の空白のresultsLabelで結果が更新されていても、Manager(変更の承認を受けたかどうか)がすぐに実行されています。私はボタンがクリックされたかどうかを判断するためのフラグを設定できることを知っています。ラベルがあらかじめ成熟して更新されないようにしていますが、位置管理(_:変更の承認を行った) "このメソッドは、アプリケーションの位置情報サービスを変更する機能が変更されたときに呼び出されます。ユーザーがアプリケーションまたはシステム全体の位置情報サービスの使用を許可または拒否したために変更が発生する可能性があります。 これは、アプリケーションが最初に実行されたときにトリガするケースをカバーしているようではありません。私は、認可の変更が何が起こっているのかを私に直接理解させてくれる人には感謝しています。もし私が何か基本的なことを忘れてしまったら、お詫び ありがとう!

答えて

3

didChangeAuthorizationはCLLocationManagerが作成されたときに呼び出され、そうであっても、これはトリガします:

var locationManager = CLLocationManager() 
// ... 
locationManager?.delegate = self 
// ... 
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
    print("authorization checked...") 
} 

だから、あなたはおそらく、AppDelegateの一番上にlocationManagerを初期化&を設定していますか?それはそれを引き起こすでしょう。次に、didChangeAuthorizationが位置の更新を開始し、ボタンが実際にタップされる前にdidUpudateLocationを呼び出すようになります。

たぶんfindOutPressed(唯一のオプションとinitとしてlocationManagerを宣言する)例えば:

// class var: 
var locationManager:CLLocationManager?location managers, 
// ... 
@IBAction func findOutPressed(_ sender: UIButton) { 
    locationManager = CLLocationManager() 
    locationManager?.delegate = self 

    getLocation() 
} 
+0

ありがとう!これはうまくいきました。私はまた別の奇妙なことにも気づいています。私がSimulatorの場所を変更した場合:カスタムロケーションからアップルまで、アップルのロケーションはその後のクリックでは表示されません。シミュレータを終了してアプリケーションを再実行すると、変更が有効になるのがわかりますが、私がカスタム位置に戻った場合、変更を見る前に同じアプリケーションを終了して再実行する必要があります。この標準的な動作ですか、それ以外の何か起きているのですか? – Gallaugher

関連する問題