谷歌地图SDK版本1.7.2与iOS 6.1不兼容吗?

时间:2014-05-03 13:44:41

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

我继承了一个xcode项目,其作者用iOS 6.1编译。我知道apple已经stopped接受使用iOS6 SDK构建的项目,但无论出于何种原因,我现在仍需要使用iOS 6.1来编译它

无论如何,一切正常,直到我需要使用didTapMyLocationButtonForMapView:方法(当用户点击我的位置按钮时通知我),这似乎只有最新的谷歌地图SDK < / strong>版本 1.7.2 (我无法在项目附带的gmaps sdk中找到该方法,所以我只需用最新的库替换旧库)。

然而,在这之后我开始得到这个编译错误:

  

架构i386的未定义符号:&#34; _glMapBufferRange&#34;,   引自:         GoogleMaps(BufferObject.o)中的gmscore :: renderer :: BufferObject :: MapBuffer()ld:找不到架构的符号   i386 clang:错误:链接器命令失败,退出代码为1(使用-v to   见调用)

网络上有些claim,这是因为1.7.2 不兼容iOS6。但是,查看gmaps SDK的release notes ..我没有看到1.7.2与iOS 6不兼容的任何迹象 - 请注意版本1.5的发布说明如何明确说明

  

此版本正式支持iOS 7,需要iOS 6.0或更高版本   (不再支持iOS 5.1)。

但iOS 6没有找到此类免责声明。

知道这里发生了什么?

1 个答案:

答案 0 :(得分:0)

我最终制作谷歌地图1.7.2与iOS 7一起工作(我不记得究竟是怎么回事,但这很容易...通常在得到这些未定义的架构问题时......我解决了他们通过支持arm 64并将有效架构设置为no)然后那没有解决我的问题b / c didTapMyLocationButtonForMapView:方法是一个哑巴:它在谷歌地图1.7中不起作用.2(即当用户点击我的位置按钮时......没有任何反应)。

注意:所以,如果你在这里的唯一原因是验证谷歌地图1.7.2是否适用于iOS7我可以告诉你它确实有效。本答案的其余部分是关于如何在不使用谷歌地图1.7.2 didTapMyLocationButtonForMapView:方法点击mylocationButton时触发回调,如果使用1.7.2或之前的话,无论版本


所以我又回到了旧版本的谷歌sdk(我没有其他理由升级)..并创建了我自己的代码,当用户点击我的位置按钮时会触发。这是它的工作原理(简而言之......我重写UIApplication sendEvent方法,当用户触摸屏幕时会触发该方法,并捕获与myLocation按钮在同一维度发生的事件..然后去从那里)

首先我创建了一个自定义UIApplication类:

main.m

中的

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv,  NSStringFromClass([TPMUApplication class]), NSStringFromClass([TPMUAppDelegate class]));

    }
}

<强> TPMUApplication.h

@interface TPMUApplication : UIApplication

// the view controller that has the google maps in it
@property (nonatomic, strong) TPMUVC *VC;

@end

<强> TPMUApplication.m

#import "TPMUApplication.h"
#import "TPMUVC.h"

@implementation TPMUApplication
- (void)sendEvent:(UIEvent *)event
{
    [super sendEvent:event];
    UIView *touchReceipientView =((UITouch *)[event.allTouches anyObject]).view;

    CGRect myLocationButtonFourchIncFrame = CGRectMake(256, 354, 64, 54);
    CGRect myLocationButtonThreeHalfIncFrame = CGRectMake(256, 266, 64, 54);

    if (CGRectEqualToRect(touchReceipientView.frame, myLocationButtonFourchIncFrame) ||
        CGRectEqualToRect(touchReceipientView.frame, myLocationButtonThreeHalfIncFrame)) {
        if (self.tVC.mapState != TPMUMapStateInMotionAsResultOfMyLocationButtonTap) {
            self.VC.mapState = TPMUMapStateInMotionAsResultOfMyLocationButtonTap;
            [self.VC didTapMyLocationButtonForMapView:self.VC.mapView];
        }
    }

}
@end

<强> TPMUVC.h

#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>

typedef enum
{
    TPMUMapStateIdle = 0,
    TPMUMapStateInMotionAsResultOfUserGesture,
    TPMUMapStateInMotionAsResultOfMyLocationButtonTap
} TPMUMapState;


@interface TPMUVC : TPMUBaseViewController<GMSMapViewDelegate>

@property (nonatomic, strong) GMSMapView  *mapView;
@property (nonatomic, assign) TPMUMapState mapState;

- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView;

<强> TPMUVC.m

#import "TPMUApplication.h"

@implementation TPMUVC

@synthesize mapView = mapView_;
@synthesize mapState = mapState_;

- (void)viewDidLoad
{
    TPMUApplication *tpmuApp = (TPMUApplication *)[UIApplication sharedApplication];
    tpmuApp.taxiRequestVC = self;
}


#pragma mark - GMSMapView delegate

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
{
    if (gesture) {
        mapState_ = TPMUMapStateInMotionAsResultOfUserGesture;
    }
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position
{
    if (mapState_ == TPMUMapStateInMotionAsResultOfUserGesture) {
        mapState_ = TPMUMapStateIdle;

    }

    mapState_ = TPMUMapStateIdle;
    mapCameraPosition_ = position;
    DLog(@"map is now idle at position [lat: %f,long: %f] zoom: %f", position.target.latitude, position.target.longitude, position.zoom);
}

- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView {
    return YES;
}