ios - Firebase crashlytics 报告我的应用程序中存在许多可用的崩溃见解

标签 ios swift crashlytics phasset firebase-crash-reporting

下面是我的代码

    func getImageFrom(_ asset: PHAsset, completion: @escaping (UIImage) -> Void) {
        var thumbnail = UIImage()
        let imageManager = PHCachingImageManager()
        let options = PHImageRequestOptions()
        options.version = .current
        let size = CGSize(width: 150.0, height: 150.0)

        imageManager.requestImage(for: asset, targetSize: size, contentMode: .aspectFill, 
        options: nil) { (image, info) in
            guard let img = image else { return }
            thumbnail = img
        }
        completion(thumbnail)
    }

我正在使用此函数从 PHAsset 获取图像。

有时会报告崩溃 thumbnail = img 或在completion(thumbnail) 处。

在下面的代码块中使用此函数

func getImageDataAndFindDupImages() {
   var i = 0
   var similarImages = [OSTuple<NSString, NSString>]()
   similarImages = OSImageHashing.sharedInstance().similarImages(with: .high) { () -> OSTuple<NSString, NSData>? in
       #if DEBUG
       print(i)
       #endif
       var tuple = OSTuple<NSString, NSData>()
       if self.tempArrAssets.count > 0 {
           DispatchQueue.main.async {
               self.lblNumberOfPhoto.text = R.string.localizable.scanning_photos_number("\(i+1)", "\(self.arrPhotoAssets.count)")
           }
           if !self.tempArrAssets.isEmpty {
               let tempArrAsset = self.tempArrAssets.removeFirst()
               self.getImageFrom(tempArrAsset) { (imageAsset) in
                   self.arrImageFromAsset.append(imageAsset)
                   if let imgData = imageAsset.pngData() {
                       tuple = (OSTuple<NSString, NSData>(first: NSString(string: "\(i)"), andSecond: imgData as NSData))
                   }
               }
               i += 1
               return tuple
           } else {
               return nil
           }
       } else {
           return nil
       }
   }
   print("To make dup tuples:", Date().timeIntervalSince(self.date))
}

我在 getImageDataAndFindDupImages 中使用 getImageFrom

这是崩溃的日志

Crashed: com.apple.mobileslideshow.accessCallbacks
0  libobjc.A.dylib                0x18a874020 objc_retain + 16
1  Duplicate Cleaner              0x1001f0e80 closure #1 in DuplicatePhotoFinderVC.getImageDataAndFindDupImages() + 519 (DuplicatePhotoFinderVC.swift:519)
2  Duplicate Cleaner              0x1001f16a4 thunk for @escaping @callee_guaranteed () -> (@owned OSTuple<NSString, NSData>?) + 4338357924 (<compiler-generated>:4338357924)
3  CocoaImageHashing              0x1004f3514 -[OSSimilaritySearch similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:forResultHandler:] + 46 (OSSimilaritySearch.m:46)
4  CocoaImageHashing              0x1004f3924 -[OSSimilaritySearch similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:] + 95 (OSSimilaritySearch.m:95)
5  CocoaImageHashing              0x1004f28d0 -[OSImageHashing similarImagesWithProvider:withHashDistanceThreshold:forImageStreamHandler:] + 222 (OSImageHashing.m:222)
6  CocoaImageHashing              0x1004f27b0 -[OSImageHashing similarImagesWithHashingQuality:withHashDistanceThreshold:forImageStreamHandler:] + 201 (OSImageHashing.m:201)
7  CocoaImageHashing              0x1004f2734 -[OSImageHashing similarImagesWithHashingQuality:forImageStreamHandler:] + 190 (OSImageHashing.m:190)
8  Duplicate Cleaner              0x1001ee63c DuplicatePhotoFinderVC.getImageDataAndFindDupImages() + 316 (DuplicatePhotoFinderVC.swift:316)
9  Duplicate Cleaner              0x1001ee434 DuplicatePhotoFinderVC.fetchPhotosandCheckforDuplicate() + 146 (DuplicatePhotoFinderVC.swift:146)
10 Duplicate Cleaner              0x1001eea1c closure #1 in DuplicatePhotoFinderVC.checkForPermissionAndScanPhotos() + 162 (DuplicatePhotoFinderVC.swift:162)
11 Duplicate Cleaner              0x10021bdec thunk for @escaping @callee_guaranteed (@unowned PHAuthorizationStatus) -> () + 4338531820 (<compiler-generated>:4338531820)
12 Photos                         0x195ff9098 __39+[PHPhotoLibrary requestAuthorization:]_block_invoke + 64
13 AssetsLibraryServices          0x19f048edc __79-[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:]_block_invoke.14 + 520
14 AssetsLibraryServices          0x19f01486c __pl_dispatch_async_block_invoke + 36
15 libdispatch.dylib              0x18a7fe610 _dispatch_call_block_and_release + 24
16 libdispatch.dylib              0x18a7ff184 _dispatch_client_callout + 16
17 libdispatch.dylib              0x18a7ab404 _dispatch_lane_serial_drain$VARIANT$mp + 608
18 libdispatch.dylib              0x18a7abdf8 _dispatch_lane_invoke$VARIANT$mp + 420
19 libdispatch.dylib              0x18a7b5314 _dispatch_workloop_worker_thread + 588
20 libsystem_pthread.dylib        0x18a84eb88 _pthread_wqthread + 276
21 libsystem_pthread.dylib        0x18a851760 start_wqthread + 8

我无法理解为什么会发生这些崩溃。如果您有任何知识,请指导我。

最佳答案

您正在将 nil 传递给 imageManager.requestImage(for:targetSize: contentMode:options:) 中的 options 参数。如果将 nil 作为选项传递,该方法会异步调用完成 block 。因此,当您的完成 block 被调用时,方法 getImageFrom(:completion:) 已经退出,并且局部变量 thumbnail 已被销毁(我不是在说)关于 UIImage 对象被销毁但保存 UIImage 本身地址的变量)。然后尝试设置不再位于堆栈上、位于 block 内的缩略图变量可能是崩溃的原因。

解决您的问题创建 PHImageRequestOptions 实例,将其 isSynchronous 属性设置为 true,如下所示。

let options = PHImageRequestOptions()
options.isSynchronous = true

现在将此options作为参数传递给imageManager.requestImage(for:targetSize: contentMode:options:)

因此,您的 imageManager.requestImage(for:targetSize: contentMode:options:) 将在 getImageFrom(:completion:) 方法退出之前同步调用该 block 因此变量 thumbnail 仍然存在于要使用的堆栈中。

希望这能解决您的问题。

PS:请小心在后台线程中调用方法getImageFrom(:completion:),否则主线程将被卡住

关于ios - Firebase crashlytics 报告我的应用程序中存在许多可用的崩溃见解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60161943/

相关文章:

ios - 临时打开新ViewController时保存值

swift - guard 案件分配

ios - 在 iOS 模拟器中安装 crashlytics build

android - 如何将图片从 React Native 相机胶卷保存到特定文件夹

iphone - 为什么来自 AVCaptureSession 的灰度 OpenGL ES 纹理被置换了?

objective-c - 如何通过单击按钮更改 UIPickerView 中行的大小?

ios - "Fabric.framework/run"构建阶段实际上做了什么?

ios - 在界面生成器中添加的 UIViewController subview 未显示

Swift:私有(private)/文件私有(private)运行时性能

crashlytics - 结构(Crashlytics): Newest build not visible in 'Latest release' section