Summary
libvlc.xcframework ships libVLC as a static archive (libvlc.a). Because libVLC is LGPL 2.1, static linking puts App Store consumers of SwiftVLC in an awkward position, and the README's own warning ("Static linking may have licensing implications") is the only signal that this is a decision the consumer has to reason about.
Would you consider shipping a dynamic libvlc.xcframework or offering a dynamic SPM library product alongside the current one?
What I observed
From the resolved artifact at v1.0.0:
libvlc.xcframework/Info.plist → LibraryPath = "libvlc.a" (every slice)
ios-arm64/libvlc.a → 73 MB static archive
find libvlc.xcframework \( -name "*.dylib" -o -name "*.framework" \) → no matches
Why it matters
LGPL 2.1 §6 requires that a user be able to modify the library and relink the application against their modified version.
- Dynamic linking satisfies this inherently the user can swap the framework. This is why VideoLAN's own MobileVLCKit ships as a dynamic
.framework.
- Static linking falls under §6(a), which instead requires distributing the application's object files so the user can relink. That is not something an App Store app can do.
So for App Store distribution specifically, the current packaging leaves consumers without a practical compliance route. I don't think that's intentional the README already flags the concern, which suggests it's known.
Why I'd rather not just switch away
SwiftVLC is a materially nicer integration than MobileVLCKit for a modern codebase Swift 6, @Observable, typed throws(VLCError), AsyncStream events, and VideoView(player) doing the rendering lifecycle. I'd prefer to keep using it. Licensing is the only thing pushing the other way.
It's also worth noting the size tradeoff runs the other way: static linking lets the linker dead-strip unused symbols, so a dynamic framework would likely ship larger. That's a real cost of what I'm asking for, and it may be exactly why it's packaged this way.
Possible shapes this could take
- A dynamic
libvlc.xcframework (either replacing the static one or as a second binary target).
- Both, with the SPM product letting the consumer choose static for those who don't distribute publicly, dynamic for those who do.
- Failing either, a short section in the README stating the linkage explicitly and what it implies for LGPL, so the decision is visible before adoption rather than after.
Even (3) alone would help the current warning is a single sentence and easy to read past.
Happy to test a dynamic build against a real app if that's useful.
Summary
libvlc.xcframeworkships libVLC as a static archive (libvlc.a). Because libVLC is LGPL 2.1, static linking puts App Store consumers of SwiftVLC in an awkward position, and the README's own warning ("Static linking may have licensing implications") is the only signal that this is a decision the consumer has to reason about.Would you consider shipping a dynamic
libvlc.xcframeworkor offering a dynamic SPM library product alongside the current one?What I observed
From the resolved artifact at
v1.0.0:Why it matters
LGPL 2.1 §6 requires that a user be able to modify the library and relink the application against their modified version.
.framework.So for App Store distribution specifically, the current packaging leaves consumers without a practical compliance route. I don't think that's intentional the README already flags the concern, which suggests it's known.
Why I'd rather not just switch away
SwiftVLC is a materially nicer integration than MobileVLCKit for a modern codebase Swift 6,
@Observable, typedthrows(VLCError),AsyncStreamevents, andVideoView(player)doing the rendering lifecycle. I'd prefer to keep using it. Licensing is the only thing pushing the other way.It's also worth noting the size tradeoff runs the other way: static linking lets the linker dead-strip unused symbols, so a dynamic framework would likely ship larger. That's a real cost of what I'm asking for, and it may be exactly why it's packaged this way.
Possible shapes this could take
libvlc.xcframework(either replacing the static one or as a second binary target).Even (3) alone would help the current warning is a single sentence and easy to read past.
Happy to test a dynamic build against a real app if that's useful.