Welcome, future Apple developer! 🎉

Today, we’re going to create an iPhone app that plays a hilariously unnecessary sound when you press a button: a fart. Because if you can build a fart app, you can build just about anything. (Probably.)

By the end of this tutorial, you’ll:

✅ Set up Xcode and create a new project.
✅ Design a simple UI with a button.
✅ Write Swift code to play a sound.
✅ Laugh at your own creation.

Step 1: Install Xcode

If you haven’t already, install Xcode from the Mac App Store. It’s free, but it’s also huge, so grab a coffee while it downloads. ☕

Verify Xcode Installation

Open Terminal (Cmd + Space, type “Terminal”) and run:

xcode-select --install

If you see “command line tools are already installed”, you’re good to go. If not, follow the prompts.

Step 2: Create a New Xcode Project

  1. Open Xcode.
  2. Click “Create a new Xcode project”.
  3. Select App under iOS and hit Next.
  4. Set the project name to FartButtonApp.
  5. Choose Swift as the language and SwiftUI as the UI framework.
  6. Keep everything else as default and click Finish.
  7. Xcode might ask where to save—pick a folder (like Desktop/FartButtonApp).

🚀 Boom! You’ve officially started your first iOS project!

Step 3: Build the UI

Your app needs one thing: a giant Fart Button.

  1. Open ContentView.swift.
  2. Replace the existing code with:
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Button(action: {
                // We'll make this button play a fart sound in the next step!
                print("Button pressed! Prepare for laughs.")
            }) {
                Text("💨 Fart Now!")
                    .font(.largeTitle)
                    .padding()
                    .background(Color.red)
                    .foregroundColor(.white)
                    .clipShape(Capsule())
            }
        }
    }
}

#Preview {
    ContentView()
}

What’s Happening?

• The VStack (vertical stack) centers the button.
• The Button triggers an action when tapped.
• The button says “💨 Fart Now!”, because obviously.
• background(Color.red).clipShape(Capsule()) makes it look nice.

🛠 Run the App by pressing Cmd + R. The button doesn’t do anything yet, but you’ve got a working UI!

Step 4: Add the Fart Sound

Now for the science: playing audio in Swift.

Step 4.1: Add a Sound File

  1. Download a fart sound (Example Sound).
  2. Drag the .mp3 file into Xcode’s Assets folder (inside the FartButtonApp project).

💡 Rename it “fart.mp3” to keep things simple.

Step 4.2: Import AVFoundation

Modify ContentView.swift to play a sound:

import SwiftUI
import AVFoundation  // 1️⃣ Import Audio Framework

struct ContentView: View {
    var audioPlayer: AVAudioPlayer?

    var body: some View {
        VStack {
            Button(action: {
                playFartSound()
            }) {
                Text("💨 Fart Now!")
                    .font(.largeTitle)
                    .padding()
                    .background(Color.red)
                    .foregroundColor(.white)
                    .clipShape(Capsule())
            }
        }
    }

    func playFartSound() {
        guard let path = Bundle.main.path(forResource: "fart", ofType: "mp3") else {
            print("Fart sound not found! 💩")
            return
        }
        let url = URL(fileURLWithPath: path)

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer?.play()
        } catch {
            print("Error playing sound: \(error.localizedDescription)")
        }
    }
}

#Preview {
    ContentView()
}

Step 5: Run and Enjoy!

  1. Press Cmd + R to run the app.
  2. Tap the “💨 Fart Now!” button.
  3. If everything works, your phone will now make a magnificent noise. 🎉

Step 6: Integrate Game Center for a Fart Leaderboard

Step 6.1: Enable Game Center in Xcode

  1. Go to Signing & Capabilities in Xcode.
  2. Click ”+ Capability” and add Game Center.
  3. In the Apple Developer Console, navigate to App Store Connect → My Apps → Your App.
  4. Go to the Game Center section and create a new leaderboard: • Name: “Most Farts in a Day” • Score Format: Integer • Sort Order: High to Low (because more farts = more glory) • Leaderboard ID: "fart.leaderboard"

Step 6.2: Authenticate the Player

Game Center requires authentication. Modify ContentView.swift:

import SwiftUI
import AVFoundation
import GameKit  // 🎮 Import GameKit for Game Center

struct ContentView: View {
    @State private var fartCount = 0
    @State private var localPlayer = GKLocalPlayer.local  // Get local player

    var audioPlayer: AVAudioPlayer?

    var body: some View {
        VStack {
            Button(action: {
                playFartSound()
                fartCount += 1
                submitScore()
            }) {
                Text("💨 Fart Now!")
                    .font(.largeTitle)
                    .padding()
                    .background(Color.red)
                    .foregroundColor(.white)
                    .clipShape(Capsule())
            }

            Text("Total Farts: \(fartCount)")
                .font(.title)
                .padding()

            Button("Show Leaderboard") {
                showLeaderboard()
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .clipShape(Capsule())
        }
        .onAppear {
            authenticatePlayer()
        }
    }

    func playFartSound() {
        guard let path = Bundle.main.path(forResource: "fart", ofType: "mp3") else {
            print("Fart sound not found! 💩")
            return
        }
        let url = URL(fileURLWithPath: path)

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer?.play()
        } catch {
            print("Error playing sound: \(error.localizedDescription)")
        }
    }

    func authenticatePlayer() {
        localPlayer.authenticateHandler = { vc, error in
            if let vc = vc {
                if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
                    scene.windows.first?.rootViewController?.present(vc, animated: true)
                }
            } else if localPlayer.isAuthenticated {
                print("Game Center authenticated: \(localPlayer.displayName)")
            } else {
                print("Game Center authentication failed: \(error?.localizedDescription ?? "Unknown error")")
            }
        }
    }

    func submitScore() {
        guard localPlayer.isAuthenticated else {
            print("Player not authenticated")
            return
        }
        let score = GKScore(leaderboardIdentifier: "fart.leaderboard")
        score.value = Int64(fartCount)  // Update the score
        GKLeaderboard.submitScore(score.value, context: 0, player: localPlayer, leaderboardIDs: ["fart.leaderboard"]) { error in
            if let error = error {
                print("Error submitting score: \(error.localizedDescription)")
            } else {
                print("Score submitted: \(score.value)")
            }
        }
    }

    func showLeaderboard() {
        let viewController = GKGameCenterViewController(leaderboardID: "fart.leaderboard", playerScope: .global, timeScope: .allTime)
        viewController.gameCenterDelegate = UIApplication.shared.delegate as? any GKGameCenterControllerDelegate

        if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
            scene.windows.first?.rootViewController?.present(viewController, animated: true)
        }
    }
}

#Preview {
    ContentView()
}

Step 6.3: Run & Test!

  1. Build & Run the app (Cmd + R).
  2. Tap the Fart Button a few times to rack up points.
  3. Press “Show Leaderboard” and see if you can claim the title of World’s Fart Champion. 🏆

Bonus Features: Make It Even Better!

✅ Add Achievements:
• "First Fart"
• "10 Farts in a Row"
• "Ultimate Gas Master (1000 Farts)"

✅ Add Multiplayer Mode:
• Challenge friends to a “Fart-Off” in real time.

✅ Use CloudKit to Save Scores:
• Sync scores across devices.

Wrap-Up

🎉 Congratulations! You just built your first iPhone app! 🚀

You learned how to:
✅ Set up Xcode and create a project.
✅ Design a UI with SwiftUI.
✅ Play sound effects with AVFoundation.
✅ Have way too much fun with a silly app.

🎮 Congratulations! You just built an iPhone game with Game Center! 🚀

• You authenticated a Game Center player.
• You submitted scores to a leaderboard.
• You displayed the leaderboard UI.

🔜 Next Up: Tutorial 2 – Building a To-Do List App with SwiftUI and MVVM

Go forth, unleash chaos, and make Apple proud. 🍏💨

Bonus: Add More Features!

✅ Randomize Fart Sounds
Download multiple sound files (fart1.mp3, fart2.mp3, etc.) and modify playFartSound():

let fartSounds = ["fart1.mp3", "fart2.mp3", "fart3.mp3"]
let randomFart = fartSounds.randomElement() ?? "fart1.mp3"

✅ Make the Button Shake
Add a haptic feedback effect when tapped:

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

✅ Add a Counter
Track how many farts have been played:

@State private var fartCount = 0

✅ Integrate Game Center (because why not?)
Submit “Most Farts in a Day” as a leaderboard stat.

Next Up:

👉 Tutorial 2: Swift Basics: Variables, Constants, and Data Types

💬 What’s next? Share your fart app with friends, upload it to TestFlight, or… you know, get serious and start learning real iOS development. But where’s the fun in that? 😆