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

PKPassLibrary调用removePass无法删除Apple Wallet支付卡问题求助

Apple In-App Provisioning 支付卡删除失效问题解决方案

可能的原因

  • 支付卡(PKPaymentPass)删除权限约束:苹果对第三方App删除支付类票卡有严格权限限制,并非拥有加卡权限就默认拥有删卡权限,且不支持静默删除,必须触发用户确认弹窗才能完成操作
  • 参数错误:你当前序列化获取到的passTypeIdentifier为系统通用值paymentpass.com.apple,并非你在苹果开发者后台配置的、和App绑定的专属支付卡标识,导致查询票卡时返回空对象,删除自然无效
  • 代码缺少校验和适配:你使用的已废弃的无回调removePass方法无法获取错误信息,iOS15.4+系统针对支付卡删除已推出带结果回调的新API,低版本API在新系统上对支付卡的操作会失效
  • 缺少权限申请:iOS16及以上系统要求App提前向用户申请PKPassLibrary的读写权限,未授权的情况下删除操作会被系统静默拦截
  • 操作场景不符合要求:后台调用删除方法、删除Apple Watch远程票卡未切换对应设备实例,都会导致操作无响应

解决方案

1. 优化代码增加校验和错误监听

替换现有无校验的删除逻辑,优先使用带回调的API获取具体错误信息:

@objc
func removePass(_ data: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
    let passTypeIdentifier = data["passTypeIdentifier"] as! String
    let serialNumber = data["serialNumber"] as! String
    
    // 先判空,避免查询到空对象
    guard let passToRemove = passLib.pass(withPassTypeIdentifier: passTypeIdentifier, serialNumber: serialNumber) else {
        reject("PASS_NOT_FOUND", "未查询到对应票卡", nil)
        return
    }
    // 确认票卡确实在Wallet中
    guard passLib.containsPass(passToRemove) else {
        reject("PASS_NOT_EXIST", "票卡不在Wallet中", nil)
        return
    }
    // iOS16+ 先确认已有读写权限
    if #available(iOS 16.0, *) {
        let status = PKPassLibrary.authorizationStatus(for: .addSilently)
        guard status == .authorized else {
            PKPassLibrary.requestAuthorization(for: .addSilently) { [weak self] status in
                if status == .authorized {
                    self?.executeRemovePass(pass: passToRemove, resolve: resolve, reject: reject)
                } else {
                    reject("PERMISSION_DENIED", "用户未授予Wallet操作权限", nil)
                }
            }
            return
        }
    }
    executeRemovePass(pass: passToRemove, resolve: resolve, reject: reject)
}

private func executeRemovePass(pass: PKPass, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
    if #available(iOS 15.4, *) {
        passLib.remove(pass) { success, error in
            if let error = error {
                reject("REMOVE_FAILED", "删除失败: \(error.localizedDescription)", error)
                return
            }
            resolve(success)
        }
    } else {
        passLib.removePass(pass)
        // 低版本手动校验删除结果
        let stillExists = passLib.containsPass(pass)
        resolve(!stillExists)
    }
}

2. 修正传参

遍历passLib.passes()获取所有关联票卡,打印每一张支付卡的真实passTypeIdentifier和serialNumber,使用和你的App绑定的专属支付卡标识作为入参,不要使用系统通用的paymentpass.com.apple。

3. 确认权限配置

登录苹果开发者后台检查你的In-App Provisioning权限配置,确认已开通支付卡删除权限,若未开通需要重新向苹果提交权限申请。

4. 适配不同设备的删除操作

如果需要删除Apple Watch上的远程票卡,需要先通过PKPassLibrary.remotePasses(for:)获取对应设备的票卡实例再执行删除操作,不能直接用本地iPhone的票卡对象删除关联的Watch端票卡。


内容的提问来源于stack exchange,提问作者Lukáš Šálek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:54:05