Google Maps iOS SDK, получение текущего местоположения пользователя
для меня iOS
app (здание в iOS7
), Мне нужно показать текущее местоположение пользователя при загрузке приложения.Я использую Google Maps iOS SDK
. Я следую этому
Google Map
Но я не могу понять. Пожалуйста, помогите, если вы идете по пути.
7 ответов
кажется Google Maps iOS SDK
не удается получить доступ к позиции устройства.
Таким образом, вы должны получить позицию, используя CLLocationManager
of iOS
.
во-первых, добавьте CoreLocation.framework
проект :
- поехать в
Project Navigator
- выберите проект
- перейдите на вкладку
Build Phases
- добавить
CoreLocation.framework
наLink Binary with Libraries
тогда все, что вам нужно сделать, это следовать основной exemple Apple документация.
-
создать
CLLocationManager
видимо в вашейViewDidLoad
:if (nil == locationManager) locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; //Configure Accuracy depending on your needs, default is kCLLocationAccuracyBest locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; // Set a movement threshold for new events. locationManager.distanceFilter = 500; // meters [locationManager startUpdatingLocation];
С CLLocationManagerDelegate
каждый раз, когда позиция обновляется, вы можете обновить позицию пользователя на вашем Google Maps
:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations {
// If it's a relatively recent event, turn off updates to save power.
CLLocation* location = [locations lastObject];
NSDate* eventDate = location.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0) {
// Update your marker on your map using location.coordinate.latitude
//and location.coordinate.longitude);
}
}
забудьте мой предыдущий ответ. Он хорошо работает, если вы используете родной MapKit.рамки.
на самом деле GoogleMaps для iOS делает всю работу за вас. Вам не нужно использовать CoreLocation напрямую.
единственное, что вам нужно сделать, это добавить yourMapView.myLocationEnabled = YES;
и фреймворк сделает все. (Кроме центрирования карты на вас).
что я сделал : я просто следовал инструкциям следующее документация. И у меня есть карта в центре. Но если бы я увеличил масштаб и переместился на свое место (если вы используете реальное устройство, иначе используйте инструменты симулятора, чтобы сосредоточиться на местоположении Apple), я мог бы увидеть синюю точку на моей позиции.
теперь, если вы хотите обновить карту, чтобы следовать вашей позиции, вы можете скопировать пример Google MyLocationViewController.m
это включено в каталог framework. Они просто добавляют наблюдателя на myLocation
свойство для обновления свойств камеры:
@implementation MyLocationViewController {
GMSMapView *mapView_;
BOOL firstLocationUpdate_;
}
- (void)viewDidLoad {
[super viewDidLoad];
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
longitude:151.2086
zoom:12];
mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
mapView_.settings.compassButton = YES;
mapView_.settings.myLocationButton = YES;
// Listen to the myLocation property of GMSMapView.
[mapView_ addObserver:self
forKeyPath:@"myLocation"
options:NSKeyValueObservingOptionNew
context:NULL];
self.view = mapView_;
// Ask for My Location data after the map has already been added to the UI.
dispatch_async(dispatch_get_main_queue(), ^{
mapView_.myLocationEnabled = YES;
});
}
- (void)dealloc {
[mapView_ removeObserver:self
forKeyPath:@"myLocation"
context:NULL];
}
#pragma mark - KVO updates
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if (!firstLocationUpdate_) {
// If the first location update has not yet been recieved, then jump to that
// location.
firstLocationUpdate_ = YES;
CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];
mapView_.camera = [GMSCameraPosition cameraWithTarget:location.coordinate
zoom:14];
}
}
@end
С док я дал вам и образцы включены в рамках Вы должны иметь возможность делать то, что хотите.
Xcode 8.1, Swift 3, Google Maps iOS 2.1
шаг за шагом рецепт:
1.) Добавьте строку ключа в Info.plist (открыть как исходный код):
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs your location to function properly</string>
2.) Add CLLocationManagerDelegate
для вашего класса контроллера вида:
class MapViewController: UIViewController, CLLocationManagerDelegate {
...
}
3.) Add CLLocationManager
в свой класс:
var locationManager = CLLocationManager()
var didFindMyLocation = false
4.) Спросите разрешения:
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
...
}
5.) Дождитесь авторизации и включите location:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.authorizedWhenInUse {
yourMapView.isMyLocationEnabled = true
}
}
6.) Добавить заметно изменение местоположения:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if !didFindMyLocation {
let myLocation: CLLocation = change![NSKeyValueChangeKey.newKey] as! CLLocation
// do whatever you want here with the location
yourMapView.camera = GMSCameraPosition.camera(withTarget: myLocation.coordinate, zoom: 10.0)
yourMapView.settings.myLocationButton = true
didFindMyLocation = true
print("found location!")
}
}
вот именно!
на любом устройстве iOS, получить местоположение пользователя с Расположенный. В частности, вы хотите CLLocation класс (и CLLocationManager).
является ли метод делегата didTapMyLocationButton не способом?
- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView {
return YES;
}
и вы можете получить положение
(lldb) po mapView.myLocation
<+37.33243033,-122.03088128> +/- 386.93m (speed -1.00 mps / course -1.00) @ 5/19/14, 6:22:28 PM Moscow Standard Time
текущее местоположение не будет отображаться на симуляторе... подключите реальное устройство и попробуйте Я провел 2 дня в симуляторе и не знаю, что он не имитирует местоположения
есть много способов... Я использовал этот метод и он работает во всех случаях. Google дает вам все с ответом в формате json и его на вас, как вы имеете дело с этими данными.
некоторые шаги для загрузки карты google в вашем проекте.
найдите ключ api по этой ссылке https://developers.google.com/places/ios-api/ войдите в свою учетную запись google, добавьте проект и создайте ключ ios. тогда используйте это в своем проект
включить все api, необходимые для Google map
a-GoogleMaps sdk для ios б-расчет по API направлении c - "" javasripts api д - комплектовщик API-интерфейс e-places api для ios F матрица расстояний api
в методе appdelegate...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:@"xxxxxxxx4rilCeZeUhPORXWNJVpUoxxxxxxxx"];
return YES;
}
- добавить все необходимые библиотеки и фреймворки в вашем проекте если Google map не работает, это означает, что вы должны добавить необходимую структуру все лучшая игра с Google map