Summary
Package.swift declares the Capacitor dependency with a branch requirement:
.package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", branch: "8.0.0"),
This causes two problems for apps that use the plugin over Swift Package Manager.
1. The pin caps the whole graph at Capacitor iOS 8.0.0
An unversioned SPM requirement (branch/revision) overrides every version requirement in the
dependency graph. So an app whose own CapApp-SPM/Package.swift asks for
.package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", exact: "8.5.0"),
still resolves to 8.0.0. Package.resolved:
{
"identity" : "capacitor-swift-pm",
"kind" : "remoteSourceControl",
"location" : "https://github.com/ionic-team/capacitor-swift-pm.git",
"state" : {
"branch" : "8.0.0",
"revision" : "596259033e94829dffc552a40e7129262122995e"
}
}
It resolves silently — no conflict, no warning — so package.json says @capacitor/ios@8.5.0 while
the app actually links 8.0.0.
The concrete impact today is Capacitor 8.5's UIScene adoption,
which Xcode 27 requires. SceneDelegateProxy (CAPSceneDelegateProxy.swift, new in 8.5) does not
exist at compile time, so the documented migration cannot be followed as written; apps that depend on
this plugin have to hand-roll a SceneDelegate that forwards through ApplicationDelegateProxy
instead. Every Capacitor iOS API added after 8.0 is unavailable the same way.
2. refs/heads/8.0.0 no longer exists upstream
capacitor-swift-pm no longer has that branch:
$ git ls-remote --heads https://github.com/ionic-team/capacitor-swift-pm.git
272e5dcd26260c6f3798b024c9cb3ffa52850ec7 refs/heads/6.x
049aeabcf1148ac4929f440c2cb1bf73ce9462e4 refs/heads/jcesarmobile-patch-1
4f71d0b979f2f957326f04353eca7604ee937e1e refs/heads/main
727b5c9b65de35021312bb84502895da3261f48c refs/heads/update-xcode
db762b0e90631fd753a225941838784ab34e6b7e refs/heads/vision
Revision 5962590 is still reachable from main, so existing Package.resolved files keep working.
But a resolve without a pre-existing Package.resolved has no branch ref to follow. That makes the
pin a build hazard for fresh checkouts and for anyone regenerating the file.
Suggested fix
Use a version requirement instead:
.package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", from: "8.0.0"),
That keeps the 8.0.0 floor, lets consuming apps move to 8.5.0+ when they need to, and no longer
depends on a branch that has been deleted. The other Capacitor plugins already do this —
@capacitor/app@8.1.1 and @capacitor/text-zoom@8.0.1 both declare from: "8.0.0".
Environment
@capacitor-community/sqlite 8.1.0 (also present on master, Package.swift:13)
@capacitor/core / @capacitor/ios / @capacitor/cli 8.5.0
- SPM (not CocoaPods)
Summary
Package.swiftdeclares the Capacitor dependency with a branch requirement:This causes two problems for apps that use the plugin over Swift Package Manager.
1. The pin caps the whole graph at Capacitor iOS 8.0.0
An unversioned SPM requirement (branch/revision) overrides every version requirement in the
dependency graph. So an app whose own
CapApp-SPM/Package.swiftasks forstill resolves to 8.0.0.
Package.resolved:{ "identity" : "capacitor-swift-pm", "kind" : "remoteSourceControl", "location" : "https://github.com/ionic-team/capacitor-swift-pm.git", "state" : { "branch" : "8.0.0", "revision" : "596259033e94829dffc552a40e7129262122995e" } }It resolves silently — no conflict, no warning — so
package.jsonsays@capacitor/ios@8.5.0whilethe app actually links 8.0.0.
The concrete impact today is Capacitor 8.5's UIScene adoption,
which Xcode 27 requires.
SceneDelegateProxy(CAPSceneDelegateProxy.swift, new in 8.5) does notexist at compile time, so the documented migration cannot be followed as written; apps that depend on
this plugin have to hand-roll a
SceneDelegatethat forwards throughApplicationDelegateProxyinstead. Every Capacitor iOS API added after 8.0 is unavailable the same way.
2.
refs/heads/8.0.0no longer exists upstreamcapacitor-swift-pmno longer has that branch:Revision
5962590is still reachable frommain, so existingPackage.resolvedfiles keep working.But a resolve without a pre-existing
Package.resolvedhas no branch ref to follow. That makes thepin a build hazard for fresh checkouts and for anyone regenerating the file.
Suggested fix
Use a version requirement instead:
That keeps the 8.0.0 floor, lets consuming apps move to 8.5.0+ when they need to, and no longer
depends on a branch that has been deleted. The other Capacitor plugins already do this —
@capacitor/app@8.1.1and@capacitor/text-zoom@8.0.1both declarefrom: "8.0.0".Environment
@capacitor-community/sqlite8.1.0 (also present onmaster,Package.swift:13)@capacitor/core/@capacitor/ios/@capacitor/cli8.5.0