You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iPhone来电自动截图未捕获来电界面的技术解决方案咨询

解决iPhone来电截图无法捕获来电界面的问题

这个问题我之前做通话相关功能时也踩过坑!咱们先分析下原因:你当前的代码只截取了自己App的rootViewController视图,但系统的来电界面是属于系统级别的独立窗口,根本不在你的App视图层级里,所以自然截不到它。

下面给你两个关键的修改点,配合起来就能解决问题:

1. 修改截图逻辑,捕获整个屏幕的所有窗口

原来的screenShot扩展只针对App自身的窗口,我们需要改成遍历所有系统窗口,包括来电界面所在的系统窗口:

extension UIApplication {
    var fullScreenShot: UIImage? {
        let scale = UIScreen.main.scale
        let bounds = UIScreen.main.bounds
        
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, scale)
        defer { UIGraphicsEndImageContext() } // 确保上下文一定会被释放
        
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        
        // 适配iOS13+的窗口获取
        let allWindows: [UIWindow]
        if #available(iOS 13.0, *) {
            allWindows = UIApplication.shared.connectedScenes
                .compactMap { $0 as? UIWindowScene }
                .flatMap { $0.windows }
        } else {
            allWindows = UIApplication.shared.windows
        }
        
        // 遍历所有窗口,依次绘制到上下文里
        for window in allWindows {
            window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
        }
        
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

2. 延迟截图,确保来电界面完全渲染

callChanged回调触发时,系统的来电界面可能还在加载渲染中,立刻截图会抓不到完整界面。我们需要加个短延迟,等界面完全显示后再执行截图:

extension AppDelegate: CXCallObserverDelegate {
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
            print("Incoming \(call.uuid.description)")
            // 延迟300毫秒,可根据实际情况调整时长
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                if let screenshot = UIApplication.shared.fullScreenShot {
                    self.photoDelegate.image = screenshot
                    // 如果需要保存到相册,记得先申请权限,然后调用:
                    // UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
                }
            }
        }
        // 其他状态判断保持不变...
    }
}

额外注意事项

  • 权限配置:如果要把截图保存到相册,需要在Info.plist中添加NSPhotoLibraryAddUsageDescription,说明你需要访问相册的原因。
  • 测试场景:建议在真机上测试,模拟器的来电界面和真机存在差异,可能会影响截图效果。

内容的提问来源于stack exchange,提问作者C.A. Radivoiu

火山引擎 最新活动