138 lines
4 KiB
Text
138 lines
4 KiB
Text
# Error Resolution Log
|
|
|
|
## Fixed Issues (2023)
|
|
|
|
### ScreenCaptureKit API Updates
|
|
1. SCContentFilter Initialization
|
|
- Fixed by using correct initializer and parameters:
|
|
```swift
|
|
SCContentFilter(display: display, excludingWindows: [])
|
|
```
|
|
- Using SCDisplay object directly (not displayID)
|
|
- Correct parameter name: excludingWindows
|
|
- Removed incorrect parameters (includingWindows/exceptingWindows)
|
|
|
|
2. Stream Output Type
|
|
- Fixed type inference issue by explicit declaration:
|
|
```swift
|
|
let outputType: SCStreamOutputType = .screen
|
|
try stream.addStreamOutput(self, type: outputType, ...)
|
|
```
|
|
- Ensures proper type resolution for .screen member
|
|
|
|
### Required Imports
|
|
- Added necessary framework imports:
|
|
* CoreMedia
|
|
* AVFoundation
|
|
* ScreenCaptureKit
|
|
* CoreGraphics
|
|
* AppKit
|
|
* Foundation
|
|
|
|
### Window Capture Strategy
|
|
1. Window Detection
|
|
- Precise window identification:
|
|
```swift
|
|
let bundleID = window.owningApplication?.bundleIdentifier ?? ""
|
|
let isChessApp = bundleID == "com.chess.iphone"
|
|
let hasValidSize = window.frame.width > 100 && window.frame.height > 100
|
|
return isChessApp && window.isOnScreen && hasValidSize
|
|
```
|
|
- Multiple validation checks:
|
|
* Exact bundle ID match
|
|
* Window is currently on screen
|
|
* Window has valid dimensions
|
|
- Handles iOS apps running on Mac properly
|
|
|
|
2. Capture Method
|
|
- Implemented continuous capture:
|
|
```swift
|
|
// Start once
|
|
try await screenCapture.startCapture()
|
|
|
|
// Process frames continuously
|
|
while !Task.isCancelled {
|
|
if let image = screenCapture.getCurrentImage() {
|
|
try await processImage(image)
|
|
}
|
|
try await Task.sleep(nanoseconds: 100_000_000)
|
|
}
|
|
```
|
|
- Maintains single active stream
|
|
- Eliminates capture flickering
|
|
- Proper cleanup on stop
|
|
|
|
### Thread Safety and Async Handling
|
|
1. Main Actor Isolation
|
|
- Added @MainActor to ViewModel class:
|
|
```swift
|
|
@MainActor
|
|
class ScreenCaptureViewModel: ObservableObject
|
|
```
|
|
- Ensures all @Published property updates happen on main thread
|
|
- Proper thread safety for SwiftUI bindings
|
|
|
|
2. Async Operation Handling
|
|
- Optimized async/await usage:
|
|
```swift
|
|
// Only use await for truly async operations
|
|
try await screenCapture.startCapture()
|
|
try await Task.sleep(nanoseconds: 100_000_000)
|
|
```
|
|
- Removed unnecessary await keywords:
|
|
* Non-async error handling
|
|
* UI state updates
|
|
* Image processing
|
|
- Proper @MainActor usage for thread safety
|
|
|
|
3. Task and Error Handling
|
|
- Improved task cancellation:
|
|
```swift
|
|
captureLoop: while !Task.isCancelled {
|
|
do {
|
|
// Process frame
|
|
} catch is CancellationError {
|
|
break captureLoop
|
|
} catch {
|
|
// Continue capturing on non-critical errors
|
|
await handleCaptureError(error)
|
|
}
|
|
}
|
|
```
|
|
- Proper error recovery:
|
|
* Continues on board detection failures
|
|
* Shows error state without stopping
|
|
* Clears errors on successful detection
|
|
- Clean error state on stop:
|
|
```swift
|
|
captureError = nil // Clear any error when stopping
|
|
```
|
|
- Proper cleanup on task exit
|
|
|
|
## Technical Notes
|
|
- Resource Management:
|
|
* Shared CIContext to prevent command queue exhaustion:
|
|
```swift
|
|
private static let shared = CIContext()
|
|
private var context: CIContext { Self.shared }
|
|
```
|
|
* Prevents "Command queue creation failed" errors
|
|
* Reduces Metal resource usage
|
|
* Proper cleanup on task completion
|
|
|
|
- Using correct SCContentFilter API with proper parameter names
|
|
- Proper type safety throughout the implementation:
|
|
* Proper Vision framework result handling:
|
|
```swift
|
|
guard let observations = request.results,
|
|
!observations.isEmpty else {
|
|
return nil
|
|
}
|
|
|
|
let bestObservation = observations[0]
|
|
```
|
|
* No unnecessary type casting
|
|
* Safe array access
|
|
* Proper optional handling
|
|
- Appropriate framework dependencies
|
|
- Follows current ScreenCaptureKit best practices
|