web-dev-qa-db-ja.com

-[CLLocationManager requestWhenInUseAuthorization]または-[CLLocationManager requestAlwaysAuthorization]エラー

これは私のコードで、地図上の現在位置のアラートと青い点の両方を表示しています:

MapName.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>


@interface MapName : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property (strong, nonatomic) IBOutlet MKMapView *MapName;
@property (strong, nonatomic) CLLocationManager *locationManager;

@end

MapName.m

- (void)viewDidLoad
{
[super viewDidLoad];

self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

//Center the map
[self gotoLocation];

//Show current position
_MapName.showsUserLocation = YES;

}

Info.plistに文字列としてキーNSLocationWhenIsUseUsageDescriptionを追加しました。 Xcodeでも同じエラーが表示されます。

12
Max1980

それは両方の原因です:

[self.locationManager startUpdatingLocation];

そして

_MapName.showsUserLocation = YES;

これらを呼び出す前に、ユーザーが許可を与えているかどうかを確認する必要があります。また、ストーリーボードのMKMapKitで[ユーザーの場所]をオフにします(これを追跡するには数日かかりました)。

次のようなことをしてください:

CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus];

if (authorizationStatus == kCLAuthorizationStatusAuthorized ||
    authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
    authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {

    [self.locationManager startUpdatingLocation];       
    _MapName.showsUserLocation = YES;        

}

アプリによっては、起動時にユーザーの許可を求めたくない場合があります。

15
Romeithius

エラーメッセージはかなり文字通りです。承認が得られるまで、[self.locationManager startUpdatingLocation]を呼び出さないでください。ドキュメントによる[self.locationManager requestWhenInUseAuthorization]は非同期です。

現在の承認ステータスがkCLAuthorizationStatusNotDeterminedの場合、このメソッドは非同期で実行され、位置情報サービスを使用するための許可をアプリに付与するようユーザーに求めます。

これは、アクセスのプロンプトと同時にスキャンを開始することを意味します。

代わりに、-[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:]を実装し、許可があると判断された後でスキャンを開始してください。

4
incanus

オンSwift:

  let locationManager: CLLocationManager = CLLocationManager()
  let authorizationStatus = CLLocationManager.authorizationStatus()


  override func viewDidLoad() {
    super.viewDidLoad()
    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
       locationManager.startUpdatingLocation()
    }
    else
    {
      locationManager.requestWhenInUseAuthorization()
    }
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters

}

これらのキーをInfo.plistファイルに追加することを忘れないでください:

enter image description here

3
A.G

情報ファイルのキーワードは(「Is」ではなく「In」):

NSLocationWhenInUseUsageDescription
1
Peter Pei Guo

ジェロームの応答に基づいて、私が働いた答えをスウィフトに翻訳しました。

    let authorizationStatus = CLLocationManager.authorizationStatus()

    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
           self.findMyLocation()
    }

注:ドキュメントで読んだことから、SwiftにはkCLAuthorizationStatusAuthorizedに相当するものはありません。

0
jason328

この方法は、Xcode6でエラーなしで機能します。

AppDelegate.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) UIWindow *window;

@end 

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize locationManager = _locationManager;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions
 {
//Current position
    self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager requestWhenInUseAuthorization];

return YES;
}
@end

初めてアプリを開いたときに警告メッセージが表示されます

0
Max1980