Guideline 4.0
Guideline 4.0 - Design: Apple Pay Button Not Following Guidelines
Our Take
Apple rejected your app because the Apple Pay button does not conform to Apple’s marketing and branding guidelines. Apple requires that apps use the system-provided PKPaymentButton (or the SwiftUI PaymentButton equivalent) rather than custom-designed buttons. Apple is strict about use of its brand assets. Custom buttons that use the Apple Pay logo, the Apple logo, or similar branding in non-approved styles violate Apple’s trademark and design requirements. The button must also be appropriately sized and not be modified with custom colors, rounded corners, or overlays.
Resolution Guide
Use the system-provided button
In SwiftUI, use PaymentButton (iOS 16+) or wrap PKPaymentButton:
```swift
import PassKit
// SwiftUI (iOS 16+)
PayWithApplePayButton(.checkout) {
startApplePayFlow()
}
.payWithApplePayButtonStyle(.black) // .black, .white, or .whiteOutline
.frame(height: 50)
```
In UIKit:
```swift
let button = PKPaymentButton(paymentButtonType: .checkout, paymentButtonStyle: .black)
button.addTarget(self, action: #selector(startApplePayFlow), for: .touchUpInside)
```
Choose the correct button type
PKPaymentButton supports several types:
- `.buy` — “Buy with Apple Pay”
- `.checkout` — “Check out with Apple Pay”
- `.donate` — “Donate with Apple Pay”
- `.plain` — Apple Pay logo only
- `.setUp` — “Set up Apple Pay”
Meet minimum size requirements
The Apple Pay button must be at least 30pt tall and have a minimum width of 100pt. Apple recommends 44–50pt height for comfortable tapping:
```swift
.frame(minWidth: 100, minHeight: 44)
```
Do not modify the button’s appearance
Do not apply:
- Custom background colors or gradients
- Non-standard corner radius (the system button has its own radius)
- Drop shadows, borders, or overlays
- Opacity changes or blur effects
Use the correct button style for your background
Choose the style that provides adequate contrast:
- `.black` for light backgrounds
- `.white` for dark backgrounds
- `.whiteOutline` for white backgrounds
Check Apple Pay availability first
Only show the button when the device can make payments:
```swift
if PKPaymentAuthorizationController.canMakePayments() {
// Show Apple Pay button
} else {
// Show standard checkout or setup button
}
```
Review the Apple Pay Marketing Guidelines
Download the official guide from developer.apple.com/apple-pay/marketing/ for detailed specifications on button placement, spacing, and usage alongside other payment methods.
Example Rejection Email
Consider Appealing
Do not appeal. This is a quick fix — simply swap your custom button for PKPaymentButton and resubmit. If you believe your button already uses the system API but was still rejected, double-check that you haven’t applied any modifiers (background, cornerRadius, overlay) to the button or its container.
Before & After
// Custom Apple Pay button — violates branding guidelines
struct CheckoutView: View {
var body: some View {
VStack(spacing: 16) {
// ... cart items ...
Button(action: { startApplePayFlow() }) {
HStack {
Image("apple-pay-logo") // custom asset
.resizable()
.frame(width: 24, height: 24)
Text("Pay with Apple Pay")
.font(.headline)
.foregroundColor(.white)
}
.frame(maxWidth: .infinity, minHeight: 44)
.background(
LinearGradient(colors: [.blue, .purple], startPoint: .leading, endPoint: .trailing)
)
.cornerRadius(12)
}
}
}
}
// System-provided Apple Pay button — follows branding guidelines
import PassKit
struct CheckoutView: View {
var body: some View {
VStack(spacing: 16) {
// ... cart items ...
if PKPaymentAuthorizationController.canMakePayments() {
PayWithApplePayButton(.checkout) {
startApplePayFlow()
}
.payWithApplePayButtonStyle(.black)
.frame(maxWidth: .infinity, minHeight: 44)
} else {
Button("Checkout") { startStandardCheckout() }
.frame(maxWidth: .infinity, minHeight: 44)
.background(Color.accentColor)
.foregroundColor(.white)
.cornerRadius(8)
}
}
}
}
What changed: The custom button with a hand-drawn Apple Pay logo and gradient background was replaced with the system PayWithApplePayButton. The system button uses Apple’s approved styling (.black) and automatically renders the correct logo, text, and corner radius. A canMakePayments() check ensures the button only appears on supported devices.
// UIKit: manually constructed Apple Pay button — wrong approach
let payButton = UIButton(type: .custom)
payButton.setTitle(" Pay", for: .normal)
payButton.setImage(UIImage(named: "apple-logo-white"), for: .normal)
payButton.backgroundColor = .black
payButton.layer.cornerRadius = 16
payButton.heightAnchor.constraint(equalToConstant: 36).isActive = true
// UIKit: system PKPaymentButton — correct approach
let payButton = PKPaymentButton(paymentButtonType: .checkout, paymentButtonStyle: .black)
payButton.addTarget(self, action: #selector(startApplePayFlow), for: .touchUpInside)
payButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
payButton.heightAnchor.constraint(equalToConstant: 44)
])
What changed: Replaced the custom UIButton (with a manually set Apple logo and custom corner radius) with PKPaymentButton. The system button handles all branding requirements automatically: correct logo, approved text, and proper styling. The height was also increased from 36pt to 44pt to meet the recommended minimum.
Community Solutions · 0
Sign in to share your solution.
More Guideline 4 (Design) rejections
- Guideline 4.0 - Design: App Does Not Include iOS Features
- Guideline 4.0 - Design: App Looks Like a Website
- Guideline 4.0 - Design: Blurry Icons or Low-Resolution Assets
- Guideline 4.0 - Design: Broken Layout on iPad
- Guideline 4.0 - Design: Content Clipped by Notch or Safe Area
- Guideline 4.0 - Design: Crowded or Poor Layout