web-dev-qa-db-ja.com

requestAlwaysAuthorizationに許可アラートが表示されない

私は成功せずにいくつかの派手なiBeacons、kCLAuthorizationStatusNotDeterminedを常に使用しようとしています。他の質問によると、これらのキーをinfo.plistに追加する必要があります(いくつかの質問は1つ、他の両方は言う)。 iBeaconsの記事によると、Alwaysオプションが必要です。

<key>NSLocationWhenInUseUsageDescription</key>
<string>Nothing to say</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Permiso para acceder siempre</string>

ViewDidAppearで:

self.locManager = [[CLLocationManager alloc]init];
self.locManager.delegate = self;
[self.locManager requestAlwaysAuthorization];
NSUUID* region1UUID = [[NSUUID alloc]initWithUUIDString:@""]; //ibeacon real UUID between "". Checked it's not nil.

self.beaconRegion = [[CLBeaconRegion alloc]
                                initWithProximityUUID:proximityUUID
                                identifier:@"myCoolString"];

self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = NO;
[self.locManager startMonitoringForRegion:self.beaconRegion];
[self.locManager startRangingBeaconsInRegion:self.beaconRegion];

アイコンは、最後の2つの方法のいずれかが実行されるまで、設定/プライバシー/場所に表示されませんでした。アクセス許可を承認するアラートビューは表示されません。ロケーション設定で手動変更を実行して確認すると、ステータスが変更されますが、しばらくすると設定でロケーションがアプリの「常に」ステータスを削除し、再び空白のままになります。後で私は運なしでチェックします

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

何が欠けているか間違っているのですか?ありがとうございました

27
Carlos Pastor

IOS 11開発者については、次の投稿をご覧ください: 位置情報サービスがiOS 11で機能しない


TL; DR:Info.plistに3つのロケーションキーがすべて必要です。

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>

に加えて InfoPlist.strings多言語アプリの場合の翻訳。

34
Elist

まったく同じ問題がありました。私の場合、NSLocationAlwaysUsageDescriptionInfoPlist.stringsローカライズファイルにも必要であることが判明しました。 Info.plistNSLocationAlwaysUsageDescriptionがあるだけでは不十分でした...

19
chris

アラートが表示される前にCLLocationManagerのインスタンスが破棄された場合、アラートは表示されないことに気付きました。私の場合、許可を求めるためにAppDelegateでロケーションマネージャーのローカル変数を作成していました。

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [locationManager requestAlwaysAuthorization];
}

ローカル変数をインスタンス変数に変更すると、アラートが表示されます:

@interface AppDelegate () {
    CLLocationManager *_locationManager;
}
@end

_locationManager = [[CLLocationManager alloc] init];
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [_locationManager requestAlwaysAuthorization];
}
13
balkoth

この行を.plistファイルに追加するだけです

<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>
7
Artyom Devyatov

最近使用したIOS 11で同様の問題が発生しました

locationManager.requestAlwaysAuthorization()

私にとっての解決策は、plist.infoに4つの権限をすべて追加してアラートを取得することでした。

  • プライバシー-使用中の場所使用方法の説明
  • プライバシー-ロケーション使用の説明
  • プライバシー-場所は常に使用法の説明
  • プライバシー-常に場所と使用中の使用状況の説明
4
Bachir

場所の更新を開始してみてください(助けてくれました)

[self.locationManager startUpdatingLocation];
3

必ず正しいInfo.plistファイルにキーを追加してください。アプリ用とAppTest用があることを忘れないでください。

2
Josh B

Swift 3.X Latestコードを簡単に使用

import CoreLocation

 public var locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()


        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()

}



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

        let altitudeG = locations.last?.altitude
        let longitudeG = locations.last?.coordinate.longitude
        let latitudeG = locations.last?.coordinate.latitude

print("\(altitudeG) \(longitudeG) \(latitudeG)")

    }
2
SwiftDeveloper

発見され、フォーラムで文書化され、それがObjective-C iOS 8関連のバグであることをテストしました。 Swift=だけで動作します。作業Swiftコード、デリゲートは呼び出しです。

プロジェクトの設定/ターゲット/機能/バックグラウンドモードにコアロケーションフレームワークを追加します。「ロケーションの更新」と「Bluetooth LEアクセサリを使用」を設定します。

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate  {

var locManager: CLLocationManager?

override func viewDidLoad() {
    super.viewDidLoad()
    self.locManager = CLLocationManager();
    self.locManager!.delegate = self;
    if (!CLLocationManager.locationServicesEnabled()) {
        println("Location services are not enabled");
    }
    self.locManager!.requestAlwaysAuthorization();
    self.locManager!.pausesLocationUpdatesAutomatically = false;
    let uuidString = ""  // My ibeacon string there
    let beaconIdentifier = "myCompany"
    let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)
    let beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconUUID,
        identifier: beaconIdentifier)
    self.locManager!.startMonitoringForRegion(beaconRegion)
    self.locManager!.startRangingBeaconsInRegion(beaconRegion)
    self.locManager!.startUpdatingLocation()
}

ダイアログは正常に表示されます

2
Carlos Pastor

IOS 11の場合、以下に追加することが重要です。

NSLocationAlwaysAndWhenInUseUsageDescription

古い許可とともに

NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription

requestAlwaysAuthorizationがアクセス許可アラートを表示しない問題を修正します。

0
user3159598

このチュートリアルをコピーしました...

http://willd.me/posts/getting-started-with-ibeacon-a-Swift-tutorial

修正は非常に簡単でしたが、宣言しないで、それはボックスでうまくいきませんでした

let locationManager = CLLocationManager()

しかし、変数としてクラスに移動します

var locationManager = CLLocationManager()

そしてそれは動作します!!

0
user3069232

アプリの場所のアクセス許可が設定されていない場合はプロンプトが表示され、アプリの場所のアクセス許可が「使用中」に設定されていると、以降の呼び出しは表示されません(そして、APIフィードバックがあるとは思わない呼び出しが飲み込まれた)。

Apple docs から:

ディスカッション現在の承認ステータスがnotDeterminedの場合、このメソッドは非同期で実行され、ユーザーにアプリにロケーションサービスを使用する許可を与えるように求めます。ユーザープロンプトには、アプリのInfo.plistファイルにNSLocationAlwaysUsageDescriptionキーからのテキストが含まれており、このメソッドを呼び出すにはそのキーの存在が必要です。ステータスが決定されると、ロケーションマネージャーは結果をデリゲートのlocationManager(:didChangeAuthorization :)メソッドに配信します。現在の承認ステータスがnotDetermined以外の場合、このメソッドは何もせず、locationManager(:didChangeAuthorization :)メソッドを呼び出しませんが、1つの例外があります。アプリが常に認証を要求したことがなく、現在の認証ステータスがauthorizedWhenInUseである場合、このメソッドを1回呼び出して、アプリの認証ステータスをauthorizedAlwaysに変更してみてください。

0
Crag

これを確認してください 参照リンク

IOS 11に関するすべての変更について説明しました。あなたの問題も、説明したケースの1つであるようです。問題を修正するために、コードにどのような変更を加える必要があるかを知ることができます。

0