Guideline 4.8

Guideline 4.8 - Design: Missing Sign in with Apple

Medium RiskEasyTypical Fix: 2-4 hours0 Reports
Also known as:App has Google and Facebook login but no Sign in with AppleSign in with Apple is present but displayed below or smaller than other optionsApp uses email + password login plus one social login (triggers the requirement)Sign in with Apple button uses a custom design instead of the system-provided buttonApp removed Sign in with Apple after initial approvalSign in with Apple is hidden in a secondary “More options” menu

Our Take

Apple rejected your app under Guideline 4.8 because it offers third-party login options (Google, Facebook, Twitter, etc.) without also providing Sign in with Apple as an equivalent option. Since September 2019, Apple requires that any app offering third-party or social login must also offer Sign in with Apple and place that signin option at the top of the list. The Sign in with Apple button must be given equal or greater prominence compared to other login options. This is one of the most common and easiest rejections to fix.

Resolution Guide

01

**Add the Sign in with Apple capability** — In Xcode, go to your target → Signing & Capabilities → + Capability → Sign in with Apple. This enables the entitlement.


02

**Add the Sign in with Apple button in SwiftUI**:

```swift

import AuthenticationServices


SignInWithAppleButton(.signIn) { request in

request.requestedScopes = [.fullName, .email]

} onCompletion: { result in

switch result {

case .success(let auth):

handleAppleSignIn(auth)

case .failure(let error):

print("Sign in with Apple failed: \(error)")

}

}

.signInWithAppleButtonStyle(.black) // or .white, .whiteOutline

.frame(height: 50)

```

03

**Position it with equal or greater prominence** — Place the Sign in with Apple button at the top of your login options, or at minimum the same size and position as other social login buttons:

```swift

VStack(spacing: 12) {

SignInWithAppleButton(...)

.frame(height: 50)

GoogleSignInButton()

.frame(height: 50)

FacebookLoginButton()

.frame(height: 50)

}

```

04

**Handle the Apple ID credential** — On first sign-in, Apple provides a user identifier, optional full name, and optional email. Cache the user identifier because Apple only sends the name and email on the FIRST authorization:

```swift

func handleAppleSignIn(_ authorization: ASAuthorization) {

guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return }

let userId = credential.user // Always provided

let email = credential.email // Only on first auth

let fullName = credential.fullName // Only on first auth

// Send to your backend and create/link account

}

```

05

**Check credential state on app launch** — Verify the Apple ID is still valid:

```swift

ASAuthorizationAppleIDProvider().getCredentialState(forUserID: savedUserId) { state, error in

switch state {

case .authorized: break // all good

case .revoked: signOut() // user revoked access

case .notFound: signOut() // no credential found

default: break

}

}

```

06

**Use the system-provided button style** — Apple requires using `SignInWithAppleButton` (SwiftUI) or `ASAuthorizationAppleIDButton` (UIKit). Do not create a custom button with the Apple logo.


07

**Test with a sandbox Apple ID** — Create a sandbox test account in App Store Connect to test the full sign-in flow before submitting.


Example Rejection Email

From:Apple App Review Team
Subject:Guideline 4.8 - Design: Missing Sign in with Apple
Guideline 4.8 - Sign in with Apple Your app uses a third-party login service but does not offer Sign in with Apple as an equivalent option. Apps that use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign in with LinkedIn, Login with Amazon, or WeChat Login) for account authentication must also offer Sign in with Apple as an equivalent option. Sign in with Apple must be available as an option until you can verify that all accounts have been transitioned. Next Steps: Please revise your app to offer Sign in with Apple as a login option. Sign in with Apple should be offered with at least equivalent prominence as other login options.

Consider Appealing

Do not appeal. This requirement is non-negotiable if you offer any third-party login. The only exception is apps that exclusively use email/password or phone number authentication with no social login buttons — if that’s your case, clarify this in Resolution Center. Otherwise, add Sign in with Apple and resubmit — it’s a 2–4 hour fix.

Generate Appeal

Before & After

Before — Rejected

// Login screen with only third-party options — no Sign in with Apple

struct LoginView: View {

var body: some View {

VStack(spacing: 16) {

Text("Welcome")

.font(.largeTitle)


Button(action: { signInWithGoogle() }) {

HStack {

Image("google-logo")

Text("Sign in with Google")

}

.frame(maxWidth: .infinity, minHeight: 50)

.background(Color.white)

.cornerRadius(8)

.overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray))

}


Button(action: { signInWithFacebook() }) {

HStack {

Image("facebook-logo")

Text("Sign in with Facebook")

}

.frame(maxWidth: .infinity, minHeight: 50)

.background(Color(red: 0.23, green: 0.35, blue: 0.60))

.foregroundColor(.white)

.cornerRadius(8)

}

}

.padding()

}

}

After — Approved

// Login screen with Sign in with Apple at top prominence

import AuthenticationServices


struct LoginView: View {

var body: some View {

VStack(spacing: 16) {

Text("Welcome")

.font(.largeTitle)


// Sign in with Apple — FIRST and equal prominence

SignInWithAppleButton(.signIn) { request in

request.requestedScopes = [.fullName, .email]

} onCompletion: { result in

handleAppleSignIn(result)

}

.signInWithAppleButtonStyle(.black)

.frame(maxWidth: .infinity, minHeight: 50)

.cornerRadius(8)


Button(action: { signInWithGoogle() }) {

HStack {

Image("google-logo")

Text("Sign in with Google")

}

.frame(maxWidth: .infinity, minHeight: 50)

.background(Color.white)

.cornerRadius(8)

.overlay(RoundedRectangle(cornerRadius: 8).stroke(Color.gray))

}


Button(action: { signInWithFacebook() }) {

HStack {

Image("facebook-logo")

Text("Sign in with Facebook")

}

.frame(maxWidth: .infinity, minHeight: 50)

.background(Color(red: 0.23, green: 0.35, blue: 0.60))

.foregroundColor(.white)

.cornerRadius(8)

}

}

.padding()

}

}

What changed: The Sign in with Apple button is added as the first option with equal size (50pt height) and full width. It uses the system-provided SignInWithAppleButton with the .black style, which Apple requires instead of custom buttons. Placing it first ensures equal or greater prominence.

Community Solutions · 0

Sign in to share your solution.

More Guideline 4 (Design) rejections

View all Guideline 4 rejections