I have been developing a flutter web app for a few years without issue until I decided to refactor it as a native macos app.
Here is a summary of the issues I have faced and how I got around most of them. The journey is far from over.
Out of the box, unable to find pods output files. The fix is to import the files in AppInfo.xcconfig.
I get header issues on build like this:
Pods/GoogleDataTransport/GoogleDataTransport/GDTCCTLibrary/Protogen/nanopb/compliance.nanopb.h:22:
Pods/nanopb/pb_decode.h:9:10: error: 'pb.h' file not found with <angled> include; use "quotes" instead
To get round this I need to run this script before every build:
pod deintegrate
rm -rf Pods
rm Podfile.lock
rm -rf ~/Library/Caches/CocoaPods
rm -rf ~/.cocoapods/repos
pod setup
pod install --repo-update
I can’t build 2 times consecutively without that. Then I can build but flutter run has 2 errors and produces a black screen.
I also need to run a prebuild and after build script to fix headers in the Runner target build phases.
Here is my post build script, they are similar
#!/bin/sh
# Paths to nanopb headers
NANOPB_HEADERS=(
"${SRCROOT}/Pods/nanopb/pb_common.h"
"${SRCROOT}/Pods/nanopb/pb_decode.h"
"${SRCROOT}/Pods/nanopb/pb_encode.h"
"${SRCROOT}/Pods/nanopb/pb.h"
)
# Paths to PromisesObjC headers
PROMISES_HEADERS=(
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+All.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Always.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Any.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Async.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Await.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Catch.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Delay.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Do.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Race.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Recover.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Reduce.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Retry.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Testing.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Then.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Timeout.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Validate.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise+Wrap.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromise.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromises.h"
"${SRCROOT}/Pods/PromisesObjC/Sources/FBLPromises/include/FBLPromiseError.h"
)
# Replace double-quoted includes with angle-bracketed includes in nanopb headers
for HEADER in "${NANOPB_HEADERS[@]}"; do
if [ -f "$HEADER" ]; then
sed -i '' 's/#include "([^"]*)"/#include <1>/g' "$HEADER"
fi
done
# Replace double-quoted includes with angle-bracketed includes in PromisesObjC headers
for HEADER in "${PROMISES_HEADERS[@]}"; do
if [ -f "$HEADER" ]; then
sed -i '' 's/#include "([^"]*)"/#include <1>/g' "$HEADER"
fi
done
Even with all this effort Xcode reports that Pods always needs updating after a build. I also see that MainFlutterWindow.swift complains about not finding the FlutterMacOS framework even though AppDelegate.swift needs it and can see it.
I have spent a week trying to resolve these issues and about to give up on Apple dev unless I can find a solution. Cocopods just seems too fragile to use.
Mac m2 version 14.6, Flutter 3.22.3.