Contents

App Store Rejection Guide: Fixing Guideline 2.1 PassKit/Apple Pay Issues

During the iOS app submission process for App Store review, developers often encounter various reasons for rejection. Rejections related to Guideline 2.1 typically involve issues with metadata or functional completeness.

Recently, when submitting an app using StoreKit 2 for subscriptions, I encountered a rejection related to PassKit (Apple Pay). This article details the phenomenon, root cause analysis, and the final solution, hoping to help developers facing the same issue.

1. Issue Description

After submitting the app for review, I received the following feedback from the Apple review team:

Guideline 2.1 - Information Needed

The app binary includes the PassKit framework for implementing Apple Pay, but we were unable to verify any integration of Apple Pay within the app.

Next Steps

If the app integrates the functionality referenced above, indicate where in the app we can locate it.

If the app does not include this functionality, indicate this information in the Review Notes section for each version of the app in App Store Connect when submitting for review.

Interpretation

The reviewer detected that the app’s binary file included the PassKit framework (usually used for Apple Pay), but could not find any functional entry point for Apple Pay within the app. Apple requires us to either indicate the location of the functionality or explain why the framework is included but not used.

2. Root Cause Analysis

2.1 Issue Localization

After receiving the rejection, I conducted a detailed investigation of the project:

  1. Code Level: Searched the entire project and confirmed there was no import PassKit, nor any code handling Apple Pay payment requests.
  2. Functional Level: The app uses StoreKit 2 for digital goods subscriptions (In-App Purchase), which is a completely different system from Apple Pay used for physical goods.
  3. Configuration Level: I found the problem when checking the .entitlements file.

2.2 Misconfiguration

In the project’s entitlements files (mementoDebug.entitlements and mementoRelease.entitlements), I found the following configuration:

<key>com.apple.developer.in-app-payments</key>
<array/>

2.3 Technical Analysis

There is a common confusion here:

  • StoreKit (In-App Purchase): Used for selling virtual goods (e.g., memberships, game currency). Does not require special Entitlements permissions; just use the StoreKit framework directly.
  • Apple Pay (PassKit): Used for selling physical goods or services (e.g., e-commerce, ride-hailing). Must include the com.apple.developer.in-app-payments permission in Entitlements.

Conclusion: Since the project incorrectly retained the Apple Pay Entitlement permission, Xcode automatically linked the PassKit framework during the build, triggering the reviewer’s detection mechanism.

3. Solution

The core of the fix lies in removing unnecessary permission configurations and ensuring correct Release environment configuration.

Step 1: Remove Apple Pay Entitlement

Open the .entitlements files in your project (usually Debug and Release versions), find and delete the com.apple.developer.in-app-payments key-value pair.

Affected Files:

  • memento/mementoDebug.entitlements
  • memento/mementoRelease.entitlements

Step 2: Check Push Environment Configuration (Optional)

While checking Entitlements, it is recommended to also check the push notification configuration. The Release environment should ensure the use of the production environment.

mementoRelease.entitlements Example:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>aps-environment</key>
    <string>production</string>
    <key>com.apple.developer.applesignin</key>
    <array>
        <string>Default</string>
    </array>
</dict>
</plist>

Step 3: Xcode Project Configuration Check

Before rebuilding, please make a final confirmation in Xcode:

  1. Go to Target -> Signing & Capabilities.
  2. Ensure “Apple Pay” is not in the list.
  3. Ensure only used capabilities are retained, such as “In-App Purchase” (StoreKit), “Sign in with Apple”, “Push Notifications”, etc.

Step 4: Clean and Rebuild

  1. Execute Product -> Clean Build Folder (Cmd + Shift + K) in Xcode.
  2. Re-archive and upload.

4. Submission Advice

To ensure smooth approval, it is recommended to proactively explain the situation in the Review Notes when submitting a new version in App Store Connect.

Reference Text:

Dear Review Team,

Regarding the previous Guideline 2.1 issue:

This app uses StoreKit 2 for in-app subscriptions (digital goods) and does NOT use Apple Pay.
We have removed the 'com.apple.developer.in-app-payments' entitlement from the project configuration.
The app binary should no longer include the PassKit framework references related to Apple Pay.

Subscription features can be found in: Settings -> Subscription.

5. Summary

This rejection experience reminds us that managing Entitlements files is crucial in iOS development. Do not request unused permissions, as this not only increases app size and introduces unnecessary framework dependencies but also raises questions from the review team.

Checklist:

  • Confirmed no PassKit code is used.
  • Removed com.apple.developer.in-app-payments from entitlements.
  • Confirmed no Apple Pay in Signing & Capabilities.
  • Rebuilt after Clean Build.