基本的なマップビューを実装し、ユーザーの現在の場所を注釈としてマップに追加しようとしています。 info.plistにrequestwheninuseキーを追加し、coreLocationをインポートしました。
私のView Controllerのdid loadメソッドには、以下があります:
locManager.requestWhenInUseAuthorization()
var currentLocation : CLLocation
if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){
currentLocation = locManager.location
println("currentLocation is \(currentLocation)")
}
else{
println("not getting location")
// a default pin
}
プロンプトを再取得しています。場所を取得する権限。これが発生しているため、ユーザーが[OK]をタップする機会が得られる前に実行されるため、場所を取得できないというメッセージが表示されます。アプリを起動して戻ってきたら、場所を取得して地図に追加できます。ただし、ユーザーが最初に[OK]をタップしたときに、現在の場所を取得して地図に追加できるようにする必要があります。どうすればこれを達成できますか?ピンを追加するには、次の方法があります。
func addPin(location2D: CLLocationCoordinate2D){
self.mapView.delegate = self
var newPoint = MKPointAnnotation()
newPoint.coordinate = location2D
self.mapView.addAnnotation(newPoint)
}
そのためには、didChangeAuthorizationStatus
が初期化された直後に呼び出されるロケーションマネージャーデリゲートのmethodCLLocationManager
を実装する必要があります。
まず、ファイルの先頭に追加することを忘れないでください:_import CoreLocation
_
これを行うには、場所を使用しているクラスにデリゲートプロトコルを追加します。次に、viewDidLoad
メソッド(またはapplicationDidFinishLaunching
を使用している場合はAppDelegate
)でロケーションマネージャを初期化し、そのdelegate
プロパティをself
に設定します。
_class myCoolClass: CLLocationManagerDelegate {
var locManager: CLLocationManager!
override func viewDidLoad() {
locManager = CLLocationManager()
locManager.delegate = self
}
}
_
最後に、前に宣言したクラスの本体にlocationManager(_didChangeAuthorizationStatus__)メソッドを実装します。このメソッドは、ユーザーがボタンをクリックするとすぐに、承認のステータスが変更されたときに呼び出されます。次のように実装できます。
_private func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
// If status has not yet been determied, ask for authorization
manager.requestWhenInUseAuthorization()
break
case .authorizedWhenInUse:
// If authorized when in use
manager.startUpdatingLocation()
break
case .authorizedAlways:
// If always authorized
manager.startUpdatingLocation()
break
case .restricted:
// If restricted by e.g. parental controls. User can't enable Location Services
break
case .denied:
// If user denied your app access to Location Services, but can grant access from Settings.app
break
default:
break
}
}
_
Swift 4-新しい列挙型構文
Swift 4の場合、各列挙型の大文字の最初の文字を小文字に切り替えます(.notDetermined、.authorizedWhenInUse、.authorizedAlways、.restrictedおよび.denied)
そうすれば、ユーザーが許可を与えるか取り消すだけで、すべてのケースを処理できます。