diff --git a/ios/ffmpeg_kit_flutter_new.podspec b/ios/ffmpeg_kit_flutter_new.podspec index 776ab372..629c8ded 100644 --- a/ios/ffmpeg_kit_flutter_new.podspec +++ b/ios/ffmpeg_kit_flutter_new.podspec @@ -18,7 +18,7 @@ Pod::Spec.new do |s| s.default_subspec = 'full-gpl' s.dependency 'Flutter' - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' } + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } s.subspec 'full-gpl' do |ss| # Adding pre-install hook @@ -30,14 +30,14 @@ Pod::Spec.new do |s| CMD ss.source_files = 'Classes/**/*' ss.public_header_files = 'Classes/**/*.h' - ss.ios.vendored_frameworks = 'Frameworks/ffmpegkit.framework', - 'Frameworks/libavcodec.framework', - 'Frameworks/libavdevice.framework', - 'Frameworks/libavfilter.framework', - 'Frameworks/libavformat.framework', - 'Frameworks/libavutil.framework', - 'Frameworks/libswresample.framework', - 'Frameworks/libswscale.framework' + ss.ios.vendored_frameworks = 'Frameworks/ffmpegkit.xcframework', + 'Frameworks/libavcodec.xcframework', + 'Frameworks/libavdevice.xcframework', + 'Frameworks/libavfilter.xcframework', + 'Frameworks/libavformat.xcframework', + 'Frameworks/libavutil.xcframework', + 'Frameworks/libswresample.xcframework', + 'Frameworks/libswscale.xcframework' ss.ios.frameworks = 'AudioToolbox', 'CoreMedia' ss.libraries = 'z', 'bz2', 'c++', 'iconv' ss.ios.deployment_target = '14.0' diff --git a/scripts/setup_ios.sh b/scripts/setup_ios.sh index b6b1cd9d..4003865f 100755 --- a/scripts/setup_ios.sh +++ b/scripts/setup_ios.sh @@ -15,4 +15,57 @@ xcrun bitcode_strip -r Frameworks/libavfilter.framework/libavfilter -o Framework xcrun bitcode_strip -r Frameworks/libavformat.framework/libavformat -o Frameworks/libavformat.framework/libavformat xcrun bitcode_strip -r Frameworks/libavutil.framework/libavutil -o Frameworks/libavutil.framework/libavutil xcrun bitcode_strip -r Frameworks/libswresample.framework/libswresample -o Frameworks/libswresample.framework/libswresample -xcrun bitcode_strip -r Frameworks/libswscale.framework/libswscale -o Frameworks/libswscale.framework/libswscale \ No newline at end of file +xcrun bitcode_strip -r Frameworks/libswscale.framework/libswscale -o Frameworks/libswscale.framework/libswscale + +# Convert each framework to XCFramework with device + simulator variants +# iOS 26+ simulators on Apple Silicon require arm64, but the vendored +# frameworks ship arm64 built for iOS device platform, not simulator. +# Xcode rejects linking device binaries into simulator targets. +# Fix: create .xcframework with two variants — device unchanged, +# simulator variant has arm64 platform patched to IOSSIMULATOR. +for fw in Frameworks/*.framework; do + fwname=$(basename "$fw" .framework) + fwpath="$fw/$fwname" + + # Thin fat binary into per-architecture slices + lipo "$fwpath" -thin arm64 -output "/tmp/${fwname}_arm64" + lipo "$fwpath" -thin x86_64 -output "/tmp/${fwname}_x86_64" + lipo "$fwpath" -thin arm64e -output "/tmp/${fwname}_arm64e" + + # Convert arm64 slice from IOS (platform 2) to IOSSIMULATOR (platform 7) + # Keeps minos=12.1 and sdk=18.5 to match original build + xcrun vtool -set-build-version 7 12.1 18.5 -replace \ + -output "/tmp/${fwname}_arm64_sim" "/tmp/${fwname}_arm64" + + # Device variant: keep arm64 (IOS) + arm64e (IOS) slices + devdir="XCFramework/tmp/ios-arm64/$fwname.framework" + mkdir -p "$devdir" + cp -R "$fw/" "$devdir/" + if [ -f "/tmp/${fwname}_arm64e" ]; then + lipo "/tmp/${fwname}_arm64" "/tmp/${fwname}_arm64e" \ + -create -output "$devdir/$fwname" + else + cp "/tmp/${fwname}_arm64" "$devdir/$fwname" + fi + + # Simulator variant: combined converted arm64 (IOSSIMULATOR) + original x86_64 (IOSSIMULATOR) + simdir="XCFramework/tmp/ios-arm64_x86_64-simulator/$fwname.framework" + mkdir -p "$simdir" + cp -R "$fw/" "$simdir/" + lipo "/tmp/${fwname}_arm64_sim" "/tmp/${fwname}_x86_64" \ + -create -output "$simdir/$fwname" + # Info.plist must declare iPhoneSimulator platform for simulator variant + sed -i '' 's/iPhoneOS/iPhoneSimulator/g' "$simdir/Info.plist" + + # Create final .xcframework containing both variants + xcodebuild -create-xcframework \ + -framework "$devdir" \ + -framework "$simdir" \ + -output "Frameworks/$fwname.xcframework" 2>&1 + + rm -f "/tmp/${fwname}_arm64" "/tmp/${fwname}_arm64e" \ + "/tmp/${fwname}_x86_64" "/tmp/${fwname}_arm64_sim" + rm -rf "XCFramework/tmp" +done +# Remove original .framework dirs, keep only .xcframework +rm -rf Frameworks/*.framework \ No newline at end of file