問題描述
我正在嘗試制作一個使用設備當前位置的 iOS7 應用程序.我在我的 Mac 上使用 iPhone 模擬器,但我遇到了一些問題.每次出現位置管理器所在的視圖時,它都會打印出 0.000000 的緯度和經度,即使在我設置了自定義位置(從模擬器>調試>位置)之后也是如此.
I'm trying to make an iOS7 app that uses the current location of the device. I'm using the iPhone simulator on my Mac, but I'm having some problems. Every time my view that the location manager is in appears, it prints out 0.000000 for both latitude and longitude, even after I've set a custom location (from simulator>debug>location).
此外,模擬器在打開應用程序時沒有請求使用當前位置的權限似乎很奇怪.有人知道這里發生了什么嗎?
Also, it seemed strange that the simulator didn't ask for permission to use current location when it opened the app. Anybody know what's going on here?
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[super viewDidLoad];
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];
_location = [locationManager location];
_coord.longitude = _location.coordinate.longitude;
_coord.latitude = _location.coordinate.latitude;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
_coord.longitude = _location.coordinate.longitude;
_coord.latitude = _location.coordinate.latitude;
printf("%f
",self.coord.longitude);
printf("%f
",self.coord.latitude);
}
推薦答案
需要從委托方法didUpdateLocationToLocation:fromLocation:中獲取newLocation.還要實現 didFailWithError 委托方法.您需要一些時間才能開始獲取更新的位置,因此需要委托調用.
You need to get the newLocation from the delegate method didUpdateLocationToLocation:fromLocation:. Also implement didFailWithError delegate method. It takes some time before you start getting updated locations, hence the delegate call.
最后一個位置通常被緩存,因此檢查位置的時間戳并將舊位置過濾掉可能是明智之舉.
The last location is usually cached, so it maybe wise to check location's timestamp and filter the old location out.
這是我能提供的最簡潔的例子.在 Xcode 中啟動新項目,選擇 Single View 應用程序模板,iPhone.不要觸摸情節提要,只需用它替換 ViewController.m 的內容并在模擬器或設備中運行.如果在模擬器上,請轉到調試并設置一些位置,您將在控制臺中獲得坐標.當視圖打開或關閉屏幕時,我也會開始和停止位置更新.
This is the cleanest example I can provide. Start new project in Xcode, pick Single View application template, iPhone. Don't touch storyboard, just replace content of your ViewController.m with this and run in Simulator or device. If on Simulator, go to Debug and set some location and you will get coordinates in the console. I am also starting and stopping location updates when the view goes on or off screen.
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
@implementation ViewController
#pragma mark - Location Manager delegate methods
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if ([newLocation.timestamp timeIntervalSinceNow] >= -300.0) {
NSLog(@"updated location with latitude %f longitude %f", newLocation.coordinate.longitude, newLocation.coordinate.latitude);
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.locationManager startUpdatingLocation];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.locationManager stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if(error.code == kCLErrorDenied) {
// alert user
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Access to location services is disabled"
message:@"You can turn Location Services on in Settings -> Privacy -> Location Services"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
} else if(error.code == kCLErrorLocationUnknown) {
NSLog(@"Error: location unknown");
} else {
NSLog(@"Error retrieving location");
}
}
#pragma mark - Location Manager getter
- (CLLocationManager *)locationManager
{
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
_locationManager.distanceFilter = 60.0;
}
return _locationManager;
}
@end
這篇關于Mac 上的 iOS 7 模擬器不適用于自定義位置(也不會請求許可)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!