2016-05-01 19 views
3

私はiOS 9.3用のアプリをswiftで作成しており、ユーザーの場所を示すために地図が必要です。 私はCLLocationManagerとそのデリゲートを初期化し、私はInfo.plistの プライバシー設定 - 場所の使用説明文字列をしてrequestWhenInUseAuthorizationを呼び出すが、それはすべての認証要求は表示されません。ここでSwift requestWhenInUseAuthorization not working

は私のコードです:

import UIKit 
import MapKit 

class DetailController: UIViewController, CLLocationManagerDelegate { 

    var locManager: CLLocationManager! 

    @IBOutlet var myMap: MKMapView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mostraPosizione() 
    } 

    func mostraPosizione(){ 
     locManager = CLLocationManager() 
     locManager.delegate = self 
     locManager.desiredAccuracy = kCLLocationAccuracyBest 

     let authorizationStatus = CLLocationManager.authorizationStatus() 

     if (authorizationStatus == CLAuthorizationStatus.NotDetermined) { 
      locManager.requestWhenInUseAuthorization() 
     } else { 
      locManager.startUpdatingLocation() 
     } 


     myMap.showsUserLocation = true 
    } 

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

     if (status == CLAuthorizationStatus.NotDetermined) { 
      locManager.requestWhenInUseAuthorization() 

     } else { 
      locManager.startUpdatingLocation() 
     } 
    } 
} 

と私のInfo.plistからのスクリーンショット info.plist

Xcodeの出力:場所の承認を求めるプロンプトを表示せずにMapKitの位置情報の更新を開始しようとすると

。 - [CLLocationManager requestWhenInUseAuthorization] または - [CLLocationManager requestAlwaysAuthorization]を最初に呼び出す必要があります。

iPhone 5(iOS 9.3)シミュレータでテストしています。

このような問題は何ですか? 誰にも助言がありますか?

+0

私はmostraPosizione内)ので、nilで解決することはできません== – SunilG

答えて

2

私は

let authorizationStatus = CLLocationManager.authorizationStatus() 

はので、あなたのrequestWhenInUseAuthorization()が呼び出されることはありませんnilあるので、それはだと思います。

let authorizationStatus = CLLocationManager.authorizationStatus() 

    if (authorizationStatus == CLAuthorizationStatus.NotDetermined) || (authorizationStatus == nil) { 
     locManager.requestWhenInUseAuthorization() 
    } else { 
     locManager.startUpdatingLocation() 
    } 

が有効である必要があります。

編集

ユーザーは、ユーザー、

if (authorizationStatus == CLAuthorizationStatus.Denied) { 
    // Display a message, do what you want 
} 

は確かに一度、ユーザーがポップアップが再び表示させることができないの承認を拒否した要求を拒否した場合も、ケースを処理する必要がありますアプリの設定で自分の位置を使用する権限を設定する必要があります。ただし、アプリから設定に直接リンクすることができるようになりましたので、ユーザーにとっては簡単です。

// Open the settings of your app 
if let url = NSURL(string:UIApplicationOpenSettingsURLString) { 
    UIApplication.sharedApplication().openURL(url) 
} 
+0

authorizationStatusが欠落していると思います()は、ユーザーがビューとやりとりするまで無限ループを作成します。これは悪いです。しばらくするとクラッシュする –

1

NSLocationWhenInUseUsageDescriptionキーをinfo.plistに追加するのがソリューションです。

2

サイズのためにこれを試してみてください上:

override func viewDidLoad() { 
    super.viewDidLoad() 

    //put code here 
    locManager = CLLocationManager() 
    locManager.delegate = self 
    locManager.desiredAccuracy = kCLLocationAccuracyBest 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    //make sure the view is loaded first before adding subviews 
    mostraPosizione() 
} 

func mostraPosizione(){ 
    let authorizationStatus = CLLocationManager.authorizationStatus() 

    if (authorizationStatus == .authorizedWhenInUse) { 
     locManager.startUpdatingLocation() 
     myMap.showsUserLocation = true 
    } else { 
     locManager.requestWhenInUseAuthorization() 
     mostraPosizione() 
    } 
} 

要求は、要求が呼び出されたときにビューがロードされて完了しなかったためでしまで表示されませんでした理由。 viewDidAppear()を使用すると、その問題が修正されます。

私はコードにもいくつか変更を加えましたが、これはうまくいくようです。私は以下のコードに変更を加えましたが、他の機能は同じままです。

私はこのコードをSwift 3に書いていますが、プリンシパルは同じです。

+0

呼び出すmostraPosizione(「タイプの値 『CLAuthorizationStatus』はゼロになることはありません、比較が許可されていない」あなたはplistの中locationwheninusage記述キー –