web-dev-qa-db-ja.com

ユーザーが位置情報サービスを拒否した後、再度許可を要求しますか?

ユーザーの場所を追跡し、これを使用してロードが最初にロードされるときに許可を求めます:

locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()

ユーザーが拒否したが、後でアプリの構成オプションを有効にすることで気が変わった場合、もう一度尋ねるにはどうすればよいですか?たとえば、ユーザーの位置を自動検出するためのスイッチがあるので、ユーザーが有効にしたときにこれを実行しようとしています:

@IBAction func gpsChanged(sender: UISwitch) {
    // Request permission for auto geolocation if applicable
    if sender.on {
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()
    }
}

しかし、このコードは何もしないようです。アプリがユーザーの位置を追跡できるようにするかどうかをユーザーに再度尋ねることを望んでいました。これは可能ですか?

23
TruMan1

OSはユーザーに一度だけプロンプトを表示します。許可を拒否した場合、それだけです。 canで行うことは、UIApplicationOpenSettingsURLStringUIApplicationopenURL:メソッドに渡すことにより、ユーザーをアプリの設定に誘導することです。必要に応じて、そこから位置情報サービスを再度有効にすることができます。ただし、許可を得るためにそれらを盗聴することについては、あまり積極的であってはなりません。

53
bgilham

許可ポップアップは一度だけ表示されます。そのため、ユーザーをSettingsにリダイレクトする必要があります。 Swiftのコードは次のとおりです。

 import CoreLocation 
 @IBAction func userDidClickButton(_ sender: Any) {

    // initialise a pop up for using later
    let alertController = UIAlertController(title: "TITLE", message: "Please go to Settings and turn on the permissions", preferredStyle: .alert)
    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }
        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in })
         }
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(cancelAction)
    alertController.addAction(settingsAction)

    // check the permission status
    switch(CLLocationManager.authorizationStatus()) {
        case .authorizedAlways, .authorizedWhenInUse:
            print("Authorize.")
            // get the user location
        case .notDetermined, .restricted, .denied:
            // redirect the users to settings
            self.present(alertController, animated: true, completion: nil)
    }
}
12
Allen

別の解決策があります!!アプリのプッシュ通知の受信を許可するようユーザーを説得できる、より良いメッセージで独自のアラートを表示できます。ユーザーが許可する場合、プッシュ通知を有効にするためにデフォルトの許可アラートを表示するだけですアプリのいくつかのイベント。

2
Khushabu

ユーザーが許可を拒否した後でも許可アラートを処理する通知用の許可マネージャーを含むライブラリを作成しました。

https://github.com/CrazyPro007/PermissionManager/tree/master/PermissionManager/PermissionManager

1
CrazyPro007

チャンスは1つだけです。ユーザーが許可を拒否した後に許可を有効にするには、設定アプリを使用する必要があります。 CLLocationManager の位置情報サービスを使用する許可のリクエストを参照してください。

1
Connor