私は成功せずにいくつかの派手な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 {
何が欠けているか間違っているのですか?ありがとうございました
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
多言語アプリの場合の翻訳。
まったく同じ問題がありました。私の場合、NSLocationAlwaysUsageDescription
がInfoPlist.strings
ローカライズファイルにも必要であることが判明しました。 Info.plist
にNSLocationAlwaysUsageDescription
があるだけでは不十分でした...
アラートが表示される前に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];
}
この行を.plistファイルに追加するだけです
<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>
最近使用したIOS 11で同様の問題が発生しました
locationManager.requestAlwaysAuthorization()
私にとっての解決策は、plist.infoに4つの権限をすべて追加してアラートを取得することでした。
場所の更新を開始してみてください(助けてくれました)
[self.locationManager startUpdatingLocation];
必ず正しいInfo.plistファイルにキーを追加してください。アプリ用とAppTest用があることを忘れないでください。
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)")
}
発見され、フォーラムで文書化され、それが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()
}
ダイアログは正常に表示されます
IOS 11の場合、以下に追加することが重要です。
NSLocationAlwaysAndWhenInUseUsageDescription
古い許可とともに
NSLocationAlwaysUsageDescription、NSLocationWhenInUseUsageDescription
requestAlwaysAuthorizationがアクセス許可アラートを表示しない問題を修正します。
このチュートリアルをコピーしました...
http://willd.me/posts/getting-started-with-ibeacon-a-Swift-tutorial
修正は非常に簡単でしたが、宣言しないで、それはボックスでうまくいきませんでした
let locationManager = CLLocationManager()
しかし、変数としてクラスに移動します
var locationManager = CLLocationManager()
そしてそれは動作します!!
アプリの場所のアクセス許可が設定されていない場合はプロンプトが表示され、アプリの場所のアクセス許可が「使用中」に設定されていると、以降の呼び出しは表示されません(そして、APIフィードバックがあるとは思わない呼び出しが飲み込まれた)。
Apple docs から:
ディスカッション現在の承認ステータスがnotDeterminedの場合、このメソッドは非同期で実行され、ユーザーにアプリにロケーションサービスを使用する許可を与えるように求めます。ユーザープロンプトには、アプリのInfo.plistファイルにNSLocationAlwaysUsageDescriptionキーからのテキストが含まれており、このメソッドを呼び出すにはそのキーの存在が必要です。ステータスが決定されると、ロケーションマネージャーは結果をデリゲートのlocationManager(:didChangeAuthorization :)メソッドに配信します。現在の承認ステータスがnotDetermined以外の場合、このメソッドは何もせず、locationManager(:didChangeAuthorization :)メソッドを呼び出しませんが、1つの例外があります。アプリが常に認証を要求したことがなく、現在の認証ステータスがauthorizedWhenInUseである場合、このメソッドを1回呼び出して、アプリの認証ステータスをauthorizedAlwaysに変更してみてください。
これを確認してください 参照リンク
IOS 11に関するすべての変更について説明しました。あなたの問題も、説明したケースの1つであるようです。問題を修正するために、コードにどのような変更を加える必要があるかを知ることができます。