美文网首页
UIActivityViewController 分享崩溃

UIActivityViewController 分享崩溃

作者: 吃货_X | 来源:发表于2023-03-26 10:35 被阅读0次

崩溃复现:分享资源->其他App打开->停留超过30s->回到App。

//错误提示
Terminating app due to uncaught exception 'NSGenericException', reason: 'Attempt to invoke -_activityImage on <_UIShareServiceActivityProxy_Share: 0x281343ae0>, which is not supported for proxies to out-of-process activities.'

分析崩溃原因:
1、直接导致的原因可能是completionWithItemsHandler回调最终未执行(部分版本才会出现)
2、又因为内部代码可能已经调了回调(部分资源已经释放)。
3、这个时候回到App时,又因为completionWithItemsHandler未走,从而会显示UIActivityViewController,最终又因为部分资源被释放,导致崩溃。
4、具体的你们可以去看一下源码(上面只是我的猜想)。

找不到具体解决方法,用的是曲线救国:
1、先“持有”UIActivityViewController - vc
2、completionWithItemsHandler回调执行就不再“持有” vc
3、App进入后台就dismiss vc
4、App进入后台判断vc == nil,根据判断在弹出vc
5、特别注意:vc需要重新生成,不然还是会崩

//部分代码

    var activityController:UIActivityViewController?
    
    func share(){
        let vc = UIActivityViewController(activityItems: <#资源#>, applicationActivities: nil)
        activityController = vc
        vc.excludedActivityTypes = [<#不显示类型#>]
        /处理iPad
        if let popoverController = vc.popoverPresentationController {
            popoverController.sourceView = <#显示view#>
            popoverController.sourceRect = <#尺寸#>
            popoverController.permittedArrowDirections = []
        }
        <#当前VC#>.present(vc, animated: true, completion: nil)
        vc.completionWithItemsHandler = {[weak self] _,_,_,_ in
            guard let this = self else {return}
            this.activityController = nil
        }
    }
    
 //进入前台 - 因为有可能会不是分享进入后台,所以要显示出来。如果走的是completionWithItemsHandler回调,说明是分享才进入后台的。
    @objc func applicationBecomeActive(){
        if let _ = activityController,<#其他判断#>{
              //再次显示
             share()
        }
    }
    
//进入后台
    @objc func applicationEnterBackground(){
        activityController?.dismissBack()
    }
    ```

相关文章

网友评论

      本文标题:UIActivityViewController 分享崩溃

      本文链接:https://www.haomeiwen.com/subject/eueordtx.html