DEV Community

noah.k
noah.k

Posted on

1

How to migrate your project with Carthage to Xcode 12

According to Apple's announcement, you need to build your app with Xcode 12 from April 2021 to submit to the App Store. I really got stuck migrating my project which uses Carthage, so let's see how I managed to do that in this article.

Use XCFramework

XCFramework is necessary to fit to Xcode 12.
This article doesn't refer to the detail of XCFramework, so please check other sources for more information.

Update Carthage to 0.37.0

Carthage 0.37.0 added support for XCFramework.

Add Carthage --use-xcframeworks option

E.g. carthage bootstrap --use-xcframeworks --platform iOS --no-use-binaries

Link to XCFrameworks

In TARGETS -> General tab -> Frameworks, Libraries, and Embedded Content,
replace *.framework with *.xcframework.
*.xcframework files are located in Carthage/Build.

Update Framework Search Paths

In TARGETS -> Build Settings tab -> Search Paths -> Framework Search Paths,
Replace *.framework's parent folder path with *.xcframework's.
E.g. $(PROJECT_DIR)/Carthage/Build/iOS -> $(PROJECT_DIR)/Carthage/Build

Update Not to Run Script copy-frameworks

In TARGETS -> Build Phases tab,
you no longer need to copy frameworks.

Workaround for Test Target

In my project, steps above enabled main target to work with Xcode 12, but not test target.
I use some libraries only for test target, but building test target failed saying No such module (library name).
Let's see how to fix that.

Update Framework Search Paths

In TARGETS -> Build Settings tab -> Search Paths -> Framework Search Paths,
add architectures where you run.
E.g. Any iOS SDK and Any iOS Simulator SDK

Then add *.framework's parent folder path for each architecture.
*.framework files are located in *.xcframework/(architecture).
E.g. $(PROJECT_DIR)/Carthage/Build/Foo.xcframework/ios-arm64_armv7 for Any iOS SDK,
$(PROJECT_DIR)/Carthage/Build/Foo.xcframework/ios-arm64_i386_x86_64-simulator for Any iOS Simulator SDK

Remove Links to Frameworks, XCFrameworks

I succeeded to build the target without setting links to Frameworks or XCFrameworks.
Remove them from TARGETS -> Build Phases tab -> Link Binary With Libraries.

Copy Frameworks

Copying frameworks is still necessary for this target, otherwise you'll encounter Library not loaded when running the test.
In TARGETS -> Build Phases tab, create (or update if exists) Copy Files Phase specifying *.xcframework, not *.framework.

Reference

Carthage / Building platform-independent XCFrameworks (Xcode 12 and above)

Sentry mobile image

Tired of users complaining about slow app loading and janky UI?

Improve performance with key strategies like TTID/TTFD & app start analysis.

Read the blog post

Top comments (1)

Collapse
 
mokagio profile image
Gio Lodi β€’

Very useful. Thank you @noahkuwae πŸ™‡β€β™‚οΈ

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay