これは私のコードで、地図上の現在位置のアラートと青い点の両方を表示しています:
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でも同じエラーが表示されます。
それは両方の原因です:
[self.locationManager startUpdatingLocation];
そして
_MapName.showsUserLocation = YES;
これらを呼び出す前に、ユーザーが許可を与えているかどうかを確認する必要があります。また、ストーリーボードのMKMapKitで[ユーザーの場所]をオフにします(これを追跡するには数日かかりました)。
次のようなことをしてください:
CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusAuthorized ||
authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {
[self.locationManager startUpdatingLocation];
_MapName.showsUserLocation = YES;
}
アプリによっては、起動時にユーザーの許可を求めたくない場合があります。
エラーメッセージはかなり文字通りです。承認が得られるまで、[self.locationManager startUpdatingLocation]
を呼び出さないでください。ドキュメントによる[self.locationManager requestWhenInUseAuthorization]
は非同期です。
現在の承認ステータスが
kCLAuthorizationStatusNotDetermined
の場合、このメソッドは非同期で実行され、位置情報サービスを使用するための許可をアプリに付与するようユーザーに求めます。
これは、アクセスのプロンプトと同時にスキャンを開始することを意味します。
代わりに、-[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:]
を実装し、許可があると判断された後でスキャンを開始してください。
オン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ファイルに追加することを忘れないでください:
情報ファイルのキーワードは(「Is」ではなく「In」):
NSLocationWhenInUseUsageDescription
ジェロームの応答に基づいて、私が働いた答えをスウィフトに翻訳しました。
let authorizationStatus = CLLocationManager.authorizationStatus()
if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
self.findMyLocation()
}
注:ドキュメントで読んだことから、SwiftにはkCLAuthorizationStatusAuthorized
に相当するものはありません。
この方法は、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
初めてアプリを開いたときに警告メッセージが表示されます