我一直试图用MKMapview移动我的iOS7应用程序以支持iOS8。但是,我无法获得用户共享其位置以正常工作的新请求。我在故事板上创建我的MKMapView,并且代理设置并在iOS7上完美运行。以下是我为支持iOS8位置共享而添加的内容:
myMapView.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface myMapView : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocationManager *locationManager;
myMapView.m
//Code omitted
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
//Code omitted
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
if(IS_OS_8_OR_LATER) {
//[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
[self.locationManager startUpdatingLocation];
}
[self.mapView setShowsUserLocation:YES];
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = self.locationManager.location.coordinate.latitude;
region.center.longitude = self.locationManager.location.coordinate.longitude;
region.span.latitudeDelta = 0.0187f;
region.span.longitudeDelta = 0.0137f;
[self.mapView setRegion:region animated:YES];
_initialPosition = NO;
}
此外,我在InfoPlist中设置了NSLocationAlwaysUsageDescription
密钥及其值,在提示用户分享其位置时会显示正确的消息。
不幸的是,委托函数-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
永远不会被调用。虽然每次加载viewController时都会调用[self.locationManager startUpdatingLocation]
,但委托似乎没有响应它。我是如何设置委托的问题还是我在这里缺少的其他东西?
更新:似乎我的gpx文件在启动时没有被调用。我已清除并重新加载了我的位置文件,甚至更改为默认位置,但找不到位置:Domain=kCLErrorDomain Code=0
更新2:以下是我实际上已成功完成用户请求的设置中的SS,但无论刷新多少都无法获取/更新位置。 App privacy level: Location sharing always http://barisaltop.com/location.png
谢谢!
答案 0 :(得分:7)
前几天我遇到了同样的问题。解决方案是将string
密钥NSLocationAlwaysUsageDescription
(适用于[CLLocationManager requestAlwaysAuthorization]
)或NSLocationWhenInUseUsageDescription
(适用于[CLLocationManager requestWhenInUseAuthorization]
)添加到支持文件/ Info.plist < /强>
您还可以使用右键单击&gt;编辑Info.Plist
的源代码。打开&gt;源代码并添加以下行:
<!-- for requestAlwaysAuthorization -->
<key>NSLocationAlwaysUsageDescription</key>
<string>Explain for what are you using the user location</string>
<!-- for requestWhenInUseAuthorization -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>Explain for what are you using the user location</string>
希望这有帮助。
答案 1 :(得分:1)
最后,我成功地在模拟器上运行我的gpx文件。似乎第一次安装Xcode 6后,可能会出现导致gpx文件模拟的错误。以下是我克服这个问题的方法:
我不知道为什么,但这对我有用。