将谷歌地图添加为子视图会使用exc_bad崩溃iOS应用程序

时间:2015-07-07 09:19:26

标签: ios objective-c xcode google-maps

我的代码在3天前完美无缺。我已经尝试回到一个更老的提交,它工作了100%,现在它仍然与exc_bad崩溃。 崩溃只发生在设备上运行应用程序时,如果我在模拟器上运行应用程序或使用仪器在设备上运行应用程序,它运行得非常好。当我更改我的谷歌API密钥时,它说"您可能没有权限使用此API密钥"但不再崩溃。

该应用仅在通过xcode在设备上运行应用时崩溃。如果稍后在设备上运行相同版本而未连接到xcode,则可以正常工作。

我不知道我可以在这里添加哪些信息来帮助调试问题。我最近将xcode更新为6.4并使用最新更新更新了OSX。

我使用的是谷歌1.10.1 sdk版本,使用CocoaPods安装

我用来添加地图的代码:

self.mapView = [GMSMapView mapWithFrame:self.view.bounds camera:camera];

self.mapView.myLocationEnabled = YES;
self.mapView.settings.myLocationButton = YES;
self.mapView.delegate = self;

[self.mapView addObserver:self
               forKeyPath:@"myLocation"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];

[self.view insertSubview:self.mapView atIndex:1];

错误本身在code = 1,code = 2和code = 257之间变化。我尝试使用故事板而不是代码添加GMSMapView。我已经尝试安装旧版本的xcode并再次运行,但它并没有改变任何东西。

如果我注释掉插入子视图行,该应用程序不会崩溃。我尝试过运行僵尸乐器工具,但是当我使用乐器运行时,应用程序运行正常。

#0  0x0000000100c5dc34 in EAGLContext_renderbufferStorageFromDrawable(EAGLContext*, objc_selector*, unsigned long, id<EAGLDrawable>) ()
#1  0x00000001002404c0 in gmscore::renderer::ios::GLRenderTarget::CreateFramebuffer() ()
#2  0x00000001002403cc in gmscore::renderer::ios::GLRenderTarget::FrameStart() ()
#3  0x00000001002e7af4 in gmscore::renderer::EntityRenderer::Draw(bool) ()
#4  0x00000001002516f4 in -[GMSPhoenixRenderer drawIfNeeded] ()
#5  0x00000001002329a0 in -[GMSEntityRendererView draw] ()
#6  0x000000010028dc74 in -[GMSDisplayLink displayLinkFired:] ()
#7  0x0000000100c5ca9c in -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] ()
#8  0x00000001887f629c in CA::Display::DisplayLinkItem::dispatch() ()
#9  0x00000001887f6134 in CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) ()
#10 0x00000001855d1470 in IODispatchCalloutFromCFMessage ()
#11 0x00000001843c2dc4 in __CFMachPortPerform ()
#12 0x00000001843d7a54 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#13 0x00000001843d79b4 in __CFRunLoopDoSource1 ()
#14 0x00000001843d5934 in __CFRunLoopRun ()
#15 0x00000001843012d4 in CFRunLoopRunSpecific ()
#16 0x000000018db1f6fc in GSEventRunModal ()
#17 0x0000000188ec6fac in UIApplicationMain ()
#18 0x000000010002d794 in main at /Users/yoavschwartz/Documents/donkey_republic_ios/DonkeyRepublic/DonkeyRepublic/main.m:14
#19 0x0000000196272a08 in start ()

重新启动计算机/设备时,此问题似乎已解决,现在再次弹出。我真的不明白发生了什么。

2 个答案:

答案 0 :(得分:106)

编辑:我找到了问题的根源并找到了解决方法:

问题似乎是由XCode中的OpenGL ES帧捕获引发的;我猜这个问题是从Apple在XCode 6.4 / iOS 8.3中添加Metal到混合时开始的,可能会对整个帧捕获调试系统造成不利影响。

解决方法:

  1. 在XCode中,转到产品&gt;方案&gt;编辑方案......
  2. 选择左侧的“运行”标签。
  3. 选择顶部的“选项”子选项卡。
  4. 将“GPU Frame Capture”从“Automatically Enabled”或“OpenGL ES”更改为“Metal”或“Disabled”。
  5. 这会禁用OpenGL ES帧捕获,这不是很好,但允许您继续调试构建。

    不确定此问题是Apple还是Google,但我会向两者发布错误报告。快乐的编码!

    -

    早些时候的帖子:

    一些进一步的信息(会使这个评论,但还没有完成代表),因为我也遇到了这个问题;我能说得最好:

    • 这个问题在XCode 6.4以及XCode 7 beta 3
    • 中很明显
    • 它仅在调试模式下显示,不在XCode外部运行。
    • 它不会在iOS 8.1.2上显示,但在iOS 8.3上显示。
    • 同时使用Google Maps 1.9.X(作为Framework文件导入)以及1.10.X(作为CocoaPod导入,包括最新版本)
    • 我无法完全验证这一点,但我没有在XCode 6.3.2中显示出来;这可能是因为我无法在该版本中编译8.3。

    我可能会错过赃物赏金的截止日期,但明天我会花一整天时间深入挖掘并报告。

答案 1 :(得分:1)

当我使用Google Maps SDK时,这也发生在我身上。我提交了一个错误报告,因为在重新启动Xcode并删除项目并重新安装它之后,它完全正常。

这不是你的问题,只是一个错误。如果您通过试飞或App Store安装构建,它将像魅力一样工作。

对于调试,只需继续重启Xcode,如果可能,尝试通过Xcode 7运行它。他们有可能修复这个错误。

希望有帮助,朱利安