Building an Objective-C or Swift Project
What This Guide Covers #
Objective-C/Swift builds are not available on the Linux environments.
Supported Xcode versions #
Travis CI uses macOS 10.13 (and Xcode 9.4.1) by default. You can use another
version of Xcode (and macOS) by specifying the corresponding
osx_image key from
the following table:
|osx_image value||Xcode version||macOS version|
||Xcode 11.0||macOS 10.14|
||Xcode 10.2.1||macOS 10.14|
||Xcode 10.1||macOS 10.13|
||Xcode 10.0||macOS 10.13|
||Xcode 9.4.1||macOS 10.13|
||Xcode 9.3||macOS 10.13|
||Xcode 9.2||macOS 10.12|
||Xcode 9.1||macOS 10.12|
||Xcode 9.0||macOS 10.12|
||Xcode 8.3.3||macOS 10.12|
||Xcode 8.0||macOS 10.11|
||Xcode 7.3.1||macOS 10.11|
||Xcode 6.4||macOS 10.10|
Detailed iOS SDK versions are available in the macOS CI environment reference
Objective-C vs Swift #
language: swift is just an alias for
language: objective-c. Said another way, we don’t have native support for Swift projects at this time. Swift builds are just routed to our macOS image, the same as Objective-C builds.
Default Test Script #
Travis CI runs xcodebuild and xcpretty by default to execute your tests. In order for xcodebuild to work, you need to tell it where to find your project or workspace, what scheme you would like to build and test, and which device or simulator run tests on. For example:
language: objective-c xcode_project: MyNewProject.xcodeproj # path to your xcodeproj folder xcode_scheme: MyNewProjectTests xcode_destination: platform=iOS Simulator,OS=10.1,name=iPad Pro (9.7-inch)
You can also specify an SDK using the
xcode_sdk variable. This needs to be on
X.Y is the version you want to test
If you are using a workspace instead of a project, use the
key in your .travis.yml instead of
Builds using the
xcode7.3images use xctool by default rather than xcodebuild and xcpretty.
Shared Schemes #
In order to your run tests on Travis CI, you also need to create a Shared Scheme for your application target, and ensure that all dependencies (such as CocoaPods) are added explicitly to the Scheme. To do so:
- Open up the Manage Schemes sheet by selecting the Product → Schemes → Manage Schemes… menu option.
- Locate the target you want to use for testing in the list. Ensure that the Shared checkbox in the far right hand column of the sheet is checked.
If your target include cross-project dependencies such as CocoaPods, then you will need to ensure that they have been configured as explicit dependencies. To do so:
- Highlight your application target and hit the Edit… button to open the Scheme editing sheet.
- Click the Build tab in the left-hand panel of the Scheme editor.
- Click the + button and add each dependency to the project. CocoaPods will appear as a static library named Pods.
- Drag the dependency above your test target so it is built first.
You will now have a new file in the xcshareddata/xcschemes directory underneath your Xcode project. This is the shared Scheme that you just configured. Check this file into your repository and xcodebuild will be able to find and execute your tests.
Device Destinations #
To be able to run tests, xcodebuild needs to know which device to run them on, whether that’s a real device (the Mac running xcodebuild or an iOS device connected to the Mac) or a simulator. When you run tests in Travis CI, you need to tell xcodebuild which simulator you want to use by specifying a device destination.
Device destinations are strings that identify a particular device to use. You can pass
them to xcodebuild by using the
-destination flag. If you’re using the default script
in your Travis CI build, you can use the
xcode_destination key in your .travis.yml:
xcode_destination: platform=iOS Simulator,OS=11.3,name=iPhone X
A device destination is a comma-separated list of key-value pairs. When you’re testing on Travis CI, you should include the following keys in your device destination:
platform: one of
tvOS Simulator. (The “Simulator” portion is important. Travis CI does not support running tests against hardware iOS devices)
macOS, also include:
OS: the version number of the OS on the simulated device.
name: the name of the simulated device. For example: “iPhone X” or “Apple TV 1080p”.
Some examples of valid device destinations include:
platform=iOS Simulator,OS=9.3,name=iPhone 5s
platform=tvOS Simulator,OS=11.0,name=Apple TV 4K
It’s important that your device destination uniquely identifies your device among those that Xcode knows about. Since Travis CI’s build images have many different simulator OS versions installed, you should specify the OS version in your device destination, as the name alone is not likely to uniquely identify a single simulator.
You can learn more about device destinations in the xcodebuild man page. If you’re on your Mac, you can click here to view the xcodebuild man page in the Terminal app.
Dependency Management #
Travis CI uses CocoaPods to install your project’s dependencies.
The default command run by Travis CI is:
Note that this is only run when we detect a Podfile in the project’s root
directory. If the Podfile is in a different directory, you can use the
setting in the .travis.yml:
pod install is not run if the Pods directory is vendored and there have
been no changes to the Podfile.lock file.
If there is a
Gemfile in your project’s root directory, the
pod command is
not executed, but instead Bundler is used as a wrapper to
pod as follows:
bundle exec pod install
If you want to use a different means of handling your project’s dependencies,
you can override the
install: make get-deps
Build Matrix #
For Objective-C projects,
xcode_scheme can be given as arrays to construct a build matrix.
A complete list of simulators available in each version of Xcode is shown on the macOS environment page.