【问题标题】:Insert annotation view fails in iOS 11.0.3在 iOS 11.0.3 中插入​​注释视图失败
【发布时间】:2017-11-20 16:16:54
【问题描述】:

前几天我在App Store上发布了一个应用程序,今天我去检查是否有任何崩溃。我发现在两个不同的设备上,我遇到了同样的崩溃,与 MKSpatialCollider 的 insertAnnotationView 有关。这两款设备都安装了 iOS 11.0.3。
我在 ViewController 中使用 MapKit 来显示自定义 AnnotationView 对象,我也将这些对象分组到集群中,仅此而已。我不知道这些崩溃,我的应用中可能会发生什么触发这些事件?
下面,我附上了这两个异常的堆栈跟踪,但如果你需要其他东西来弄清楚发生了什么,请告诉我:

第一个异常的堆栈跟踪

第二个异常的堆栈跟踪



更新 1 - 这是应该触发错误的代码的链接(我不确定,因为 Xcode 指向另一个根本不包含 MapKit 的文件):https://gist.github.com/MrOverflOOw/bbc14d546ef10bd17065af08fdf3e27c

【问题讨论】:

  • 您可以在 Xcode > Organizer 中跟踪这些崩溃,这样您就可以在代码发生的地方找到它。
  • 是的,这就是我找到我上传的这些堆栈跟踪的地方!但是在 Xcode 中,如果我尝试单击堆栈跟踪,它会将我指向一条根本不应该涉及的行...
  • 你能分享一些代码发生在哪里吗?
  • 帖子更新:查看该链接!
  • 我也在 iOS 12 上得到这个。

标签: ios iphone swift xcode mapkit


【解决方案1】:

对于仍在寻找类似问题答案的任何人:在我的例子中,如果用户在向 MapView 添加注释时按下后退按钮,我的应用程序会抛出上述异常。 从这里 (https://forums.developer.apple.com/thread/92799) 来看,这似乎是一个 iOS 11 相关问题:Apple 应该很快会发布更新。
如果有人有更多信息或临时解决问题的解决方法,请在此处分享:我已经能够解决它 在 MapKit 完成添加注释之前显示 ActivityIndi​​cator .

【讨论】:

  • 我尝试了这些解决方案,但都没有任何影响。只有当我关闭动画到地图矩形时:mapView.setVisibleMapRect(zoomRect, animated: false) 才解决了这个问题,请参见下面的最后一个答案
【解决方案2】:

我在尝试从地图视图注释中删除 MKClusterAnnotation 实例时遇到了这个错误。特别是当一个注解视图被一个 MKClusterAnnotation 重用时。检查你是否做了类似的事情:

[mapView removeAnnotations:mapView.annotations];

或者如果你使用 Swift:

mapView.removeAnnotations(mapView.annotations)

或者实际上是任何代码行,您可能会使用 MapKit 提供的 MKClusterAnnotation。

【讨论】:

  • 奇怪的是,MKClusterAnnotation 实例似乎堆积在 MKMapView 的 annotation 属性中。我在尝试手动清理它们时遇到了这个问题。
  • 你能解决这个问题吗?
  • @Genki 不幸的是,我们最终选择了自己的集群逻辑。
【解决方案3】:

对我有用的解决方法是在添加或删除任何其他注释之前取消选择注释(问题是集群注释)。

我意识到您的案例可能不涉及添加或删除注释,但我的应用程序在相同的 MKSpatialCollider 代码路径中崩溃,所以我想我会提到这个解决方法。您可以尝试在视图消失之前取消选择注释。

【讨论】:

  • 我尝试通过仅将动画关闭为可见的 maprect 来进行除法,它是否解决了问题 mapView.setVisibleMapRect(zoomRect, animated: false)
  • 与 OP 中的第一个屏幕截图有类似的堆栈跟踪,并通过取消选择我的视图控制器 deinit 中的所有选定注释来修复它。
【解决方案4】:

虽然我尝试了上面列出的所有答案但我仍然遇到了崩溃,但我有一个部分解决方案。

但是,当我将缩放设置为 FALSE 时,崩溃完全停止了!?为什么?我想放大它看起来不错:

mapView.setVisibleMapRect(zoomRect, animated: false)

这是来自这个函数(我也在其中取消选择上面建议的集群注释):

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    lastTouchedAtCoordinate = view.annotation?.coordinate
    guard let annotation = view.annotation else { return }

    if let cluster = annotation as? MKClusterAnnotation {
        var zoomRect = MKMapRectNull
        for annotation in cluster.memberAnnotations {
            self.mapView.deselectAnnotation(annotation, animated: false)
            let annotationPoint = MKMapPointForCoordinate(annotation.coordinate)

            let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0)

            if MKMapRectIsNull(zoomRect) {
                zoomRect = pointRect
            } else {
                zoomRect = MKMapRectUnion(zoomRect, pointRect)
            }
        }
        mapView.setVisibleMapRect(zoomRect, animated: true)

    }
}

这停止了崩溃。我不知道为什么。我正在加载和添加很多注释,但我通过使用进度加载器来调暗背景,确保用户无法与地图交互(如上所述)。

我没有使用任何线程,所有 UI 都在主线程上完成(例如添加注释)

这是来自手机的堆栈跟踪,您可以看到系统正在删除注释(我根本不像上面建议的那样),这是苹果的错误吗?还是我做错了什么?:

型号:iPhone8,1 工艺:
路径:
1.1 (1.0) 代码类型:ARM-64 (Native) 角色:前台 父进程:launchd 3 Coalition:

日期/时间:2018-02-14 17:38:15.3949 +0100 发布时间:
2018-02-14 17:37:10.1854 +0100 操作系统版本:iPhone OS 11.2.5 (15D60) 基带版本:4.30.02 报告版本:104

异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常子类型: KERN_INVALID_ADDRESS at 0x0000000000000298 VM 区域信息:0x298 是 不在任何地区。以下区域之前的字节:4328635752 区域类型开始 - 结束 [ VSIZE] PRT/MAX SHRMOD 区域详细信息 开始时未使用的空间 --->
__TEXT 000000010201c000-00000001022a0000 [2576K] r-x/r-x SM=COW ...eDiveAdvisor]

终止信号:分段错误:11 终止原因: 命名空间信号,代码 0xb 终止进程:exc 处理程序 [0] 线程触发:0

过滤的系统日志:未找到

线程 0 名称:调度队列:com.apple.main-thread 线程 0 崩溃:0 MapKit 0x000000019650d190 -[MKSpatialCollider insertAnnotationView:] + 244 1 MapKit 0x00000001964791b8 -[MKNewAnnotationContainerView _updateClusterableAnnotationViews:withID:] + 456 2 MapKit 0x00000001964791b8 -[MKNewAnnotationContainerView _updateClusterableAnnotationViews:withID:] + 456 3 CoreFoundation 0x0000000185dc51c0 -[__NSDictionaryM enumerateKeysAndObjectsWithOptions:usingBlock:] + 232 4 MapKit
0x0000000196479d58 -[MKNewAnnotationContainerView updateAnnotationViewsForReason:] + 296 5 MapKit
0x0000000196549690 -[MKAnnotationContainerView finishRemovingAnnotationViews] + 32 6 MapKit
0x00000001963c56dc -[MKAnnotationManager updateVisibleAnnotations] + 1616 7 地图套件 0x00000001963c5064 -[MKAnnotationManager 取消选择注释:动画:] + 376 8 MapKit 0x00000001963e4198 -[MKAnnotationManager _removeAnnotation:updateVisible:removeFromContainer:] + 468 9 MapKit 0x00000001964029ac -[MKMapView removeAnnotation:] + 100 10 MapKit
0x00000001964010b8 -[MKMapView annotationContainer:requestRemovingClusterAnnotationView:] + 60 11 MapKit 0x0000000196479f8c __73-[MKNewAnnotationContainerView _updateClusterableAnnotationViews:withID:]_block_invoke + 84 12 MapKit 0x00000001964ac108 __49-[MKAnnotationView _performHideAnimationIfNeeded]_block_invoke.208 + 232 13 UIKit 0x000000018f4ea188 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 764 14 UIKit 0x000000018f4e9afc -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 312 15 UIKit
0x000000018f4e9808 -[UIViewAnimationState animationDidStop:finished:] + 296 16 QuartzCore 0x0000000189f4adc4 CA::Layer::run_animation_callbacks+ 1252804 (void*) + 284 17 libdispatch.dylib 0x0000000185876a14 _dispatch_client_callout + 16

【讨论】:

    【解决方案5】:
    override func viewWillDisappear(_ animated: Bool) {  
        super.viewWillDisappear(animated)  
        mapView.removeAnnotations(mapView.annotations)  
    }  
    

    似乎为我修复了崩溃

    【讨论】:

      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多