PAYATHON 2026

如何在原生 iOS app 中打开“Add Payment Method”设置?

支付阿杰

结论

普通的原生 iOS App 无法直接跳转到:

Settings -> Apple ID -> Payment & Shipping -> Add Payment Method

iOS 没有向第三方 App 开放这个设置页面的 URL Scheme、Universal Link 或系统 API。使用 App-Prefs:、prefs: 等未公开地址无法保证兼容性,还可能引发 App Store 审核风险。

可以采用以下方式:

  1. 在 App 内提供操作指引,让用户手动进入该页面。
  2. 如果需要处理 App 内购付款失败,应使用 StoreKit 提供的系统流程,不要跳转到 Apple ID 的付款方式设置。
  3. 如果需要有限的跳转能力,只能打开当前 App 自己的系统设置页,无法继续定位到 Apple ID 的付款设置。

为什么不能直接打开

Apple 限制了 App 可以跳转到的系统设置页面。公开 API UIApplication.openSettingsURLString 只能打开当前 App 的设置页,例如通知、定位或相机权限设置,不能进入 Apple ID、付款与配送或新增付款方式页面。

下面的代码是受支持的,但它打开的是当前 App 的设置页:

guard let url = URL(string: UIApplication.openSettingsURLString),
      UIApplication.shared.canOpenURL(url) else {
    return
}

UIApplication.shared.open(url)

它不会打开:

Apple ID -> Payment & Shipping -> Add Payment Method

网上有时会看到类似写法:

URL(string: "App-Prefs:root=...")

这些路径不是供第三方 App 使用的公开接口,可能随系统版本变化,也可能完全失效,不适合作为正式功能使用。

推荐解决方案

方案一:提供手动操作指引

如果用户确实需要修改 Apple ID 付款方式,可以在点击按钮后显示以下说明:

请打开“设置”,点击顶部的 Apple ID,
选择“付款与配送”,然后添加或修改付款方式。

Swift 示例:

import UIKit

func showPaymentMethodInstructions(from viewController: UIViewController) {
    let alert = UIAlertController(
        title: "修改付款方式",
        message: """
        请打开“设置”,点击顶部的 Apple ID,
        进入“付款与配送”,然后添加或修改付款方式。
        """,
        preferredStyle: .alert
    )

    alert.addAction(UIAlertAction(title: "知道了", style: .default))
    viewController.present(alert, animated: true)
}

还可以提供“复制操作路径”按钮,但不要让用户误以为“打开设置”能够直达付款页面。

方案二:针对 App 内购使用 StoreKit

如果用户遇到购买失败、订阅续费失败或需要更新付款信息,应优先通过 StoreKit 发起购买。付款验证、Apple ID 登录和必要的付款问题提示都由系统处理。

以 StoreKit 2 为例:

import StoreKit

func purchase(_ product: Product) async throws {
    let result = try await product.purchase()

    switch result {
    case .success(let verification):
        let transaction = try checkVerified(verification)
        await transaction.finish()

    case .pending:
        // 交易等待批准或需要进一步处理
        break

    case .userCancelled:
        // 用户取消购买
        break

    @unknown default:
        break
    }
}

func checkVerified<T>(
    _ result: VerificationResult<T>
) throws -> T {
    switch result {
    case .verified(let value):
        return value
    case .unverified:
        throw PurchaseError.failedVerification
    }
}

enum PurchaseError: Error {
    case failedVerification
}

交易失败并不一定表示用户缺少付款方式,也可能与网络、购买限制、家庭共享、账户状态或交易待处理有关。应根据 StoreKit 返回的状态分别处理,并向用户显示中性的提示。

方案三:打开订阅管理页面

如果用户需要管理 App Store 订阅,而不是新增 Apple ID 付款方式,可以使用 StoreKit 提供的订阅管理界面。具体 API 取决于 App 的部署版本和 StoreKit 集成方式,例如 StoreKit 2 的 AppStore.showManageSubscriptions(in:)。

该功能仅用于订阅管理,不能替代“Add Payment Method”页面。

注意事项

  • UIApplication.openSettingsURLString 只能打开当前 App 的设置页。
  • 不要依赖 prefs:、App-Prefs: 或自行猜测的系统设置路径。
  • 不要尝试通过私有 API 进入 Apple ID 设置。
  • Apple ID 菜单的名称和层级可能因 iOS 版本、地区、账户类型或设备管理策略而不同,操作文案不宜写死过多界面细节。
  • 使用受管理的 Apple ID、开启家长控制或设备由组织管理时,付款设置可能不可用。
  • 如果需要解决 App 内购问题,应由 StoreKit 处理购买和错误状态,不要自行判断或管理 Apple ID 的付款信息。

实现前应先明确业务目的。一般的账户帮助场景可以提供操作指引;App 内购场景应接入 StoreKit;订阅场景应使用系统订阅管理界面。第三方 App 无法可靠、合规地直接打开“Add Payment Method”设置页。

备注:内容仅供参考。