Make sure to read my article about why mentioning SCStreamError crashes on older macOS versions.
Minimal sample to demonstrates executables referencing SCStreamError fail to start when running on a macOS before 12.3, because it can't find ScreenCaptureKit.
My assumption is that this is because SCError.h
doesn't have API_AVAILABLE(macos(12.3))
annotations (at the time of writing 2023-03-09).
swift build -c release --arch x86_64 --arch arm64
The resulting binary can be found at .build/apple/Products/Release/scstreamerror-sample
and can run on both Intel and Apple Silicon Macs.
Running the build product will work as expected on macOS 12.3+, but will crash on macOS versions from before, that don't ship with ScreenCaptureKit. The error reports that ScreenCaptureKit.framework
can't be loaded:
dyld: Library not loaded: /System/Library/Frameworks/ScreenCaptureKit.framework/Versions/A/ScreenCaptureKit
Referenced from: /Users/alice/Downloads/Archive/./SCStreamError-sample-bad
Reason: image not found
Abort trap: 6
Don't directy reference the SCStreamError
or SCStreamError.Code
types from code. Instead, use their raw values.
For example, instead of:
// Don't write this:
do {
try await stream.stop()
} catch let error as SCStreamError where error.code == .attemptToStopStreamState {
// ...
}
Instead use raw values:
// Write this instead:
let streamErrorDomain = "com.apple.ScreenCaptureKit.SCStreamErrorDomain"
let attemptToStopCode = -3808
do {
try await stream.stop()
} catch let error as NSError where error.domain == streamErrorDomain && error.code == attemptToStopCode {
// ...
}
Nonstrict B.V., Mathijs Kadijk & Tom Lokhorst, released under MIT License.