Cody Sand
Cody Sand

Reputation: 266

iOS Google Map SDK Crash when adding GMSPolygon or GMSPolyline to Map

Added everything according to the Getting Started guide. Map loads, and I can add GMSMarkers to the map without problem. I've got a method to draw a polygon, and the app crashes every time.

The method:

-(void)drawPolygon
{
    GMSMutablePath* path = [[GMSMutablePath alloc] init];
    [path addCoordinate:CLLocationCoordinate2DMake(-91.13343811039999, 42.6450805664)];
    [path addCoordinate:CLLocationCoordinate2DMake(-91.0180969238,42.6452140808)];
    [path addCoordinate:CLLocationCoordinate2DMake(-90.8977890015,42.6446838379)];
    [path addCoordinate:CLLocationCoordinate2DMake(-90.89622497560001,42.6696586609)];
    [path addCoordinate:CLLocationCoordinate2DMake(-90.8959732056,42.6752548218)];
    [path addCoordinate:CLLocationCoordinate2DMake(-90.88994598390001,42.6732940674)];

    GMSPolygon* poly = [GMSPolygon polygonWithPath:path];

    poly.strokeWidth = 2.0;
    poly.strokeColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
    poly.fillColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.4];
    poly.map = _mapView;        //CRASH!!
}

Here's a backtrace:

thread #1: tid = 0x1c03, 0x0010ebde Maps`(anonymous namespace)::PolygonInstance::UpdateEntities(float, gmscore::base::reffed_ptr<gmscore::vector::Camera>, gmscore::renderer::EntityRenderer*, (anonymous namespace)::MarkupBehavior*) + 288, stop reason = EXC_BAD_ACCESS (code=2, address=0x4)
frame #0: 0x0010ebde Maps`(anonymous namespace)::PolygonInstance::UpdateEntities(float, gmscore::base::reffed_ptr<gmscore::vector::Camera>, gmscore::renderer::EntityRenderer*, (anonymous namespace)::MarkupBehavior*) + 288
frame #1: 0x00111f3c Maps`(anonymous namespace)::MarkupBehavior::Commit(gmscore::renderer::EntityRenderer*) + 978
frame #2: 0x0008aad2 Maps`gmscore::renderer::EntityRenderer::Draw(bool) + 634
frame #3: 0x000d6a46 Maps`-[GMSEntityRendererView draw] + 200
frame #4: 0x000d5a85 Maps`-[GMSEntityRendererView displayLinkFired:] + 33
frame #5: 0x00144399 Maps`-[GMSDisplayLink displayLinkFired:] + 351
frame #6: 0x00f9e2d2 QuartzCore`CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) + 110
frame #7: 0x00f9e75f QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 161
frame #8: 0x02519376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
frame #9: 0x02518e06 CoreFoundation`__CFRunLoopDoTimer + 534
frame #10: 0x02500a82 CoreFoundation`__CFRunLoopRun + 1810
frame #11: 0x024fff44 CoreFoundation`CFRunLoopRunSpecific + 276
frame #12: 0x024ffe1b CoreFoundation`CFRunLoopRunInMode + 123
frame #13: 0x038167e3 GraphicsServices`GSEventRunModal + 88
frame #14: 0x03816668 GraphicsServices`GSEventRun + 104
frame #15: 0x012bfffc UIKit`UIApplicationMain + 1211
frame #16: 0x0000298d Maps`main(argc=1, argv=0xbffff3e0) + 141 at main.m:16

I'm not trying to use MapKit at all. No other OpenGL contexts have been created. Can anyone provide me with a working example of GMSPolygon? I believe my example follows the official example.

Using SDK version 1.3.1. ARC is enabled. Single-View app using Storyboards. Pan/Zoom everything else works, just not shape drawing.

Upvotes: 5

Views: 3211

Answers (4)

Magoo
Magoo

Reputation: 2638

I was led to this question and I had the following problem that I fixed

      let path = GMSMutablePath()
      path.add(startCo)
      path.add(endCo)

      let color = UIColor.black
      let polyline = GMSPolyline(path: path)
      polyline.strokeWidth = 3
      polyline.strokeColor = color

      let styles = [GMSStrokeStyle.solidColor(color),
                    GMSStrokeStyle.solidColor(.clear)]
      let lengths: [NSNumber] = [6.0, 6.0]
      polyline.spans = GMSStyleSpans(polyline.path!, styles, lengths, .rhumb)

The issue was that lengths being [6.0, 6.0] if the line is very long that will take up too much memory and kill the app. those values need to be proportional to the line length. not all lines are straight, take the min max of your line and adjust the lengths to whatever you see fit. Google's example is 10000, 5000 so whoever set this one up is operating at a very small scale.

Upvotes: 0

zaheer
zaheer

Reputation: 893

I was having the same issue then I found this workaround:

The workaround:

  1. In XCode, go to Product > Scheme > Edit Scheme...

  2. Select the "Run" Tab on the left.

  3. Select the "Options" sub-tab on the top.

  4. Change "GPU Frame Capture" from "Automatically Enabled" or "OpenGL ES" to either "Metal" or "Disabled".

Upvotes: 4

Scott D
Scott D

Reputation: 1424

Have either of you found a solution to this issue? I am having the exact same problem, and even using the Google Maps SDK for iOS code verbatim it is still crashing. It crashes on the bolded item below:

GMSMutablePath *path = [GMSMutablePath path];
[path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];
[path addCoordinate:CLLocationCoordinate2DMake(37.45, -122.0)];
[path addCoordinate:CLLocationCoordinate2DMake(37.45, -122.2)];
[path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.2)];
[path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];

**GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];**
rectangle.map = mapView_;

EDIT: I have found the solution for this behavior:

To correct the issue, simply wrap your current code in a dispatch block. Reason being, Google Maps SDK requires that all drawing events be done on the main thread. The below code works properly:

dispatch_async(dispatch_get_main_queue(), ^{
    GMSMutablePath *path = [GMSMutablePath path];
    [path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];
    [path addCoordinate:CLLocationCoordinate2DMake(37.45, -122.0)];
    [path addCoordinate:CLLocationCoordinate2DMake(37.45, -122.2)];
    [path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.2)];
    [path addCoordinate:CLLocationCoordinate2DMake(37.36, -122.0)];

    **GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];**
    rectangle.map = mapView_;
});

Upvotes: 4

user1976945
user1976945

Reputation: 41

Edit

I had my latitude and longitude coordinates transposed as I built my path.

/Edit

I have encountered the same bug. I am not running it from a background thread. I add a marker at the same time as the polygon

   marker.map = mapView_; // No problem
   polygon.map = mapView_; // Crash

Researching further.

Upvotes: 2

Related Questions