Recommended resources
The freely available resources this lesson will direct you to.
Following our successful setup of the complete iOS toolchain in the previous lesson, your development machine is now fully prepared to build native iOS applications. We've bridged the gap between your web project and the native world by ensuring the pod install command runs correctly during a sync.
This lesson takes the next logical step: we will move from the command-line interface into Apple's native Integrated Development Environment, Xcode. You will learn how to open the Capacitor-generated iOS project and begin navigating its structure. We will focus on identifying and understanding the purpose of three critical files that you will interact with throughout the development lifecycle: App.xcworkspace, Podfile, and Info.plist. Mastering these files is key to configuring, extending, and ultimately shipping your application.
Opening the Native Project in Xcode
While the Capacitor CLI provides powerful commands for building and running your app, direct interaction with Xcode is essential for tasks like native debugging, setting team and signing information, and configuring app capabilities.
The standard way to open your project is with a simple Capacitor command. In your monorepo's root directory, run:
bunx cap open ios
This command conveniently finds the correct project file and launches Xcode. Let's consult the official Capacitor documentation which confirms this procedure.
Getting Started | Capacitor Documentation
This section of the official documentation covers the basic commands for interacting with the iOS project.
Focus on the part titled Opening the iOS Project. Note that the documentation uses npx, but as per your preference, we are using bunx. The documentation also reveals the manual command, which gives us a clue about the specific file being opened: ios/App/App.xcworkspace.
This brings up a crucial point for anyone new to the iOS ecosystem. Inside your ios/App directory, you will find both an App.xcodeproj file and an App.xcworkspace file. You must always open the .xcworkspace file.
Here’s why:
App.xcodeprojcontains the settings and files for your main application only.App.xcworkspaceis a "workspace" that groups your main project (.xcodeproj) together with any dependency projects. In our case, this includes thePodsproject created by CocoaPods, which contains all the native Capacitor plugins.
If you open App.xcodeproj directly, Xcode will not be aware of the plugin code, leading to "file not found" errors and build failures. The workspace is what links everything together.
The iOS Project File Structure
Before we dive into the key files, let's orient ourselves with the overall structure that Capacitor generated. The image below shows a typical file tree for the ios directory, similar to what you would see in VS Code.

When you open App.xcworkspace in Xcode, this file structure is presented in the "Project Navigator" panel on the left. Now, let's identify the three most important files for our work.
Key File Identification
A well-documented project on GitHub provides an excellent breakdown of these files, which we will use as a reference.
Multi-Server-Backup-Manager/IOS_APP_DETAILED_ANALYSIS.md ...
This document provides a clear analysis of a standard Capacitor iOS project structure.
Review the Project Structure section. Pay close attention to the file tree under Directory Layout and the summary under Key Files Breakdown. This will give you a map of the territory we are about to explore.
As highlighted in the analysis, we'll focus on the workspace, the Podfile, and the property list.
1. App.xcworkspace
This is the file you just opened. As discussed, its primary role is to act as the top-level container for your project and all its native dependencies managed by CocoaPods. There isn't much to edit in this file directly, but recognizing it as the correct entry point for development is fundamental.
2. Podfile
The Podfile is the native equivalent of your package.json file. It defines the dependencies for the iOS project, which are managed by CocoaPods.
- Location: You can find it at
ios/App/Podfile. In Xcode's navigator, it will likely be in the top-levelAppfolder or within aPodssub-folder. - Purpose: When you run
bunx cap sync, Capacitor automatically updates this file to include any native iOS code required by the plugins you've installed. The subsequentpod installcommand reads this file, fetches the specified libraries (called "pods"), and integrates them into theApp.xcworkspace.
Take a moment to open and inspect this file. You'll see it targets the 'App' project and lists pods like Capacitor and CapacitorCordova. As you add plugins, this list will grow.
3. Info.plist
The Information Property List, or Info.plist, is the metadata and configuration heart of your iOS application. It's a structured XML file that the operating system uses to learn about your app.
- Location: Physically, it resides at
ios/App/App/Info.plist. In Xcode, it's typically located inside the main blueAppfolder group, under theAppsub-group.

- Purpose: This file contains essential information, including:
- Bundle Identifier: The unique ID for your app (e.g.,
com.company.appname). - App Display Name: The name that appears under the icon on the home screen.
- Version Numbers:
CFBundleShortVersionString(the public version, like 1.0) andCFBundleVersion(the build number, like 1). - Permissions: Crucially, this is where you must declare your intent to use sensitive APIs. For example, if your app needs camera access, you must add a key like
NSCameraUsageDescriptionwith a user-facing string explaining why you need it. We will revisit this file in detail when we add plugins.
- Bundle Identifier: The unique ID for your app (e.g.,
The GitHub analysis provides a great summary of the Info.plist contents.
Multi-Server-Backup-Manager/IOS_APP_DETAILED_ANALYSIS.md ...
This document also contains a specific section detailing the Info.plist file.
Read through the section Info.plist Configuration. Focus on understanding the different categories of information it holds, especially App Information and Permissions.
Conclusion
In this lesson, we transitioned from the terminal into Xcode, the native iOS development environment. You have learned how to open your project correctly and have identified the three foundational files that govern its structure, dependencies, and configuration.
Here are the key takeaways:
- Always open the
.xcworkspacefile, not the.xcodeproj, to ensure all native dependencies from CocoaPods are included in the build. Thebunx cap open ioscommand handles this for you. - The
Podfileacts as thepackage.jsonfor your native iOS project, defining the dependencies that Capacitor and its plugins require. It is managed automatically by thesynccommand. - The
Info.plistis the central configuration file for your app, containing its identity, versioning, and, most importantly, the permission strings required by iOS for accessing sensitive user data or device features.
Now that you're familiar with the project's layout in Xcode, we are ready for the payoff. In the next lesson, you will compile and run your application for the first time on an iOS Simulator, seeing your React web app come to life inside a native mobile shell.