Google Maps iOS SDK,获取用户的当前位置

时间:2014-01-07 08:59:45

标签: ios objective-c google-maps-sdk-ios

对于我的iOS应用(在iOS7中构建),我需要在应用加载时显示用户的当前位置。我正在使用Google Maps iOS SDK。我跟着这个 Google Map 但我无法弄明白。如果你走过这条路,请帮忙。

7 个答案:

答案 0 :(得分:40)

忘记我之前的回答。如果使用本机MapKit.framework,它可以很好地工作。

事实上,GoogleMaps for iOS可以为您完成所有工作。您不必直接使用CoreLocation。

您唯一需要做的就是添加yourMapView.myLocationEnabled = YES;,框架将完成所有工作。 (除了你位置上的地图中心)。

我做了什么:我只是按照以下documentation的步骤进行操作。我得到了一张以悉尼为中心的地图但是如果我缩小并移动到我的地方(如果你使用真实的设备,否则使用模拟器工具以苹果的位置为中心),我可以看到我的位置上的蓝点

现在,如果您想要更新地图以跟随您的位置,您可以复制框架目录中包含的Google示例MyLocationViewController.m。他们只需在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

根据我给你的文件和框架中包含的样本,你应该能够做你想做的事。

答案 1 :(得分:9)

似乎Google Maps iOS SDK无法访问设备位置。 因此,您必须使用CLLocationManager的{​​{1}}来检索位置。

首先,将iOS添加到您的项目中:

  • 进入CoreLocation.framework
  • 选择您的项目
  • 点击标签Project Navigator
  • Build Phases
  • 中添加CoreLocation.framework

然后你需要做的就是遵循Apple documentation的基本例子。

  • 可能在Link Binary with Libraries

    中创建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

答案 2 :(得分:3)

Xcode + Swift + Google Maps iOS

一步一步的食谱:

1。)将关键字符串添加到Info.plist(作为源代码打开):

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs your location to function properly</string>

2。)将CLLocationManagerDelegate添加到视图控制器类:

class MapViewController: UIViewController, CLLocationManagerDelegate {
   ...
}

3。)将CLLocationManager添加到您的班级中:

var mLocationManager = CLLocationManager()
var mDidFindMyLocation = false

4。)请求许可并添加观察者:

override func viewDidLoad() {
        super.viewDidLoad()          

        mLocationManager.delegate = self
        mLocationManager.requestWhenInUseAuthorization()
        yourMapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.new, context: nil)
        ...
}

5.)等待授权并在Google地图中启用位置:

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        if (status == CLAuthorizationStatus.authorizedWhenInUse) {
            yourMapView.isMyLocationEnabled = true
        }

    }

6。)添加observable以改变位置:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if (!mDidFindMyLocation) {

            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

            mDidFindMyLocation = true

            print("found location!")

        }

    }

就是这样!

答案 3 :(得分:2)

在任何iOS设备上,使用Core Location获取用户的位置信息。具体来说,您需要CLLocation类(和CLLocationManager)。

答案 4 :(得分:1)

委托方法didTapMyLocationButton不是吗?

https://developers.google.com/maps/documentation/ios/reference/protocol_g_m_s_map_view_delegate-p#ac0e0171b811e839d9021800ca9fd33f4

- (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

答案 5 :(得分:0)

当前位置不会在模拟器上显示...连接一个真实的设备并尝试一下 我花了2天时间在模拟器中运行,并且不知道它没有模拟位置

答案 6 :(得分:-2)

有很多方法...... 我使用这种方法,它适用于所有情况。 Google以json格式为您提供所有响应,并为您提供处理该数据的方法。

您可以在项目中加载谷歌地图。

  1. 从此链接中找到api密钥https://developers.google.com/places/ios-api/ 使用您的Google帐户登录并添加您的项目并创建一个ios密钥。 然后在你的项目中使用它

  2. 启用Google地图所需的所有API

  3. 适用于ios的a-googlemaps sdk b-googlemap方向api c-“”javasripts api d-选择器api e-为ios放置api f distance matrix api

    在appdelegate方法中

    ...

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        [GMSServices provideAPIKey:@"xxxxxxxx4rilCeZeUhPORXWNJVpUoxxxxxxxx"];
    
        return YES;
    }
    
    1. 在项目中添加所有需要的库和框架 如果谷歌地图不起作用,则意味着您必须添加所需的框架 所有最好的游戏与谷歌地图