iOS Development Resources From Scratch to App Store

Resources for iOS development from setup to App Store distribution.

Setup

Remove storyboard: Link
gitignore

Package

Package Manager

SPM
Organize, manage, and edit Swift packages.

Mint
A package manager that installs and runs Swift command line tool packages.

Common Packages

SnapKit

A Swift Autolayout DSL for iOS & OS X

Kingfisher

A lightweight, pure-Swift library for downloading and caching images from the web.

RxSwift

Reactive Programming in Swift

R.swift

Strong typed, autocompleted resources like images, fonts and segues in Swift projects

Issue: https://github.com/mac-cain13/R.swift/issues/815
Solution: Use Run Script + Mint, instead of plugin product (RswiftGenerateInternalResources) for generating code.

Lottie

An iOS library to natively render After Effects vector animations

Tools

Project

XcodeGen

A Swift command line tool for generating your Xcode project

Monolith

Swift CLI that scaffolds iOS apps, Swift Packages, and Swift CLIs — 15 optional features, interactive wizard, theme generation from a single hex color.

UI

Lookin

You can inspect and modify views in iOS app via Lookin, just like UI Inspector in Xcode, or another app called Reveal.

Lottie JSON Editor
Lottie edit and preview

Code

SwiftLint

A tool to enforce Swift style and conventions.

SwiftFormat

SwiftFormat is a code library and command-line tool for reformatting Swift code on macOS, Linux or Windows.

Build

Xcode-Build-Server

This repo aims to integrate xcode with sourcekit-lsp and support all the languages (swift, c, cpp, objc, objcpp) xcode supports, so I can develop iOS with my favorate editor.

xcbeautify

xcbeautify is a little beautifier tool for xcodebuild.

Xcode Command Line

xcodebuild

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Build
xcodebuild -scheme MyApp -sdk iphonesimulator build

# Clean build (verify zero warnings)
xcodebuild -scheme MyApp -sdk iphonesimulator clean build

# Run tests
xcodebuild -scheme MyApp -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 17' test

# List schemes
xcodebuild -list

# Archive
xcodebuild -scheme MyApp -archivePath build/MyApp.xcarchive archive

LLDB (Debugger)

Common commands in the Xcode debug console:

Command Description
bt Backtrace — print the call stack of the current thread
bt all Backtrace all threads
po <expr> Print object — evaluate and print a Swift/ObjC expression
p <expr> Print — evaluate expression with type info
frame variable Show all local variables in the current frame
thread list List all threads
thread return Force return from the current function
breakpoint list List all breakpoints
watchpoint set variable <var> Break when a variable changes
expr <code> Execute code at runtime (e.g., expr view.backgroundColor = .red)
continue / c Resume execution
step / s Step into
next / n Step over
finish Step out of current function

simctl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# List available simulators
xcrun simctl list devices

# Boot a simulator
xcrun simctl boot "iPhone 17"

# Open URL in simulator
xcrun simctl openurl booted "myapp://deeplink"

# Take screenshot
xcrun simctl io booted screenshot output.png

# Erase simulator data
xcrun simctl erase "iPhone 17"

Design

Human Interface Guidelines

Coding Style

Trim trailing spaces in Xcode

Git

Commit messages convention

Add tags to build

1
2
git tag v1.2.0  # Version 1.2.0
git tag b10 # Build 10

Distribution

fastlane

Change version code, then fastlane beta

1
2
3
bundle exec fastlane beta
bundle exec fastlane generate_icon
bundle exec fastlane validate

Update

1
fastlane update_fastlane

Fastfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
default_platform(:ios)

# Mac Catalyst lanes (root-level: same app, macOS variant)
desc "Build Mac Catalyst version of the app"
lane :catalyst do
Dir.chdir("..") do
sh("python3 Scripts/analyze_localization.py")
end

build_app(
scheme: "ProjectName",
clean: true,
destination: "generic/platform=macOS",
skip_package_ipa: true,
export_method: "app-store",
catalyst_platform: "macos",
output_directory: "./build/Catalyst",
xcargs: "ONLY_ACTIVE_ARCH=YES -skipPackagePluginValidation"
)
end

platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
# Change to project root for scripts
Dir.chdir("..") do
# Check localization completeness
sh("python3 Scripts/analyze_localization.py")
end

# Increment build number
# increment_build_number(xcodeproj: "ProjectName.xcodeproj")

# Build and upload
# Use export_method: "app-store" for TestFlight
# With automatic signing, Xcode will automatically use/create the App Store distribution profile
# Note: Make sure you've opened the project in Xcode at least once so it can download
# the App Store distribution provisioning profile from your Apple Developer account
build_app(
scheme: "ProjectName",
export_method: "app-store"
)
# upload_to_testflight
end

desc "Generate app icon from source image"
lane :generate_icon do
appicon(
appicon_image_file: 'fastlane/metadata/app_icon.png',
appicon_devices: %i[ipad iphone ios_marketing],
appicon_path: 'ProjectName/Assets.xcassets'
)
end

desc "Run pre-build validations"
lane :validate do
# Change to project root for scripts
Dir.chdir("..") do
sh("python3 Scripts/analyze_localization.py")
end
end
end

Apple

App Store Preview Images

AI

Claude Code

Claude Skill: https://github.com/CharlesWiltgen/Axiom

Apple

App Store Connect: https://appstoreconnect.apple.com/
Developer Account: https://developer.apple.com/account
iCloud Dashboard: https://developer.apple.com/icloud/dashboards/

Articles

View App data: https://developer.apple.com/forums/thread/21660
Disable dark mode: https://sarunw.com/posts/how-to-disable-dark-mode-in-ios/
Hit-Testing: https://smnh.me/hit-testing-in-ios
Use Cursor for iOS development: https://dimillian.medium.com/how-to-use-cursor-for-ios-development-54b912c23941