App Store submission and TestFlight beta testing

Sofia Martinez Jan 2026
2 tabs
# Fastlane Fastfile for automated deployment
default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"
  lane :beta do
    # Increment build number
    increment_build_number(xcodeproj: "MyApp.xcodeproj")

    # Build the app
    build_app(
      scheme: "MyApp",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: {
          "com.myapp.MyApp" => "MyApp AppStore"
        }
      }
    )

    # Upload to TestFlight
    upload_to_testflight(
      skip_waiting_for_build_processing: true,
      notify_external_testers: false
    )

    # Post to Slack
    slack(
      message: "Successfully uploaded new build to TestFlight",
      success: true
    )
  end

  desc "Deploy a new version to the App Store"
  lane :release do
    # Ensure clean git status
    ensure_git_status_clean

    # Run tests
    run_tests(scheme: "MyApp")

    # Increment version number
    increment_version_number(
      bump_type: "minor"
    )

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

    # Build and upload
    build_app(scheme: "MyApp", export_method: "app-store")
    upload_to_app_store(
      force: true,
      submit_for_review: false,
      automatic_release: false,
      skip_metadata: false,
      skip_screenshots: false
    )

    # Tag release
    add_git_tag(
      tag: "v#{get_version_number}"
    )
    push_to_git_remote
  end
end
2 files · ruby, xml Explain with highlit

Submitting to the App Store requires careful preparation and compliance with Apple's guidelines. I configure app metadata in App Store Connect—screenshots, descriptions, keywords, categories. The build must be archived with a distribution certificate and provisioning profile. Code signing ensures authenticity. TestFlight enables beta testing before public release—I invite internal and external testers, collect feedback, and iterate. Build versioning follows semantic versioning: major.minor.patch. Release notes describe changes clearly. Review guidelines prohibit certain content and functionality—I audit apps for compliance. Privacy policies are mandatory. Processing time varies, but typically 24-48 hours. Rejections require addressing specific issues and resubmission.