flutter-tsnet/ios/tsnet_flutter.podspec
Mathias Beaulieu-Duncan 5c9f318f5a Fix xcframework linking for pub.dev installs, bump to 0.1.1
Use DERIVED_FILE_DIR instead of symlinks for force_load path.
Symlinks in PODS_TARGET_SRCROOT fail when installed from pub cache
because Xcode validates build inputs before script phases run.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 06:53:58 -04:00

62 lines
2.2 KiB
Ruby

Pod::Spec.new do |s|
s.name = 'tsnet_flutter'
s.version = '0.1.1'
s.summary = 'Embedded Tailscale tsnet for Flutter'
s.description = <<-DESC
Embed Tailscale's tsnet in Flutter apps. Provides a userspace WireGuard
tunnel with a localhost TCP proxy. Built with go build -buildmode=c-archive.
No VPN entitlement needed — uses userspace netstack.
DESC
s.homepage = 'https://github.com/svrnty/tsnet_flutter'
s.license = { :type => 'BSD-3-Clause', :file => '../LICENSE' }
s.author = { 'Svrnty' => 'mathias@svrnty.io' }
s.source = { :path => '.' }
s.source_files = 'Classes/**/*.{swift,h}'
s.public_header_files = 'Classes/**/*.h'
s.preserve_paths = 'TailscaleKit.xcframework'
s.dependency 'Flutter'
s.platform = :ios, '14.0'
s.swift_version = '5.0'
s.libraries = 'resolv'
s.pod_target_xcconfig = {
'DEFINES_MODULE' => 'YES',
'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 x86_64',
# Link the Go static library — the script phase copies the correct slice
# to DERIVED_FILE_DIR which is always writable and available at link time.
'OTHER_LDFLAGS' => '$(inherited) -force_load "$(DERIVED_FILE_DIR)/TailscaleKit"',
}
s.user_target_xcconfig = {
'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 x86_64',
}
# Copy the correct xcframework slice to DERIVED_FILE_DIR before compile.
# DERIVED_FILE_DIR is writable and exists before the link phase.
s.script_phase = {
:name => 'Select TailscaleKit Slice',
:script => <<-'SCRIPT',
XCFW="${PODS_TARGET_SRCROOT}/TailscaleKit.xcframework"
if [ "$PLATFORM_NAME" = "iphonesimulator" ]; then
SLICE="ios-arm64-simulator"
else
SLICE="ios-arm64"
fi
SRC="$XCFW/$SLICE/TailscaleKit.framework/TailscaleKit"
DEST="${DERIVED_FILE_DIR}/TailscaleKit"
if [ ! -f "$DEST" ] || [ "$SRC" -nt "$DEST" ]; then
cp "$SRC" "$DEST"
echo "Copied TailscaleKit ($SLICE) to $DEST"
else
echo "TailscaleKit ($SLICE) up to date"
fi
SCRIPT
:execution_position => :before_compile,
:output_files => ['$(DERIVED_FILE_DIR)/TailscaleKit'],
}
end