回答:
追跡するのは難しいですが、これに対する解決策は非常に簡単です。
多くの試行錯誤の結果、アプリの位置情報サービスに初めてアクセスしようとすると位置情報アクセスダイアログがポップアップ表示されますが、次の場合はダイアログが自然に消えます(ユーザーの操作なし)。 CLLocationManagerされますがオブジェクトが前に解放されたユーザーはダイアログに応答します。
メソッドでCLLocationManagerインスタンスを作成していましたviewDidLoad。これはメソッドのローカルインスタンスであるため、メソッドの実行が完了した後で、インスタンスはARCによって解放されました。インスタンスが解放されるとすぐに、ダイアログは消えました。解決策はかなりシンプルでした。変更CLLocationManagerメソッドレベルの変数は、クラスレベルのインスタンス変数であるとされてからインスタンス。これで、CLLocationManagerクラスがアンロードされた後にのみインスタンスが解放されます。
私も同じような状況に直面しています。デバッグした後、私は見つけました
let locationManager = CLLocationManager()
メソッドスコープで呼び出されますが、グローバルに呼び出す必要があります。
どうして?
一言で言えば、locationManagerはメソッドが戻った後にリリースされています。ただし、ユーザーが許可を与えるか拒否するまで、リリースしないでください。
私は同じ問題に陥ります(少なくとも症状によって)。私の場合、問題は- (void)applicationWillResignActive:(UIApplication *)application;メソッドにありCLLocationManager、バックグラウンドトランジションの準備の一環としてインスタンスを解放していました。取り外して放置しただけで- (void)applicationDidEnterBackground:(UIApplication *)application;問題はなくなりました。
トリッキーな部分は、Core Locationアラートがアプリケーションをフォアグラウンドで停止していることです。
それがあなたを助けることを願って、そのろくでなしを見つけるのに私に多くの時間をかけました:)
私はこれが非常に遅い返事であることを知っています。しかし、それは誰かを助けるかもしれません。私も同じ問題に直面し、問題を特定するために1時間を費やしました。最初、私のコードはこのようなものでした。
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
CLLocation *location = locationManager.location;
//my stuff with the location
[locationManager release];
これで、ロケーションアラートがすばやく表示されました。最後の行のコメントを外すと、正しく機能しています。
// [locationManager release];
私もこの問題に遭遇しましたが、私の場合の解決策は、受け入れられた回答とはまったく異なることがわかりました。
私のアプリでは、stopUpdatingLocationから呼び出していましたapplicationWillResignActive。applicationWillResignActive許可ダイアログが表示されたときに呼び出されるため、これは問題でした。これはのstopUpdatingLocation直後に発生していたstartUpdatingLocationため、ダイアログはすぐに消えていました。
ソリューションは、コールに単純だったstopUpdatingLocationからapplicationDidEnterBackground代わりに。
これは、iOSシミュレーターを使用しているときに起こりました。Run Schemeがロケーションをシミュレーションしていたために発生していると判断しました。これはlocationManager.startUpdatingLocation()起動時に呼び出すのと同じ効果があると思いますので、ダイアログを閉じていました。
[スキームの編集]ダイアログの[ロケーションシミュレーションを許可]チェックボックスをオフにすると、問題が修正されました。期待どおりに動作し、権限が設定されたら、位置シミュレーションを再度有効にすると、シミュレータはそれ以降正常に動作します。
必ずプライバシーライン(常に、およびwhenInUseの両方)を.plistファイルに追加し、CoreLocationフレームワークをプロジェクトに追加してください。
変更すると、場所の許可ダイアログが正しく表示されます:
locationManager.requestAlwaysAuthorization()
と:
locationManager.requestWhenInUseAuthorization()
PS。:すべてのアドバイスを試してみましたが、すべて失敗しました(locationManagerの代わりにに承認を要求しviewDidLoad、要求後に開始しないでください。バグだと思います。できるだけ早く解決してくれることを願っています。varletstartUpdatingLocation()
SWIFT 4 @Zoliソリューションは次のようになります。
class WhateverViewController: UIViewController {
let locationManager = CLLocationManager() // here is the point of the @Zoli answer
// some code
override func viewDidLoad() {
super.viewDidLoad()
// some other code
locationManager.requestWhenInUseAuthorization()
// some other code
}
}
ほとんどの場合、locationManager変数をグローバルオブジェクトとして定義します。
@interface ViewController : UIViewController
{
CLLocationManager *locationManager;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
}
私はあなたの同じ状況に会いました。
#インポート
@interface ViewController()
@終わり
@implementation ViewController
@synthesize locManager; //後
-(void)viewDidLoad {
[super viewDidLoad];
//ビューを読み込んだ後、通常はnibから追加の設定を行います。
// MyLocationService * locManager = [[BSNLocationService alloc] init:nil]; // 前。場所。このメソッドの後でインスタンスが無効になったため、デリゲートは機能しませんでした。
self-> locManager = [[MyLocationService alloc] init:nil]; //後
locManager.startService;
}