You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PKPassLibrary无法返回卡片求助:Swift添加借记卡至Apple Wallet后查询为空

解决Apple Wallet获取支付卡片为空的问题

我来帮你排查下为什么调用PKPassLibrary获取支付卡片时返回空数组的问题,这通常和权限配置、卡片状态或者测试环境有关,一步步拆解来看:

1. 先确认权限是否到位

这是最常见的原因,Apple对Wallet的访问权限管控很严:

  • 首先,你需要在Xcode的Signing & Capabilities里添加Apple Pay capability,同时配置好对应的Merchant ID和支持的Payment Networks(比如Visa、MasterCard这些)。
  • 然后在Info.plist里添加NSWalletUsageDescription键,填写一段用户能看懂的说明,解释你的App为什么需要访问Wallet(比如“为了管理你添加的借记卡”)。
  • 关键一步:必须先请求用户授权!调用PKPassLibrary.authorizePaymentPassProvisioning获取权限后,才能正常访问钱包里的卡片,没授权的话API会直接返回空。

2. 搞懂两个API的区别,别查错地方

你用的两个API对应不同类型的卡片:

  • passes().compactMap { $0.paymentPass }:获取的是已经激活并添加到本地Wallet的实体/虚拟卡片,也就是用户打开Wallet能直接看到的那些。
  • remotePaymentPasses():获取的是通过你的App远程配置但还没激活的卡片,这类卡片用户还没完成激活流程,不会在Wallet主界面显示。

所以如果你的卡片是刚添加的,先确认它到底属于哪一类——要是已经在Wallet里能看到,那应该查第一个API的问题;要是还在配置流程中,才会出现在第二个列表里。

3. 检查卡片添加流程是否完整

当你程序化添加借记卡时,要确保整个流程走完了:

  • 如果用PKAddPaymentPassViewController添加卡片,一定要实现代理方法addPaymentPassViewController(_:didAddPaymentPass:error:),确认卡片确实添加成功,并且你的后端已经完成了卡片的激活同步——只有激活后的卡片才会出现在本地卡片列表里。
  • 如果是远程配置卡片,调用PKPassLibrary.addRemotePaymentPass(_:)后,要确保卡片的状态被正确设置为active或provisioned,不然remotePaymentPasses也会是空的。

4. 测试环境的坑要避开

  • 模拟器完全不支持Apple Wallet的支付卡片功能!必须用真实的iOS设备测试,而且设备要登录有效的Apple ID,绑定过支持Apple Pay的卡片(或者你用的测试卡片是Apple认可的测试卡)。
  • 确保你的测试设备系统版本支持你用的API,比如一些新的Wallet API只在iOS 14+可用,要是设备系统太旧也会出问题。

给你调整后的代码示例

先请求权限,再获取卡片,这样能避免权限问题导致的空数组:

import PassKit

func fetchWalletPaymentCards() {
    let passLibrary = PKPassLibrary()
    
    // 先请求用户授权访问Wallet
    PKPassLibrary.authorizePaymentPassProvisioning { [weak self] isAuthorized, error in
        guard isAuthorized else {
            print("用户未授权访问Wallet,错误信息:\(error?.localizedDescription ?? "未知错误")")
            return
        }
        
        // 授权成功后获取本地已激活的支付卡片
        let localPaymentPasses = passLibrary.passes().compactMap { $0.paymentPass }
        print("本地已激活的支付卡片数量:\(localPaymentPasses.count)")
        
        // 获取远程配置未激活的卡片
        let remotePaymentPasses = passLibrary.remotePaymentPasses()
        print("远程配置的未激活卡片数量:\(remotePaymentPasses.count)")
        
        // 这里可以遍历卡片,检查你要找的借记卡是否存在
        for pass in localPaymentPasses {
            print("卡片pan后缀:\(pass.primaryAccountSuffix),卡组织:\(pass.network.rawValue)")
        }
    }
}

如果做完这些还是为空,建议再检查:

  • 打开Wallet App,确认你的借记卡真的已经成功添加进去了
  • 你的App的Bundle ID和Entitlement配置里的完全一致
  • 测试用的借记卡是否属于Apple Pay支持的卡组织,测试环境的卡片是否有效

内容的提问来源于stack exchange,提问作者Khagesh Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:57:44