Skip to content

Consider shipping libVLC as a dynamic xcframework for LGPL 2.1 compliance #158

Description

@loopion

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

  1. A dynamic libvlc.xcframework (either replacing the static one or as a second binary target).
  2. Both, with the SPM product letting the consumer choose static for those who don't distribute publicly, dynamic for those who do.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions